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>
This commit is contained in:
Eric W. Biederman 2009-11-12 00:35:55 -08:00
parent 2fb10732c3
commit 63395b6597

View 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 (procname) {
int len;
len = strlen(procname);
memcpy(path, procname, len);
path += len;
if (dev)
if (dev) {
len = strlen(dev->name);
memcpy(path, dev->name, len);
dev_put(dev);
}
}
#endif
if (len) {
path += len;
if (table->child) {
*path++ = '/';
table = table->child;