lvxiafei <xiafei_xupt@xxxxxxx> wrote: > > in any case. > > > > Also: > > > > - if (nf_conntrack_max && unlikely(ct_count > nf_conntrack_max)) { > > + if (net->ct.sysctl_max && unlikely(ct_count > min(nf_conntrack_max, net->ct.sysctl_max))) { > > > > > > ... can't be right, this allows a 0 setting in the netns. > > So, setting 0 in non-init-net must be disallowed. > > Yes, setting 0 in non-init-net must be disallowed. > > Should be used: > unsigned int net_ct_sysctl_max = max(min(nf_conntrack_max, net->ct.sysctl_max), 0); > if (nf_conntrack_max && unlikely(ct_count > net_ct_sysctl_max)) { That would work. Alternative, probably preferrable, is to do something like this: @@ -615,10 +615,10 @@ enum nf_ct_sysctl_index { static struct ctl_table nf_ct_sysctl_table[] = { - .proc_handler = proc_dointvec, + .proc_handler = proc_douintvec_minmax, + .extra1 = SYSCTL_ZERO, /* 0 == no limit */ }, [NF_SYSCTL_CT_COUNT] = { .procname = "nf_conntrack_count", @@ -1081,9 +1082,11 @@ static int nf_conntrack_standalone_init_sysctl(struct net *net) /* Don't allow non-init_net ns to alter global sysctls */ if (!net_eq(&init_net, net)) { table[NF_SYSCTL_CT_EXPECT_MAX].mode = 0444; table[NF_SYSCTL_CT_BUCKETS].mode = 0444; + + /* 0 means no limit, only allowed in init_net */ + table[NF_SYSCTL_CT_MAX].extra1 = SYSCTL_ONE; } That will make setting a 0 value illegal for non-init net case: sysctl net.netfilter.nf_conntrack_max=0 sysctl: setting key "net.netfilter.nf_conntrack_max": Invalid argument > min(nf_conntrack_max, net->ct.sysctl_max) is the upper limit of ct_count > At the same time, when net->ct.sysctl_max == 0, the original intention is no limit, > but it can be limited by nf_conntrack_max in different netns. Sounds good to me.