return EEXIST instead of EINVAL for existing nat'ed conntracks
Subsystems (2)
Pablo Neira Ayuso
maintainerPATCH 1/1 return EEXIST instead of EINVAL for existing nat'ed conntracks
ctnetlink must return EEXIST for existing nat'ed conntracks instead of EINVAL. Only return EINVAL if we try to update a conntrack with NAT handlings (that is not allowed).
Decadence:libnetfilter_conntrack/utils# ./conntrack_create_nat
TEST: create conntrack (0)(Success) Decadence:libnetfilter_conntrack/utils# ./conntrack_create_nat
TEST: create conntrack (-1)(Invalid argument)
Signature · 2 lines
"Será preciso viajar a través de los ojos de los idiotas" -- Poeta en Nueva York -- Federico García Lorca.
[CTNETLINK] return EEXIST instead of EINVAL for existing nat'ed conntracks
ctnetlink must return EEXIST for existing nat'ed conntracks instead of EINVAL. Only return EINVAL if we try to update a conntrack with NAT handlings (that is not allowed).
Decadence:libnetfilter_conntrack/utils# ./conntrack_create_nat
TEST: create conntrack (0)(Success) Decadence:libnetfilter_conntrack/utils# ./conntrack_create_nat
TEST: create conntrack (-1)(Invalid argument)
net/netfilter/nf_conntrack_netlink.c +9 -8
@@ -1036,17 +1036,18 @@ ctnetlink_new_conntrack(struct sock *ctn }/* implicit 'else' */ -/* we only allow nat config for new conntracks */ -if (cda[CTA_NAT_SRC -1 ] || cda[CTA_NAT_DST -1 ]) { - err = -EINVAL ; - goto out_unlock; - } -/* We manipulate the conntrack inside the global conntrack table lock, * so there's no need to increase the refcount */ err = -EEXIST ; -if (!(nlh->nlmsg_flags &NLM_F_EXCL )) - err =ctnetlink_change_conntrack (nf_ct_tuplehash_to_ctrack (h), cda); +if (!(nlh->nlmsg_flags &NLM_F_EXCL )) { +/* we only allow nat config for new conntracks */ +if (cda[CTA_NAT_SRC -1 ] || cda[CTA_NAT_DST -1 ]) { + err = -EINVAL ; + goto out_unlock; + } + err =ctnetlink_change_conntrack (nf_ct_tuplehash_to_ctrack (h), + cda); + } out_unlock:write_unlock_bh (&nf_conntrack_lock);
Patrick McHardy
AppliedQuoted 3 lines · Pablo Neira Ayuso
ctnetlink must return EEXIST for existing nat'ed conntracks instead of EINVAL. Only return EINVAL if we try to update a conntrack with NAT handlings (that is not allowed).
Applied, thanks Pablo.