Skip to content

Commit 385a5dc

Browse files
Joelgranadosmcgrof
authored andcommitted
netfilter: Update to register_net_sysctl_sz
Move from register_net_sysctl to register_net_sysctl_sz for all the netfilter related files. Do this while making sure to mirror the NULL assignments with a table_size of zero for the unprivileged users. We need to move to the new function in preparation for when we change SIZE_MAX to ARRAY_SIZE() in the register_net_sysctl macro. Failing to do so would erroneously allow ARRAY_SIZE() to be called on a pointer. We hold off the SIZE_MAX to ARRAY_SIZE change until we have migrated all the relevant net sysctl registering functions to register_net_sysctl_sz in subsequent commits. Acked-by: Julian Anastasov <[email protected]> Signed-off-by: Joel Granados <[email protected]> Signed-off-by: Luis Chamberlain <[email protected]>
1 parent 7737e46 commit 385a5dc

File tree

7 files changed

+31
-14
lines changed

7 files changed

+31
-14
lines changed

net/bridge/br_netfilter_hooks.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1135,7 +1135,8 @@ static int br_netfilter_sysctl_init_net(struct net *net)
11351135

11361136
br_netfilter_sysctl_default(brnet);
11371137

1138-
brnet->ctl_hdr = register_net_sysctl(net, "net/bridge", table);
1138+
brnet->ctl_hdr = register_net_sysctl_sz(net, "net/bridge", table,
1139+
ARRAY_SIZE(brnf_table));
11391140
if (!brnet->ctl_hdr) {
11401141
if (!net_eq(net, &init_net))
11411142
kfree(table);

net/ipv6/netfilter/nf_conntrack_reasm.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ static int nf_ct_frag6_sysctl_register(struct net *net)
8787
table[2].data = &nf_frag->fqdir->high_thresh;
8888
table[2].extra1 = &nf_frag->fqdir->low_thresh;
8989

90-
hdr = register_net_sysctl(net, "net/netfilter", table);
90+
hdr = register_net_sysctl_sz(net, "net/netfilter", table,
91+
ARRAY_SIZE(nf_ct_frag6_sysctl_table));
9192
if (hdr == NULL)
9293
goto err_reg;
9394

net/netfilter/ipvs/ip_vs_ctl.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4266,6 +4266,7 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs)
42664266
struct net *net = ipvs->net;
42674267
struct ctl_table *tbl;
42684268
int idx, ret;
4269+
size_t ctl_table_size = ARRAY_SIZE(vs_vars);
42694270

42704271
atomic_set(&ipvs->dropentry, 0);
42714272
spin_lock_init(&ipvs->dropentry_lock);
@@ -4282,8 +4283,10 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs)
42824283
return -ENOMEM;
42834284

42844285
/* Don't export sysctls to unprivileged users */
4285-
if (net->user_ns != &init_user_ns)
4286+
if (net->user_ns != &init_user_ns) {
42864287
tbl[0].procname = NULL;
4288+
ctl_table_size = 0;
4289+
}
42874290
} else
42884291
tbl = vs_vars;
42894292
/* Initialize sysctl defaults */
@@ -4353,7 +4356,8 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs)
43534356
#endif
43544357

43554358
ret = -ENOMEM;
4356-
ipvs->sysctl_hdr = register_net_sysctl(net, "net/ipv4/vs", tbl);
4359+
ipvs->sysctl_hdr = register_net_sysctl_sz(net, "net/ipv4/vs", tbl,
4360+
ctl_table_size);
43574361
if (!ipvs->sysctl_hdr)
43584362
goto err;
43594363
ipvs->sysctl_tbl = tbl;

