mirror of https://gitee.com/openkylin/linux.git
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:
parent
2fb10732c3
commit
63395b6597
|
@ -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 @@ static ssize_t bin_dn_node_address(struct file *file,
|
|||
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 @@ static const struct bin_table *get_sysctl(const int *name, int nlen, char *path)
|
|||
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;
|
||||
|
|
Loading…
Reference in New Issue