[NETFILTER] ctnetlink: Fix refcount leak ip_conntrack/nat_proto

Remove proto == NULL checking since ip_conntrack_[nat_]proto_find_get
always returns a valid pointer.

Fix missing ip_conntrack_proto_put in some paths.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Harald Welte <laforge@netfilter.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by Pablo Neira Ayuso and committed by David S. Miller 00cb277a 0ff60a45

+12 -12
+12 -12
net/ipv4/netfilter/ip_conntrack_netlink.c
··· 59 59 60 60 NFA_PUT(skb, CTA_PROTO_NUM, sizeof(u_int8_t), &tuple->dst.protonum); 61 61 62 + /* If no protocol helper is found, this function will return the 63 + * generic protocol helper, so proto won't *ever* be NULL */ 62 64 proto = ip_conntrack_proto_find_get(tuple->dst.protonum); 63 - if (likely(proto && proto->tuple_to_nfattr)) { 65 + if (likely(proto->tuple_to_nfattr)) 64 66 ret = proto->tuple_to_nfattr(skb, tuple); 65 - ip_conntrack_proto_put(proto); 66 - } 67 + 68 + ip_conntrack_proto_put(proto); 67 69 68 70 return ret; 69 71 ··· 130 128 131 129 struct nfattr *nest_proto; 132 130 int ret; 133 - 134 - if (!proto || !proto->to_nfattr) 131 + 132 + if (!proto->to_nfattr) { 133 + ip_conntrack_proto_put(proto); 135 134 return 0; 135 + } 136 136 137 137 nest_proto = NFA_NEST(skb, CTA_PROTOINFO); 138 138 ··· 531 527 532 528 proto = ip_conntrack_proto_find_get(tuple->dst.protonum); 533 529 534 - if (likely(proto && proto->nfattr_to_tuple)) { 530 + if (likely(proto->nfattr_to_tuple)) 535 531 ret = proto->nfattr_to_tuple(tb, tuple); 536 - ip_conntrack_proto_put(proto); 537 - } 532 + 533 + ip_conntrack_proto_put(proto); 538 534 539 535 return ret; 540 536 } ··· 600 596 return -EINVAL; 601 597 602 598 npt = ip_nat_proto_find_get(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum); 603 - if (!npt) 604 - return 0; 605 599 606 600 if (!npt->nfattr_to_range) { 607 601 ip_nat_proto_put(npt); ··· 959 957 nfattr_parse_nested(tb, CTA_PROTOINFO_MAX, attr); 960 958 961 959 proto = ip_conntrack_proto_find_get(npt); 962 - if (!proto) 963 - return -EINVAL; 964 960 965 961 if (proto->from_nfattr) 966 962 err = proto->from_nfattr(tb, ct);