Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netfilter: cttimeout: fix dependency with l4protocol conntrack module

This patch introduces nf_conntrack_l4proto_find_get() and
nf_conntrack_l4proto_put() to fix module dependencies between
timeout objects and l4-protocol conntrack modules.

Thus, we make sure that the module cannot be removed if it is
used by any of the cttimeout objects.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>

+53 -25
+4
include/net/netfilter/nf_conntrack_l4proto.h
··· 118 118 extern struct nf_conntrack_l4proto * 119 119 __nf_ct_l4proto_find(u_int16_t l3proto, u_int8_t l4proto); 120 120 121 + extern struct nf_conntrack_l4proto * 122 + nf_ct_l4proto_find_get(u_int16_t l3proto, u_int8_t l4proto); 123 + extern void nf_ct_l4proto_put(struct nf_conntrack_l4proto *p); 124 + 121 125 /* Protocol registration. */ 122 126 extern int nf_conntrack_l4proto_register(struct nf_conntrack_l4proto *proto); 123 127 extern void nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *proto);
+1 -1
include/net/netfilter/nf_conntrack_timeout.h
··· 15 15 atomic_t refcnt; 16 16 char name[CTNL_TIMEOUT_NAME_MAX]; 17 17 __u16 l3num; 18 - __u8 l4num; 18 + struct nf_conntrack_l4proto *l4proto; 19 19 char data[0]; 20 20 }; 21 21
+21
net/netfilter/nf_conntrack_proto.c
··· 127 127 } 128 128 EXPORT_SYMBOL_GPL(nf_ct_l3proto_module_put); 129 129 130 + struct nf_conntrack_l4proto * 131 + nf_ct_l4proto_find_get(u_int16_t l3num, u_int8_t l4num) 132 + { 133 + struct nf_conntrack_l4proto *p; 134 + 135 + rcu_read_lock(); 136 + p = __nf_ct_l4proto_find(l3num, l4num); 137 + if (!try_module_get(p->me)) 138 + p = &nf_conntrack_l4proto_generic; 139 + rcu_read_unlock(); 140 + 141 + return p; 142 + } 143 + EXPORT_SYMBOL_GPL(nf_ct_l4proto_find_get); 144 + 145 + void nf_ct_l4proto_put(struct nf_conntrack_l4proto *p) 146 + { 147 + module_put(p->me); 148 + } 149 + EXPORT_SYMBOL_GPL(nf_ct_l4proto_put); 150 + 130 151 static int kill_l3proto(struct nf_conn *i, void *data) 131 152 { 132 153 return nf_ct_l3num(i) == ((struct nf_conntrack_l3proto *)data)->l3proto;
+4 -2
net/netfilter/xt_CT.c
··· 16 16 #include <net/netfilter/nf_conntrack.h> 17 17 #include <net/netfilter/nf_conntrack_helper.h> 18 18 #include <net/netfilter/nf_conntrack_ecache.h> 19 + #include <net/netfilter/nf_conntrack_l4proto.h> 19 20 #include <net/netfilter/nf_conntrack_timeout.h> 20 21 #include <net/netfilter/nf_conntrack_zones.h> 21 22 ··· 244 243 info->timeout, timeout->l3num); 245 244 goto err3; 246 245 } 247 - if (timeout->l4num != e->ip.proto) { 246 + if (timeout->l4proto->l4proto != e->ip.proto) { 248 247 ret = -EINVAL; 249 248 pr_info("Timeout policy `%s' can only be " 250 249 "used by L4 protocol number %d\n", 251 - info->timeout, timeout->l4num); 250 + info->timeout, 251 + timeout->l4proto->l4proto); 252 252 goto err3; 253 253 } 254 254 timeout_ext = nf_ct_timeout_ext_add(ct, timeout,