openvswitch: Fix template leak in error cases.
Commit 5b48bb8506c5 ("openvswitch: Fix helper reference leak") fixed a
reference leak on helper objects, but inadvertently introduced a leak on
the ct template.
Previously, ct_info.ct->general.use was initialized to 0 by
nf_ct_tmpl_alloc() and only incremented when ovs_ct_copy_action()
returned successful. If an error occurred while adding the helper or
adding the action to the actions buffer, the __ovs_ct_free_action()
cleanup would use nf_ct_put() to free the entry; However, this relies on
atomic_dec_and_test(ct_info.ct->general.use). This reference must be
incremented first, or nf_ct_put() will never free it.
Fix the issue by acquiring a reference to the template immediately after
allocation.
Fixes: cae3a26275
("openvswitch: Allow attaching helpers to ct action")
Fixes: 5b48bb8506c5 ("openvswitch: Fix helper reference leak")
Signed-off-by: Joe Stringer <joe@ovn.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3538a5c8ff
commit
90c7afc96c
|
@ -698,6 +698,10 @@ int ovs_ct_copy_action(struct net *net, const struct nlattr *attr,
|
|||
OVS_NLERR(log, "Failed to allocate conntrack template");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
__set_bit(IPS_CONFIRMED_BIT, &ct_info.ct->status);
|
||||
nf_conntrack_get(&ct_info.ct->ct_general);
|
||||
|
||||
if (helper) {
|
||||
err = ovs_ct_add_helper(&ct_info, helper, key, log);
|
||||
if (err)
|
||||
|
@ -709,8 +713,6 @@ int ovs_ct_copy_action(struct net *net, const struct nlattr *attr,
|
|||
if (err)
|
||||
goto err_free_ct;
|
||||
|
||||
__set_bit(IPS_CONFIRMED_BIT, &ct_info.ct->status);
|
||||
nf_conntrack_get(&ct_info.ct->ct_general);
|
||||
return 0;
|
||||
err_free_ct:
|
||||
__ovs_ct_free_action(&ct_info);
|
||||
|
|
Loading…
Reference in New Issue