sysctl: sysctl_binary.c Fix compilation when !CONFIG_NET
authorEric W. Biederman <ebiederm@xmission.com>
Thu, 12 Nov 2009 08:35:55 +0000 (00:35 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Thu, 12 Nov 2009 09:25:43 +0000 (01:25 -0800)
dev_get_by_index does not exist when the network stack is not
compiled in, so only include the code to follow wild card paths
when the network stack is present.

I have shuffled the code around a little to make it clear
that dev_put is called after dev_get_by_index showing that
there is no leak.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
kernel/sysctl_binary.c

index bf0a4b0..0cf6040 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/pid_namespace.h>
 #include <linux/file.h>
 #include <linux/ctype.h>
+#include <linux/netdevice.h>
 
 #ifdef CONFIG_SYSCTL_SYSCALL
 
@@ -1250,9 +1251,12 @@ out:
 static const struct bin_table *get_sysctl(const int *name, int nlen, char *path)
 {
        const struct bin_table *table = &bin_root_table[0];
-       struct net *net = current->nsproxy->net_ns;
        int ctl_name;
 
+       /* The binary sysctl tables have a small maximum depth so
+        * there is no danger of overflowing our path as it PATH_MAX
+        * bytes long.
+        */
        memcpy(path, "sys/", 4);
        path += 4;
 
@@ -1263,30 +1267,31 @@ repeat:
        name++;
        nlen--;
        for ( ; table->convert; table++) {
-               struct net_device *dev = NULL;
-               const char *procname = NULL;
+               int len = 0;
 
                /* Use the well known sysctl number to proc name mapping */
-               if (ctl_name == table->ctl_name)
-                       procname = table->procname;
-
+               if (ctl_name == table->ctl_name) {
+                       len = strlen(table->procname);
+                       memcpy(path, table->procname, len);
+               }
+#ifdef CONFIG_NET
                /*
                 * For a wild card entry map from ifindex to network
                 * device name.
                 */
                else if (!table->ctl_name) {
+                       struct net *net = current->nsproxy->net_ns;
+                       struct net_device *dev;
                        dev = dev_get_by_index(net, ctl_name);
-                       if (dev)
-                               procname = dev->name;
+                       if (dev) {
+                               len = strlen(dev->name);
+                               memcpy(path, dev->name, len);
+                               dev_put(dev);
+                       }
                }
-               if (procname) {
-                       int len;
-
-                       len = strlen(procname);
-                       memcpy(path, procname, len);
+#endif
+               if (len) {
                        path += len;
-                       if (dev)
-                               dev_put(dev);
                        if (table->child) {
                                *path++ = '/';
                                table = table->child;