[PATCH] sysctl: Allow /proc/sys without sys_sysctl

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.

[akpm@osdl.org: If sys_sysctl() is not compiled-in, emit a warning]
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Eric W. Biederman 2006-09-27 01:51:04 -07:00 committed by Linus Torvalds
parent 571817849c
commit b89a81712f
9 changed files with 81 additions and 96 deletions

View file

@ -1942,7 +1942,7 @@ struct sysctl32 {
unsigned int __unused[4]; unsigned int __unused[4];
}; };
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
asmlinkage long asmlinkage long
sys32_sysctl (struct sysctl32 __user *args) sys32_sysctl (struct sysctl32 __user *args)
{ {

View file

@ -991,7 +991,7 @@ struct sysctl_args32
unsigned int __unused[4]; unsigned int __unused[4];
}; };
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args) asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
{ {
@ -1032,7 +1032,7 @@ asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
return error; return error;
} }
#endif /* CONFIG_SYSCTL */ #endif /* CONFIG_SYSCTL_SYSCALL */
asmlinkage long sys32_newuname(struct new_utsname __user * name) asmlinkage long sys32_newuname(struct new_utsname __user * name)
{ {

View file

@ -740,7 +740,7 @@ asmlinkage long compat_sys_umask(u32 mask)
return sys_umask((int)mask); return sys_umask((int)mask);
} }
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
struct __sysctl_args32 { struct __sysctl_args32 {
u32 name; u32 name;
int nlen; int nlen;

View file

@ -708,7 +708,7 @@ asmlinkage long sys32_sendfile64(int out_fd, int in_fd,
return ret; return ret;
} }
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
struct __sysctl_args32 { struct __sysctl_args32 {
u32 name; u32 name;
int nlen; int nlen;

View file

@ -1016,7 +1016,7 @@ struct __sysctl_args32 {
asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args) asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
{ {
#ifndef CONFIG_SYSCTL #ifndef CONFIG_SYSCTL_SYSCALL
return -ENOSYS; return -ENOSYS;
#else #else
struct __sysctl_args32 tmp; struct __sysctl_args32 tmp;

View file

@ -648,7 +648,7 @@ sys32_pause(void)
} }
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL_SYSCALL
struct sysctl_ia32 { struct sysctl_ia32 {
unsigned int name; unsigned int name;
int nlen; int nlen;

View file

@ -826,6 +826,25 @@ config PROC_VMCORE
help help
Exports the dump image of crashed kernel in ELF format. 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 config SYSFS
bool "sysfs file system support" if EMBEDDED bool "sysfs file system support" if EMBEDDED
default y default y

View file

@ -273,21 +273,24 @@ config UID16
This enables the legacy 16-bit UID syscall wrappers. This enables the legacy 16-bit UID syscall wrappers.
config SYSCTL config SYSCTL
bool "Sysctl support" if EMBEDDED bool
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 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 config SYSCTL_SYSCALL
building a kernel for install/rescue disks or your system is very bool "Sysctl syscall support"
limited in memory. default n
select SYSCTL
---help---
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 config KALLSYMS
bool "Load all symbols for debugging/kksymoops" if EMBEDDED bool "Load all symbols for debugging/kksymoops" if EMBEDDED

View file

@ -137,8 +137,11 @@ extern int no_unaligned_warning;
extern int max_lock_depth; extern int max_lock_depth;
#endif #endif
static int parse_table(int __user *, int, void __user *, size_t __user *, void __user *, size_t, #ifdef CONFIG_SYSCTL_SYSCALL
ctl_table *, void **); 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, static int proc_doutsstring(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos); void __user *buffer, size_t *lenp, loff_t *ppos);
@ -165,7 +168,7 @@ int sysctl_legacy_va_layout;
/* /proc declarations: */ /* /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_readsys(struct file *, char __user *, size_t, loff_t *);
static ssize_t proc_writesys(struct file *, const char __user *, size_t, loff_t *); static ssize_t proc_writesys(struct file *, const char __user *, size_t, loff_t *);
@ -1166,12 +1169,13 @@ static void start_unregistering(struct ctl_table_header *p)
void __init sysctl_init(void) void __init sysctl_init(void)
{ {
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_SYSCTL
register_proc_table(root_table, proc_sys_root, &root_table_header); register_proc_table(root_table, proc_sys_root, &root_table_header);
init_irq_proc(); init_irq_proc();
#endif #endif
} }
#ifdef CONFIG_SYSCTL_SYSCALL
int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp, int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp,
void __user *newval, size_t newlen) void __user *newval, size_t newlen)
{ {
@ -1225,6 +1229,7 @@ asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
unlock_kernel(); unlock_kernel();
return error; return error;
} }
#endif /* CONFIG_SYSCTL_SYSCALL */
/* /*
* ctl_perm does NOT grant the superuser all rights automatically, because * ctl_perm does NOT grant the superuser all rights automatically, because
@ -1251,6 +1256,7 @@ static inline int ctl_perm(ctl_table *table, int op)
return test_perm(table->mode, op); return test_perm(table->mode, op);
} }
#ifdef CONFIG_SYSCTL_SYSCALL
static int parse_table(int __user *name, int nlen, static int parse_table(int __user *name, int nlen,
void __user *oldval, size_t __user *oldlenp, void __user *oldval, size_t __user *oldlenp,
void __user *newval, size_t newlen, void __user *newval, size_t newlen,
@ -1340,6 +1346,7 @@ int do_sysctl_strategy (ctl_table *table,
} }
return 0; return 0;
} }
#endif /* CONFIG_SYSCTL_SYSCALL */
/** /**
* register_sysctl_table - register a sysctl hierarchy * register_sysctl_table - register a sysctl hierarchy
@ -1427,7 +1434,7 @@ struct ctl_table_header *register_sysctl_table(ctl_table * table,
else else
list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry); list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry);
spin_unlock(&sysctl_lock); spin_unlock(&sysctl_lock);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_SYSCTL
register_proc_table(table, proc_sys_root, tmp); register_proc_table(table, proc_sys_root, tmp);
#endif #endif
return tmp; return tmp;
@ -1445,18 +1452,31 @@ void unregister_sysctl_table(struct ctl_table_header * header)
might_sleep(); might_sleep();
spin_lock(&sysctl_lock); spin_lock(&sysctl_lock);
start_unregistering(header); start_unregistering(header);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_SYSCTL
unregister_proc_table(header->ctl_table, proc_sys_root); unregister_proc_table(header->ctl_table, proc_sys_root);
#endif #endif
spin_unlock(&sysctl_lock); spin_unlock(&sysctl_lock);
kfree(header); 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 * /proc/sys support
*/ */
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_SYSCTL
/* Scan the sysctl entries in table and add them all into /proc */ /* 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) static void register_proc_table(ctl_table * table, struct proc_dir_entry *root, void *set)
@ -2318,6 +2338,7 @@ int proc_doulongvec_ms_jiffies_minmax(ctl_table *table, int write,
#endif /* CONFIG_PROC_FS */ #endif /* CONFIG_PROC_FS */
#ifdef CONFIG_SYSCTL_SYSCALL
/* /*
* General sysctl support routines * General sysctl support routines
*/ */
@ -2460,11 +2481,19 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
return 1; return 1;
} }
#else /* CONFIG_SYSCTL */ #else /* CONFIG_SYSCTL_SYSCALL */
asmlinkage long sys_sysctl(struct __sysctl_args __user *args) 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; return -ENOSYS;
} }
@ -2496,73 +2525,7 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
return -ENOSYS; return -ENOSYS;
} }
int proc_dostring(ctl_table *table, int write, struct file *filp, #endif /* CONFIG_SYSCTL_SYSCALL */
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 */
/* /*
* No sense putting this after each symbol definition, twice, * No sense putting this after each symbol definition, twice,