Skip to content

Commit

Permalink
[PATCH] sysctl: Allow /proc/sys without sys_sysctl
Browse files Browse the repository at this point in the history
Since sys_sysctl is deprecated start allow it to be compiled out.  This
should catch any remaining user space code that cares, and paves the way
for further sysctl cleanups.

[[email protected]: If sys_sysctl() is not compiled-in, emit a warning]
Signed-off-by: Eric W. Biederman <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
ebiederm authored and Linus Torvalds committed Sep 27, 2006
1 parent 5718178 commit b89a817
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 96 deletions.
2 changes: 1 addition & 1 deletion arch/ia64/ia32/sys_ia32.c
Original file line number Diff line number Diff line change
Expand Up @@ -1942,7 +1942,7 @@ struct sysctl32 {
unsigned int __unused[4];
};

#ifdef CONFIG_SYSCTL
#ifdef CONFIG_SYSCTL_SYSCALL
asmlinkage long
sys32_sysctl (struct sysctl32 __user *args)
{
Expand Down
4 changes: 2 additions & 2 deletions arch/mips/kernel/linux32.c
Original file line number Diff line number Diff line change
Expand Up @@ -991,7 +991,7 @@ struct sysctl_args32
unsigned int __unused[4];
};

#ifdef CONFIG_SYSCTL
#ifdef CONFIG_SYSCTL_SYSCALL

asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
{
Expand Down Expand Up @@ -1032,7 +1032,7 @@ asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
return error;
}

#endif /* CONFIG_SYSCTL */
#endif /* CONFIG_SYSCTL_SYSCALL */

asmlinkage long sys32_newuname(struct new_utsname __user * name)
{
Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/kernel/sys_ppc32.c
Original file line number Diff line number Diff line change
Expand Up @@ -740,7 +740,7 @@ asmlinkage long compat_sys_umask(u32 mask)
return sys_umask((int)mask);
}

