summaryrefslogtreecommitdiffstats
path: root/kernel/sysctl_binary.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2009-11-12 09:35:55 +0100
committerEric W. Biederman <ebiederm@xmission.com>2009-11-12 10:25:43 +0100
commit63395b65972c07edce595c9cc8a983016738cdac (patch)
tree4ba406874098df734119d282ba634337c7541ba2 /kernel/sysctl_binary.c
parentsysctl: Warn about all uses of sys_sysctl. (diff)
downloadlinux-63395b65972c07edce595c9cc8a983016738cdac.tar.xz
linux-63395b65972c07edce595c9cc8a983016738cdac.zip
sysctl: sysctl_binary.c Fix compilation when !CONFIG_NET
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>
Diffstat (limited to '')
-rw-r--r--kernel/sysctl_binary.c35
1 files changed, 20 insertions, 15 deletions
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
index bf0a4b06782a..0cf60400542d 100644
--- a/kernel/sysctl_binary.c
+++ b/kernel/sysctl_binary.c
@@ -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;