sysctl: Neuter the generic sysctl strategy routines.
Now that sys_sysctl is a compatibility layer on top of /proc/sys these routines are never called but are still put in sysctl tables so I have reduced them to stubs until they can be removed entirely. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
This commit is contained in:
Родитель
26a7034b40
Коммит
a965cf946d
198
kernel/sysctl.c
198
kernel/sysctl.c
|
@ -2835,201 +2835,6 @@ int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
|
|||
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
|
||||
#ifdef CONFIG_SYSCTL_SYSCALL
|
||||
/*
|
||||
* General sysctl support routines
|
||||
*/
|
||||
|
||||
/* The generic sysctl data routine (used if no strategy routine supplied) */
|
||||
int sysctl_data(struct ctl_table *table,
|
||||
void __user *oldval, size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
/* Get out of I don't have a variable */
|
||||
if (!table->data || !table->maxlen)
|
||||
return -ENOTDIR;
|
||||
|
||||
if (oldval && oldlenp) {
|
||||
if (get_user(len, oldlenp))
|
||||
return -EFAULT;
|
||||
if (len) {
|
||||
if (len > table->maxlen)
|
||||
len = table->maxlen;
|
||||
if (copy_to_user(oldval, table->data, len))
|
||||
return -EFAULT;
|
||||
if (put_user(len, oldlenp))
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
if (newval && newlen) {
|
||||
if (newlen > table->maxlen)
|
||||
newlen = table->maxlen;
|
||||
|
||||
if (copy_from_user(table->data, newval, newlen))
|
||||
return -EFAULT;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* The generic string strategy routine: */
|
||||
int sysctl_string(struct ctl_table *table,
|
||||
void __user *oldval, size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen)
|
||||
{
|
||||
if (!table->data || !table->maxlen)
|
||||
return -ENOTDIR;
|
||||
|
||||
if (oldval && oldlenp) {
|
||||
size_t bufsize;
|
||||
if (get_user(bufsize, oldlenp))
|
||||
return -EFAULT;
|
||||
if (bufsize) {
|
||||
size_t len = strlen(table->data), copied;
|
||||
|
||||
/* This shouldn't trigger for a well-formed sysctl */
|
||||
if (len > table->maxlen)
|
||||
len = table->maxlen;
|
||||
|
||||
/* Copy up to a max of bufsize-1 bytes of the string */
|
||||
copied = (len >= bufsize) ? bufsize - 1 : len;
|
||||
|
||||
if (copy_to_user(oldval, table->data, copied) ||
|
||||
put_user(0, (char __user *)(oldval + copied)))
|
||||
return -EFAULT;
|
||||
if (put_user(len, oldlenp))
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
if (newval && newlen) {
|
||||
size_t len = newlen;
|
||||
if (len > table->maxlen)
|
||||
len = table->maxlen;
|
||||
if(copy_from_user(table->data, newval, len))
|
||||
return -EFAULT;
|
||||
if (len == table->maxlen)
|
||||
len--;
|
||||
((char *) table->data)[len] = 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function makes sure that all of the integers in the vector
|
||||
* are between the minimum and maximum values given in the arrays
|
||||
* table->extra1 and table->extra2, respectively.
|
||||
*/
|
||||
int sysctl_intvec(struct ctl_table *table,
|
||||
void __user *oldval, size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen)
|
||||
{
|
||||
|
||||
if (newval && newlen) {
|
||||
int __user *vec = (int __user *) newval;
|
||||
int *min = (int *) table->extra1;
|
||||
int *max = (int *) table->extra2;
|
||||
size_t length;
|
||||
int i;
|
||||
|
||||
if (newlen % sizeof(int) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (!table->extra1 && !table->extra2)
|
||||
return 0;
|
||||
|
||||
if (newlen > table->maxlen)
|
||||
newlen = table->maxlen;
|
||||
length = newlen / sizeof(int);
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
int value;
|
||||
if (get_user(value, vec + i))
|
||||
return -EFAULT;
|
||||
if (min && value < min[i])
|
||||
return -EINVAL;
|
||||
if (max && value > max[i])
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Strategy function to convert jiffies to seconds */
|
||||
int sysctl_jiffies(struct ctl_table *table,
|
||||
void __user *oldval, size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen)
|
||||
{
|
||||
if (oldval && oldlenp) {
|
||||
size_t olen;
|
||||
|
||||
if (get_user(olen, oldlenp))
|
||||
return -EFAULT;
|
||||
if (olen) {
|
||||
int val;
|
||||
|
||||
if (olen < sizeof(int))
|
||||
return -EINVAL;
|
||||
|
||||
val = *(int *)(table->data) / HZ;
|
||||
if (put_user(val, (int __user *)oldval))
|
||||
return -EFAULT;
|
||||
if (put_user(sizeof(int), oldlenp))
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
if (newval && newlen) {
|
||||
int new;
|
||||
if (newlen != sizeof(int))
|
||||
return -EINVAL;
|
||||
if (get_user(new, (int __user *)newval))
|
||||
return -EFAULT;
|
||||
*(int *)(table->data) = new*HZ;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Strategy function to convert jiffies to seconds */
|
||||
int sysctl_ms_jiffies(struct ctl_table *table,
|
||||
void __user *oldval, size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen)
|
||||
{
|
||||
if (oldval && oldlenp) {
|
||||
size_t olen;
|
||||
|
||||
if (get_user(olen, oldlenp))
|
||||
return -EFAULT;
|
||||
if (olen) {
|
||||
int val;
|
||||
|
||||
if (olen < sizeof(int))
|
||||
return -EINVAL;
|
||||
|
||||
val = jiffies_to_msecs(*(int *)(table->data));
|
||||
if (put_user(val, (int __user *)oldval))
|
||||
return -EFAULT;
|
||||
if (put_user(sizeof(int), oldlenp))
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
if (newval && newlen) {
|
||||
int new;
|
||||
if (newlen != sizeof(int))
|
||||
return -EINVAL;
|
||||
if (get_user(new, (int __user *)newval))
|
||||
return -EFAULT;
|
||||
*(int *)(table->data) = msecs_to_jiffies(new);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#else /* CONFIG_SYSCTL_SYSCALL */
|
||||
|
||||
|
||||
int sysctl_data(struct ctl_table *table,
|
||||
void __user *oldval, size_t __user *oldlenp,
|
||||
void __user *newval, size_t newlen)
|
||||
|
@ -3065,9 +2870,6 @@ int sysctl_ms_jiffies(struct ctl_table *table,
|
|||
return -ENOSYS;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SYSCTL_SYSCALL */
|
||||
|
||||
|
||||
/*
|
||||
* No sense putting this after each symbol definition, twice,
|
||||
* exception granted :-)
|
||||
|
|
Загрузка…
Ссылка в новой задаче