This commit comes at the tail end of a greater effort to remove the
empty elements at the end of the ctl_table arrays (sentinels) which
will reduce the overall build time size of the kernel and run time
memory bloat by ~64 bytes per sentinel (further information Link :
https://lore.kernel.org/all/ZO5Yx5JFogGi%2FcBo@bombadil.infradead.org/)
* Remove sentinel element from ctl_table structs.
* Remove the zeroing out of an array element (to make it look like a
  sentinel) in sysctl_route_net_init And ipv6_route_sysctl_init.
  This is not longer needed and is safe after commit 
c899710fe7f9
  ("networking: Update to register_net_sysctl_sz") added the array size
  to the ctl_table registration.
* Remove extra sentinel element in the declaration of devinet_vars.
* Removed the "-1" in __devinet_sysctl_register, sysctl_route_net_init,
  ipv6_sysctl_net_init and ipv4_sysctl_init_net that adjusted for having
  an extra empty element when looping over ctl_table arrays
* Replace the for loop stop condition in __addrconf_sysctl_register that
  tests for procname == NULL with one that depends on array size
* Removing the unprivileged user check in ipv6_route_sysctl_init is
  safe as it is replaced by calling ipv6_route_sysctl_table_size;
  introduced in commit 
c899710fe7f9 ("networking: Update to
  register_net_sysctl_sz")
* Use a table_size variable to keep the value of ARRAY_SIZE
Signed-off-by: Joel Granados <j.granados@samsung.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
 
 static struct devinet_sysctl_table {
        struct ctl_table_header *sysctl_header;
-       struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX];
+       struct ctl_table devinet_vars[IPV4_DEVCONF_MAX];
 } devinet_sysctl = {
        .devinet_vars = {
                DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding",
        if (!t)
                goto out;
 
-       for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
+       for (i = 0; i < ARRAY_SIZE(t->devinet_vars); i++) {
                t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
                t->devinet_vars[i].extra1 = p;
                t->devinet_vars[i].extra2 = net;
                .extra1         = &ipv4_devconf,
                .extra2         = &init_net,
        },
-       { },
 };
 #endif
 
 
                .proc_handler   = proc_dointvec_minmax,
                .extra1         = &dist_min,
        },
-       { }
 };
 
 /* secret interval has been deprecated */
                .mode           = 0644,
                .proc_handler   = proc_dointvec_jiffies,
        },
-       { }
 };
 
 static int __net_init ip4_frags_ns_ctl_register(struct net *net)
 
                .mode           = 0644,
                .proc_handler   = proc_dointvec,
        },
-       { }
 };
 
 static const char ipv4_route_flush_procname[] = "flush";
                .mode       = 0644,
                .proc_handler   = proc_dointvec,
        },
-       { },
 };
 
 static __net_init int sysctl_route_net_init(struct net *net)
 
                /* Don't export non-whitelisted sysctls to unprivileged users */
                if (net->user_ns != &init_user_ns) {
-                       if (tbl[0].procname != ipv4_route_flush_procname) {
-                               tbl[0].procname = NULL;
+                       if (tbl[0].procname != ipv4_route_flush_procname)
                                table_size = 0;
-                       }
                }
 
                /* Update the variables to point into the current struct net
                 * except for the first element flush
                 */
-               for (i = 1; i < ARRAY_SIZE(ipv4_route_netns_table) - 1; i++)
+               for (i = 1; i < table_size; i++)
                        tbl[i].data += (void *)net - (void *)&init_net;
        }
        tbl[0].extra1 = net;
 
                .extra1         = &sysctl_fib_sync_mem_min,
                .extra2         = &sysctl_fib_sync_mem_max,
        },
-       { }
 };
 
 static struct ctl_table ipv4_net_table[] = {
                .proc_handler   = proc_dou8vec_minmax,
                .extra1         = SYSCTL_ONE,
        },