#ifdef CONFIG_SYSCTL
#ifdef CONFIG_SYSCTL_SYSCALL
struct __sysctl_args32 {
u32 name;
int nlen;
Expand Down
2 changes: 1 addition & 1 deletion arch/s390/kernel/compat_linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,7 @@ asmlinkage long sys32_sendfile64(int out_fd, int in_fd,
return ret;
}

#ifdef CONFIG_SYSCTL
#ifdef CONFIG_SYSCTL_SYSCALL
struct __sysctl_args32 {
u32 name;
int nlen;
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc64/kernel/sys_sparc32.c
Original file line number Diff line number Diff line change
Expand Up @@ -1016,7 +1016,7 @@ struct __sysctl_args32 {

asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
{
#ifndef CONFIG_SYSCTL
#ifndef CONFIG_SYSCTL_SYSCALL
return -ENOSYS;
#else
struct __sysctl_args32 tmp;
Expand Down
2 changes: 1 addition & 1 deletion arch/x86_64/ia32/sys_ia32.c
Original file line number Diff line number Diff line change
Expand Up @@ -648,7 +648,7 @@ sys32_pause(void)
}


#ifdef CONFIG_SYSCTL
#ifdef CONFIG_SYSCTL_SYSCALL
struct sysctl_ia32 {
unsigned int name;
int nlen;
Expand Down
19 changes: 19 additions & 0 deletions fs/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -826,6 +826,25 @@ config PROC_VMCORE
help
Exports the dump image of crashed kernel in ELF format.

config PROC_SYSCTL
bool "Sysctl support (/proc/sys)" if EMBEDDED
depends on PROC_FS
select SYSCTL
default y
---help---
The sysctl interface provides a means of dynamically changing
certain kernel parameters and variables on the fly without requiring
a recompile of the kernel or reboot of the system. The primary
interface is through /proc/sys. If you say Y here a tree of
modifiable sysctl entries will be generated beneath the
/proc/sys directory. They are explained in the files
in <file:Documentation/sysctl/>. Note that enabling this
option will enlarge the kernel by at least 8 KB.

As it is generally a good thing, you should say Y here unless
building a kernel for install/rescue disks or your system is very
limited in memory.

config SYSFS
bool "sysfs file system support" if EMBEDDED
default y
Expand Down
31 changes: 17 additions & 14 deletions init/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -273,21 +273,24 @@ config UID16
This enables the legacy 16-bit UID syscall wrappers.

config SYSCTL
bool "Sysctl support" if EMBEDDED
default y
bool

config SYSCTL_SYSCALL
bool "Sysctl syscall support"
default n
select SYSCTL
---help---
The sysctl interface provides a means of dynamically changing
certain kernel parameters and variables on the fly without requiring
a recompile of the kernel or reboot of the system. The primary
interface consists of a system call, but if you say Y to "/proc
file system support", a tree of modifiable sysctl entries will be
generated beneath the /proc/sys directory. They are explained in the
files in <file:Documentation/sysctl/>. Note that enabling this
option will enlarge the kernel by at least 8 KB.

As it is generally a good thing, you should say Y here unless
building a kernel for install/rescue disks or your system is very
limited in memory.
Enable the deprecated sysctl system call. sys_sysctl uses
binary paths that have been found to be a major pain to maintain
and use. The interface in /proc/sys is now the primary and what
everyone uses.

Nothing has been using the binary sysctl interface for some time
time now so nothing should break if you disable sysctl syscall
support, and you kernel will get marginally smaller.

Unless you have an application that uses the sys_syscall interface
you should probably say N here.

config KALLSYMS
bool "Load all symbols for debugging/kksymoops" if EMBEDDED
Expand Down
113 changes: 38 additions & 75 deletions kernel/sysctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,11 @@ extern int no_unaligned_warning;
extern int max_lock_depth;
#endif

static int parse_table(int __user *, int, void __user *, size_t __user *, void __user *, size_t,
ctl_table *, void **);
#ifdef CONFIG_SYSCTL_SYSCALL
static int parse_table(int __user *, int, void __user *, size_t __user *,
void __user *, size_t, ctl_table *, void **);
#endif

static int proc_doutsstring(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos);

Expand All @@ -165,7 +168,7 @@ int sysctl_legacy_va_layout;

/* /proc declarations: */

#ifdef CONFIG_PROC_FS
#ifdef CONFIG_PROC_SYSCTL

static ssize_t proc_readsys(struct file *, char __user *, size_t, loff_t *);
static ssize_t proc_writesys(struct file *, const char __user *, size_t, loff_t *);
Expand Down Expand Up @@ -1166,12 +1169,13 @@ static void start_unregistering(struct ctl_table_header *p)

void __init sysctl_init(void)
{
#ifdef CONFIG_PROC_FS
#ifdef CONFIG_PROC_SYSCTL
register_proc_table(root_table, proc_sys_root, &root_table_header);
init_irq_proc();
#endif
}

#ifdef CONFIG_SYSCTL_SYSCALL
int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp,
void __user *newval, size_t newlen)
{
Expand Down Expand Up @@ -1225,6 +1229,7 @@ asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
unlock_kernel();
return error;
}
#endif /* CONFIG_SYSCTL_SYSCALL */

/*
* ctl_perm does NOT grant the superuser all rights automatically, because
Expand All @@ -1251,6 +1256,7 @@ static inline int ctl_perm(ctl_table *table, int op)
return test_perm(table->mode, op);
}

#ifdef CONFIG_SYSCTL_SYSCALL
static int parse_table(int __user *name, int nlen,
void __user *oldval, size_t __user *oldlenp,
void __user *newval, size_t newlen,
Expand Down Expand Up @@ -1340,6 +1346,7 @@ int do_sysctl_strategy (ctl_table *table,
}
return 0;
}
#endif /* CONFIG_SYSCTL_SYSCALL */

/**
* register_sysctl_table - register a sysctl hierarchy
Expand Down Expand Up @@ -1427,7 +1434,7 @@ struct ctl_table_header *register_sysctl_table(ctl_table * table,
else
list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry);
spin_unlock(&sysctl_lock);
#ifdef CONFIG_PROC_FS
#ifdef CONFIG_PROC_SYSCTL
register_proc_table(table, proc_sys_root, tmp);
#endif
return tmp;
Expand All @@ -1445,18 +1452,31 @@ void unregister_sysctl_table(struct ctl_table_header * header)
might_sleep();
spin_lock(&sysctl_lock);
start_unregistering(header);
#ifdef CONFIG_PROC_FS
#ifdef CONFIG_PROC_SYSCTL
unregister_proc_table(header->ctl_table, proc_sys_root);
#endif
spin_unlock(&sysctl_lock);
kfree(header);
}

#else /* !CONFIG_SYSCTL */
struct ctl_table_header * register_sysctl_table(ctl_table * table,
int insert_at_head)
{
return NULL;
}

void unregister_sysctl_table(struct ctl_table_header * table)
{
}

#endif /* CONFIG_SYSCTL */

/*
* /proc/sys support
*/

#ifdef CONFIG_PROC_FS
#ifdef CONFIG_PROC_SYSCTL

/* Scan the sysctl entries in table and add them all into /proc */
static void register_proc_table(ctl_table * table, struct proc_dir_entry *root, void *set)
Expand Down Expand Up @@ -2318,6 +2338,7 @@ int proc_doulongvec_ms_jiffies_minmax(ctl_table *table, int write,
#endif /* CONFIG_PROC_FS */


#ifdef CONFIG_SYSCTL_SYSCALL
/*
* General sysctl support routines
*/
Expand Down Expand Up @@ -2460,11 +2481,19 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
return 1;
}

#else /* CONFIG_SYSCTL */
#else /* CONFIG_SYSCTL_SYSCALL */


asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
{
static int msg_count;

if (msg_count < 5) {
msg_count++;
printk(KERN_INFO
"warning: process `%s' used the removed sysctl "
"system call\n", current->comm);
}
return -ENOSYS;
}

Expand Down Expand Up @@ -2496,73 +2525,7 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
return -ENOSYS;
}

int proc_dostring(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}

int proc_dointvec(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}

int proc_dointvec_bset(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}

int proc_dointvec_minmax(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}

int proc_dointvec_jiffies(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}

int proc_dointvec_userhz_jiffies(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}

int proc_dointvec_ms_jiffies(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}

int proc_doulongvec_minmax(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}

int proc_doulongvec_ms_jiffies_minmax(ctl_table *table, int write,
struct file *filp,
void __user *buffer,
size_t *lenp, loff_t *ppos)
{
return -ENOSYS;
}

struct ctl_table_header * register_sysctl_table(ctl_table * table,
int insert_at_head)
{
return NULL;
}

void unregister_sysctl_table(struct ctl_table_header * table)
{
}

#endif /* CONFIG_SYSCTL */
#endif /* CONFIG_SYSCTL_SYSCALL */

/*
* No sense putting this after each symbol definition, twice,
Expand Down

0 comments on commit b89a817

Please sign in to comment.