net/netfilter/ipvs/ip_vs_lblc.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,7 @@ static struct ip_vs_scheduler ip_vs_lblc_scheduler = {
550550
static int __net_init __ip_vs_lblc_init(struct net *net)
551551
{
552552
struct netns_ipvs *ipvs = net_ipvs(net);
553+
size_t vars_table_size = ARRAY_SIZE(vs_vars_table);
553554

554555
if (!ipvs)
555556
return -ENOENT;
@@ -562,16 +563,19 @@ static int __net_init __ip_vs_lblc_init(struct net *net)
562563
return -ENOMEM;
563564

564565
/* Don't export sysctls to unprivileged users */
565-
if (net->user_ns != &init_user_ns)
566+
if (net->user_ns != &init_user_ns) {
566567
ipvs->lblc_ctl_table[0].procname = NULL;
568+
vars_table_size = 0;
569+
}
567570

568571
} else
569572
ipvs->lblc_ctl_table = vs_vars_table;
570573
ipvs->sysctl_lblc_expiration = DEFAULT_EXPIRATION;
571574
ipvs->lblc_ctl_table[0].data = &ipvs->sysctl_lblc_expiration;
572575

573-
ipvs->lblc_ctl_header =
574-
register_net_sysctl(net, "net/ipv4/vs", ipvs->lblc_ctl_table);
576+
ipvs->lblc_ctl_header = register_net_sysctl_sz(net, "net/ipv4/vs",
577+
ipvs->lblc_ctl_table,
578+
vars_table_size);
575579
if (!ipvs->lblc_ctl_header) {
576580
if (!net_eq(net, &init_net))
577581
kfree(ipvs->lblc_ctl_table);

net/netfilter/ipvs/ip_vs_lblcr.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,7 @@ static struct ip_vs_scheduler ip_vs_lblcr_scheduler =
736736
static int __net_init __ip_vs_lblcr_init(struct net *net)
737737
{
738738
struct netns_ipvs *ipvs = net_ipvs(net);
739+
size_t vars_table_size = ARRAY_SIZE(vs_vars_table);
739740

740741
if (!ipvs)
741742
return -ENOENT;
@@ -748,15 +749,18 @@ static int __net_init __ip_vs_lblcr_init(struct net *net)
748749
return -ENOMEM;
749750

750751
/* Don't export sysctls to unprivileged users */
751-
if (net->user_ns != &init_user_ns)
752+
if (net->user_ns != &init_user_ns) {
752753
ipvs->lblcr_ctl_table[0].procname = NULL;
754+
vars_table_size = 0;
755+
}
753756
} else
754757
ipvs->lblcr_ctl_table = vs_vars_table;
755758
ipvs->sysctl_lblcr_expiration = DEFAULT_EXPIRATION;
756759
ipvs->lblcr_ctl_table[0].data = &ipvs->sysctl_lblcr_expiration;
757760

758-
ipvs->lblcr_ctl_header =
759-
register_net_sysctl(net, "net/ipv4/vs", ipvs->lblcr_ctl_table);
761+
ipvs->lblcr_ctl_header = register_net_sysctl_sz(net, "net/ipv4/vs",
762+
ipvs->lblcr_ctl_table,
763+
vars_table_size);
760764
if (!ipvs->lblcr_ctl_header) {
761765
if (!net_eq(net, &init_net))
762766
kfree(ipvs->lblcr_ctl_table);

net/netfilter/nf_conntrack_standalone.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1106,7 +1106,9 @@ static int nf_conntrack_standalone_init_sysctl(struct net *net)
11061106
table[NF_SYSCTL_CT_BUCKETS].mode = 0444;
11071107
}
11081108

1109-
cnet->sysctl_header = register_net_sysctl(net, "net/netfilter", table);
1109+
cnet->sysctl_header = register_net_sysctl_sz(net, "net/netfilter",
1110+
table,
1111+
ARRAY_SIZE(nf_ct_sysctl_table));
11101112
if (!cnet->sysctl_header)
11111113
goto out_unregister_netfilter;
11121114

net/netfilter/nf_log.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -487,9 +487,10 @@ static int netfilter_log_sysctl_init(struct net *net)
487487
for (i = NFPROTO_UNSPEC; i < NFPROTO_NUMPROTO; i++)
488488
table[i].extra2 = net;
489489

490-
net->nf.nf_log_dir_header = register_net_sysctl(net,
491-
"net/netfilter/nf_log",
492-
table);
490+
net->nf.nf_log_dir_header = register_net_sysctl_sz(net,
491+
"net/netfilter/nf_log",
492+
table,
493+
ARRAY_SIZE(nf_log_sysctl_table));
493494
if (!net->nf.nf_log_dir_header)
494495
goto err_reg;
495496

0 commit comments

Comments
 (0)