-       { }
 };
 
 static __net_init int ipv4_sysctl_init_net(struct net *net)
 {
+       size_t table_size = ARRAY_SIZE(ipv4_net_table);
        struct ctl_table *table;
 
        table = ipv4_net_table;
                if (!table)
                        goto err_alloc;
 
-               for (i = 0; i < ARRAY_SIZE(ipv4_net_table) - 1; i++) {
+               for (i = 0; i < table_size; i++) {
                        if (table[i].data) {
                                /* Update the variables to point into
                                 * the current struct net
        }
 
        net->ipv4.ipv4_hdr = register_net_sysctl_sz(net, "net/ipv4", table,
-                                                   ARRAY_SIZE(ipv4_net_table));
+                                                   table_size);
        if (!net->ipv4.ipv4_hdr)
                goto err_reg;
 
 
                .mode           = 0644,
                .proc_handler   = proc_dointvec,
        },
-       { }
 };
 
 static __net_init int xfrm4_net_sysctl_init(struct net *net)
 
                .extra1         = SYSCTL_ZERO,
                .extra2         = SYSCTL_TWO,
        },
-       {
-               /* sentinel */
-       }
 };
 
 static int __addrconf_sysctl_register(struct net *net, char *dev_name,
                struct inet6_dev *idev, struct ipv6_devconf *p)
 {
+       size_t table_size = ARRAY_SIZE(addrconf_sysctl);
        int i, ifindex;
        struct ctl_table *table;
        char path[sizeof("net/ipv6/conf/") + IFNAMSIZ];
        if (!table)
                goto out;
 
-       for (i = 0; table[i].data; i++) {
+       for (i = 0; i < table_size; i++) {
                table[i].data += (char *)p - (char *)&ipv6_devconf;
                /* If one of these is already set, then it is not safe to
                 * overwrite either of them: this makes proc_dointvec_minmax
        snprintf(path, sizeof(path), "net/ipv6/conf/%s", dev_name);
 
        p->sysctl_header = register_net_sysctl_sz(net, path, table,
-                                                 ARRAY_SIZE(addrconf_sysctl));
+                                                 table_size);
        if (!p->sysctl_header)
                goto free;
 
 
                .extra1         = SYSCTL_ZERO,
                .extra2         = SYSCTL_ONE,
        },
-       { },
 };
 
 struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net)
 
                .mode           = 0644,
                .proc_handler   = proc_dointvec_jiffies,
        },
-       { }
 };
 
 /* secret interval has been deprecated */
                .mode           = 0644,
                .proc_handler   = proc_dointvec_jiffies,
        },
-       { }
 };
 
 static int __net_init ip6_frags_ns_sysctl_register(struct net *net)
 
                .extra1         =       SYSCTL_ZERO,
                .extra2         =       SYSCTL_ONE,
        },
-       { }
 };
 
 struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net)
                table[8].data = &net->ipv6.sysctl.ip6_rt_min_advmss;
                table[9].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
                table[10].data = &net->ipv6.sysctl.skip_notify_on_dev_down;
-
-               /* Don't export sysctls to unprivileged users */
-               if (net->user_ns != &init_user_ns)
-                       table[1].procname = NULL;
        }
 
        return table;
 
                .proc_handler   = proc_doulongvec_minmax,
                .extra2         = &ioam6_id_wide_max,
        },
-       { }
 };
 
 static struct ctl_table ipv6_rotable[] = {
                .proc_handler   = proc_dointvec,
        },
 #endif /* CONFIG_NETLABEL */
-       { }
 };
 
 static int __net_init ipv6_sysctl_net_init(struct net *net)
 {
+       size_t table_size = ARRAY_SIZE(ipv6_table_template);
        struct ctl_table *ipv6_table;
        struct ctl_table *ipv6_route_table;
        struct ctl_table *ipv6_icmp_table;
        if (!ipv6_table)
                goto out;
        /* Update the variables to point into the current struct net */
-       for (i = 0; i < ARRAY_SIZE(ipv6_table_template) - 1; i++)
+       for (i = 0; i < table_size; i++)
                ipv6_table[i].data += (void *)net - (void *)&init_net;
 
        ipv6_route_table = ipv6_route_sysctl_init(net);
                goto out_ipv6_route_table;
 
        net->ipv6.sysctl.hdr = register_net_sysctl_sz(net, "net/ipv6",
-                                                     ipv6_table,
-                                                     ARRAY_SIZE(ipv6_table_template));
+                                                     ipv6_table, table_size);
        if (!net->ipv6.sysctl.hdr)
                goto out_ipv6_icmp_table;
 
 
                .mode           = 0644,
                .proc_handler   = proc_dointvec,
        },
-       { }
 };
 
 static int __net_init xfrm6_net_sysctl_init(struct net *net)