hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/net/openvswitch/datapath.c
....@@ -933,6 +933,7 @@
933933 struct sw_flow_mask mask;
934934 struct sk_buff *reply;
935935 struct datapath *dp;
936
+ struct sw_flow_key *key;
936937 struct sw_flow_actions *acts;
937938 struct sw_flow_match match;
938939 u32 ufid_flags = ovs_nla_get_ufid_flags(a[OVS_FLOW_ATTR_UFID_FLAGS]);
....@@ -960,30 +961,32 @@
960961 }
961962
962963 /* Extract key. */
963
- ovs_match_init(&match, &new_flow->key, false, &mask);
964
+ key = kzalloc(sizeof(*key), GFP_KERNEL);
965
+ if (!key) {
966
+ error = -ENOMEM;
967
+ goto err_kfree_flow;
968
+ }
969
+
970
+ ovs_match_init(&match, key, false, &mask);
964971 error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],
965972 a[OVS_FLOW_ATTR_MASK], log);
966973 if (error)
967
- goto err_kfree_flow;
974
+ goto err_kfree_key;
975
+
976
+ ovs_flow_mask_key(&new_flow->key, key, true, &mask);
968977
969978 /* Extract flow identifier. */
970979 error = ovs_nla_get_identifier(&new_flow->id, a[OVS_FLOW_ATTR_UFID],
971
- &new_flow->key, log);
980
+ key, log);
972981 if (error)
973
- goto err_kfree_flow;
974
-
975
- /* unmasked key is needed to match when ufid is not used. */
976
- if (ovs_identifier_is_key(&new_flow->id))
977
- match.key = new_flow->id.unmasked_key;
978
-
979
- ovs_flow_mask_key(&new_flow->key, &new_flow->key, true, &mask);
982
+ goto err_kfree_key;
980983
981984 /* Validate actions. */
982985 error = ovs_nla_copy_actions(net, a[OVS_FLOW_ATTR_ACTIONS],
983986 &new_flow->key, &acts, log);
984987 if (error) {
985988 OVS_NLERR(log, "Flow actions may not be safe on all matching packets.");
986
- goto err_kfree_flow;
989
+ goto err_kfree_key;
987990 }
988991
989992 reply = ovs_flow_cmd_alloc_info(acts, &new_flow->id, info, false,
....@@ -1004,7 +1007,7 @@
10041007 if (ovs_identifier_is_ufid(&new_flow->id))
10051008 flow = ovs_flow_tbl_lookup_ufid(&dp->table, &new_flow->id);
10061009 if (!flow)
1007
- flow = ovs_flow_tbl_lookup(&dp->table, &new_flow->key);
1010
+ flow = ovs_flow_tbl_lookup(&dp->table, key);
10081011 if (likely(!flow)) {
10091012 rcu_assign_pointer(new_flow->sf_acts, acts);
10101013
....@@ -1074,6 +1077,8 @@
10741077
10751078 if (reply)
10761079 ovs_notify(&dp_flow_genl_family, reply, info);
1080
+
1081
+ kfree(key);
10771082 return 0;
10781083
10791084 err_unlock_ovs:
....@@ -1081,6 +1086,8 @@
10811086 kfree_skb(reply);
10821087 err_kfree_acts:
10831088 ovs_nla_free_flow_actions(acts);
1089
+err_kfree_key:
1090
+ kfree(key);
10841091 err_kfree_flow:
10851092 ovs_flow_free(new_flow, false);
10861093 error: