sysctl: pass kernel pointers to ->proc_handler

Instead of having all the sysctl handlers deal with user pointers, which
is rather hairy in terms of the BPF interaction, copy the input to and
from  userspace in common code.  This also means that the strings are
always NUL-terminated by the common code, making the API a little bit
safer.

As most handler just pass through the data to one of the common handlers
a lot of the changes are mechnical.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Andrey Ignatov <rdna@fb.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Christoph Hellwig 2020-04-24 08:43:38 +02:00 committed by Al Viro
parent f461d2dcd5
commit 32927393dc
88 changed files with 459 additions and 654 deletions

View File

@ -203,7 +203,7 @@ static void __init register_insn_emulation(struct insn_emulation_ops *ops)
} }
static int emulation_proc_handler(struct ctl_table *table, int write, static int emulation_proc_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
int ret = 0; int ret = 0;

View File

@ -341,8 +341,7 @@ static unsigned int find_supported_vector_length(unsigned int vl)
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
static int sve_proc_do_default_vl(struct ctl_table *table, int write, static int sve_proc_do_default_vl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret; int ret;
int vl = sve_default_vl; int vl = sve_default_vl;

View File

@ -95,16 +95,15 @@ int proc_lasat_ip(struct ctl_table *table, int write,
len = 0; len = 0;
p = buffer; p = buffer;
while (len < *lenp) { while (len < *lenp) {
if (get_user(c, p++)) c = *p;
return -EFAULT; p++;
if (c == 0 || c == '\n') if (c == 0 || c == '\n')
break; break;
len++; len++;
} }
if (len >= sizeof(ipbuf)-1) if (len >= sizeof(ipbuf)-1)
len = sizeof(ipbuf) - 1; len = sizeof(ipbuf) - 1;
if (copy_from_user(ipbuf, buffer, len)) memcpy(ipbuf, buffer, len);
return -EFAULT;
ipbuf[len] = 0; ipbuf[len] = 0;
*ppos += *lenp; *ppos += *lenp;
/* Now see if we can convert it to a valid IP */ /* Now see if we can convert it to a valid IP */
@ -122,11 +121,9 @@ int proc_lasat_ip(struct ctl_table *table, int write,
if (len > *lenp) if (len > *lenp)
len = *lenp; len = *lenp;
if (len) if (len)
if (copy_to_user(buffer, ipbuf, len)) memcpy(buffer, ipbuf, len);
return -EFAULT;
if (len < *lenp) { if (len < *lenp) {
if (put_user('\n', ((char *) buffer) + len)) *((char *)buffer + len) = '\n';
return -EFAULT;
len++; len++;
} }
*lenp = len; *lenp = len;

View File

@ -51,10 +51,9 @@ static struct platform_device *appldata_pdev;
*/ */
static const char appldata_proc_name[APPLDATA_PROC_NAME_LENGTH] = "appldata"; static const char appldata_proc_name[APPLDATA_PROC_NAME_LENGTH] = "appldata";
static int appldata_timer_handler(struct ctl_table *ctl, int write, static int appldata_timer_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
static int appldata_interval_handler(struct ctl_table *ctl, int write, static int appldata_interval_handler(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos);
size_t *lenp, loff_t *ppos);
static struct ctl_table_header *appldata_sysctl_header; static struct ctl_table_header *appldata_sysctl_header;
static struct ctl_table appldata_table[] = { static struct ctl_table appldata_table[] = {
@ -217,7 +216,7 @@ static void __appldata_vtimer_setup(int cmd)
*/ */
static int static int
appldata_timer_handler(struct ctl_table *ctl, int write, appldata_timer_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int timer_active = appldata_timer_active; int timer_active = appldata_timer_active;
int rc; int rc;
@ -250,7 +249,7 @@ appldata_timer_handler(struct ctl_table *ctl, int write,
*/ */
static int static int
appldata_interval_handler(struct ctl_table *ctl, int write, appldata_interval_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int interval = appldata_interval; int interval = appldata_interval;
int rc; int rc;
@ -280,7 +279,7 @@ appldata_interval_handler(struct ctl_table *ctl, int write,
*/ */
static int static int
appldata_generic_handler(struct ctl_table *ctl, int write, appldata_generic_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct appldata_ops *ops = NULL, *tmp_ops; struct appldata_ops *ops = NULL, *tmp_ops;
struct list_head *lh; struct list_head *lh;

View File

@ -867,7 +867,7 @@ static int debug_active = 1;
* if debug_active is already off * if debug_active is already off
*/ */
static int s390dbf_procactive(struct ctl_table *table, int write, static int s390dbf_procactive(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
if (!write || debug_stoppable || !debug_active) if (!write || debug_stoppable || !debug_active)
return proc_dointvec(table, write, buffer, lenp, ppos); return proc_dointvec(table, write, buffer, lenp, ppos);

View File

@ -594,7 +594,7 @@ static int __init topology_setup(char *str)
early_param("topology", topology_setup); early_param("topology", topology_setup);
static int topology_ctl_handler(struct ctl_table *ctl, int write, static int topology_ctl_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int enabled = topology_is_enabled(); int enabled = topology_is_enabled();
int new_mode; int new_mode;

View File

@ -245,7 +245,7 @@ static int cmm_skip_blanks(char *cp, char **endp)
} }
static int cmm_pages_handler(struct ctl_table *ctl, int write, static int cmm_pages_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
long nr = cmm_get_pages(); long nr = cmm_get_pages();
struct ctl_table ctl_entry = { struct ctl_table ctl_entry = {
@ -264,7 +264,7 @@ static int cmm_pages_handler(struct ctl_table *ctl, int write,
} }
static int cmm_timed_pages_handler(struct ctl_table *ctl, int write, static int cmm_timed_pages_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
long nr = cmm_get_timed_pages(); long nr = cmm_get_timed_pages();
@ -284,7 +284,7 @@ static int cmm_timed_pages_handler(struct ctl_table *ctl, int write,
} }
static int cmm_timeout_handler(struct ctl_table *ctl, int write, static int cmm_timeout_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
char buf[64], *p; char buf[64], *p;
long nr, seconds; long nr, seconds;
@ -297,8 +297,7 @@ static int cmm_timeout_handler(struct ctl_table *ctl, int write,
if (write) { if (write) {
len = min(*lenp, sizeof(buf)); len = min(*lenp, sizeof(buf));
if (copy_from_user(buf, buffer, len)) memcpy(buf, buffer, len);
return -EFAULT;
buf[len - 1] = '\0'; buf[len - 1] = '\0';
cmm_skip_blanks(buf, &p); cmm_skip_blanks(buf, &p);
nr = simple_strtoul(p, &p, 0); nr = simple_strtoul(p, &p, 0);
@ -311,8 +310,7 @@ static int cmm_timeout_handler(struct ctl_table *ctl, int write,
cmm_timeout_pages, cmm_timeout_seconds); cmm_timeout_pages, cmm_timeout_seconds);
if (len > *lenp) if (len > *lenp)
len = *lenp; len = *lenp;
if (copy_to_user(buffer, buf, len)) memcpy(buffer, buf, len);
return -EFAULT;
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;
} }

View File

@ -39,8 +39,7 @@ static bool __read_mostly sched_itmt_capable;
unsigned int __read_mostly sysctl_sched_itmt_enabled; unsigned int __read_mostly sysctl_sched_itmt_enabled;
static int sched_itmt_update_handler(struct ctl_table *table, int write, static int sched_itmt_update_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
unsigned int old_sysctl; unsigned int old_sysctl;
int ret; int ret;

View File

@ -3631,7 +3631,7 @@ static void cdrom_update_settings(void)
} }
static int cdrom_sysctl_handler(struct ctl_table *ctl, int write, static int cdrom_sysctl_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int ret; int ret;

View File

@ -2057,7 +2057,7 @@ static char sysctl_bootid[16];
* sysctl system call, as 16 bytes of binary data. * sysctl system call, as 16 bytes of binary data.
*/ */
static int proc_do_uuid(struct ctl_table *table, int write, static int proc_do_uuid(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table fake_table; struct ctl_table fake_table;
unsigned char buf[64], tmp_uuid[16], *uuid; unsigned char buf[64], tmp_uuid[16], *uuid;

View File

@ -183,8 +183,7 @@ static void mac_hid_stop_emulation(void)
} }
static int mac_hid_toggle_emumouse(struct ctl_table *table, int write, static int mac_hid_toggle_emumouse(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int *valp = table->data; int *valp = table->data;
int old_val = *valp; int old_val = *valp;

View File

@ -34,7 +34,7 @@
#define PARPORT_MAX_SPINTIME_VALUE 1000 #define PARPORT_MAX_SPINTIME_VALUE 1000
static int do_active_device(struct ctl_table *table, int write, static int do_active_device(struct ctl_table *table, int write,
void __user *result, size_t *lenp, loff_t *ppos) void *result, size_t *lenp, loff_t *ppos)
{ {
struct parport *port = (struct parport *)table->extra1; struct parport *port = (struct parport *)table->extra1;
char buffer[256]; char buffer[256];
@ -65,13 +65,13 @@ static int do_active_device(struct ctl_table *table, int write,
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;
memcpy(result, buffer, len);
return copy_to_user(result, buffer, len) ? -EFAULT : 0; return 0;
} }
#ifdef CONFIG_PARPORT_1284 #ifdef CONFIG_PARPORT_1284
static int do_autoprobe(struct ctl_table *table, int write, static int do_autoprobe(struct ctl_table *table, int write,
void __user *result, size_t *lenp, loff_t *ppos) void *result, size_t *lenp, loff_t *ppos)
{ {
struct parport_device_info *info = table->extra2; struct parport_device_info *info = table->extra2;
const char *str; const char *str;
@ -108,13 +108,13 @@ static int do_autoprobe(struct ctl_table *table, int write,
*ppos += len; *ppos += len;
return copy_to_user (result, buffer, len) ? -EFAULT : 0; memcpy(result, buffer, len);
return 0;
} }
#endif /* IEEE1284.3 support. */ #endif /* IEEE1284.3 support. */
static int do_hardware_base_addr(struct ctl_table *table, int write, static int do_hardware_base_addr(struct ctl_table *table, int write,
void __user *result, void *result, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
struct parport *port = (struct parport *)table->extra1; struct parport *port = (struct parport *)table->extra1;
char buffer[20]; char buffer[20];
@ -136,13 +136,12 @@ static int do_hardware_base_addr(struct ctl_table *table, int write,
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;
memcpy(result, buffer, len);
return copy_to_user(result, buffer, len) ? -EFAULT : 0; return 0;
} }
static int do_hardware_irq(struct ctl_table *table, int write, static int do_hardware_irq(struct ctl_table *table, int write,
void __user *result, void *result, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
struct parport *port = (struct parport *)table->extra1; struct parport *port = (struct parport *)table->extra1;
char buffer[20]; char buffer[20];
@ -164,13 +163,12 @@ static int do_hardware_irq(struct ctl_table *table, int write,
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;
memcpy(result, buffer, len);
return copy_to_user(result, buffer, len) ? -EFAULT : 0; return 0;
} }
static int do_hardware_dma(struct ctl_table *table, int write, static int do_hardware_dma(struct ctl_table *table, int write,
void __user *result, void *result, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
struct parport *port = (struct parport *)table->extra1; struct parport *port = (struct parport *)table->extra1;
char buffer[20]; char buffer[20];
@ -192,13 +190,12 @@ static int do_hardware_dma(struct ctl_table *table, int write,
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;
memcpy(result, buffer, len);
return copy_to_user(result, buffer, len) ? -EFAULT : 0; return 0;
} }
static int do_hardware_modes(struct ctl_table *table, int write, static int do_hardware_modes(struct ctl_table *table, int write,
void __user *result, void *result, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
struct parport *port = (struct parport *)table->extra1; struct parport *port = (struct parport *)table->extra1;
char buffer[40]; char buffer[40];
@ -231,8 +228,8 @@ static int do_hardware_modes(struct ctl_table *table, int write,
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;
memcpy(result, buffer, len);
return copy_to_user(result, buffer, len) ? -EFAULT : 0; return 0;
} }
#define PARPORT_PORT_DIR(CHILD) { .procname = NULL, .mode = 0555, .child = CHILD } #define PARPORT_PORT_DIR(CHILD) { .procname = NULL, .mode = 0555, .child = CHILD }

View File

@ -165,7 +165,7 @@ static long get_nr_dentry_negative(void)
return sum < 0 ? 0 : sum; return sum < 0 ? 0 : sum;
} }
int proc_nr_dentry(struct ctl_table *table, int write, void __user *buffer, int proc_nr_dentry(struct ctl_table *table, int write, void *buffer,
size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
dentry_stat.nr_dentry = get_nr_dentry(); dentry_stat.nr_dentry = get_nr_dentry();

View File

@ -47,7 +47,7 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused)
} }
int drop_caches_sysctl_handler(struct ctl_table *table, int write, int drop_caches_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
int ret; int ret;

View File

@ -80,14 +80,14 @@ EXPORT_SYMBOL_GPL(get_max_files);
*/ */
#if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS) #if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
int proc_nr_files(struct ctl_table *table, int write, int proc_nr_files(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
files_stat.nr_files = get_nr_files(); files_stat.nr_files = get_nr_files();
return proc_doulongvec_minmax(table, write, buffer, lenp, ppos); return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
} }
#else #else
int proc_nr_files(struct ctl_table *table, int write, int proc_nr_files(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }

View File

@ -51,8 +51,7 @@ static unsigned fscache_op_max_active = 2;
static struct ctl_table_header *fscache_sysctl_header; static struct ctl_table_header *fscache_sysctl_header;
static int fscache_max_active_sysctl(struct ctl_table *table, int write, static int fscache_max_active_sysctl(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
struct workqueue_struct **wqp = table->extra1; struct workqueue_struct **wqp = table->extra1;
unsigned int *datap = table->data; unsigned int *datap = table->data;

View File

@ -108,7 +108,7 @@ long get_nr_dirty_inodes(void)
*/ */
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
int proc_nr_inodes(struct ctl_table *table, int write, int proc_nr_inodes(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
inodes_stat.nr_inodes = get_nr_inodes(); inodes_stat.nr_inodes = get_nr_inodes();
inodes_stat.nr_unused = get_nr_inodes_unused(); inodes_stat.nr_unused = get_nr_inodes_unused();

View File

@ -539,13 +539,13 @@ out:
return err; return err;
} }
static ssize_t proc_sys_call_handler(struct file *filp, void __user *buf, static ssize_t proc_sys_call_handler(struct file *filp, void __user *ubuf,
size_t count, loff_t *ppos, int write) size_t count, loff_t *ppos, int write)
{ {
struct inode *inode = file_inode(filp); struct inode *inode = file_inode(filp);
struct ctl_table_header *head = grab_header(inode); struct ctl_table_header *head = grab_header(inode);
struct ctl_table *table = PROC_I(inode)->sysctl_entry; struct ctl_table *table = PROC_I(inode)->sysctl_entry;
void *new_buf = NULL; void *kbuf;
ssize_t error; ssize_t error;
if (IS_ERR(head)) if (IS_ERR(head))
@ -564,27 +564,38 @@ static ssize_t proc_sys_call_handler(struct file *filp, void __user *buf,
if (!table->proc_handler) if (!table->proc_handler)
goto out; goto out;
error = BPF_CGROUP_RUN_PROG_SYSCTL(head, table, write, buf, &count, if (write) {
ppos, &new_buf); kbuf = memdup_user_nul(ubuf, count);
if (error) if (IS_ERR(kbuf)) {
goto out; error = PTR_ERR(kbuf);
goto out;
/* careful: calling conventions are nasty here */ }
if (new_buf) {
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(KERNEL_DS);
error = table->proc_handler(table, write, (void __user *)new_buf,
&count, ppos);
set_fs(old_fs);
kfree(new_buf);
} else { } else {
error = table->proc_handler(table, write, buf, &count, ppos); error = -ENOMEM;
kbuf = kzalloc(count, GFP_KERNEL);
if (!kbuf)
goto out;
} }
if (!error) error = BPF_CGROUP_RUN_PROG_SYSCTL(head, table, write, &kbuf, &count,
error = count; ppos);
if (error)
goto out_free_buf;
/* careful: calling conventions are nasty here */
error = table->proc_handler(table, write, kbuf, &count, ppos);
if (error)
goto out_free_buf;
if (!write) {
error = -EFAULT;
if (copy_to_user(ubuf, kbuf, count))
goto out_free_buf;
}
error = count;
out_free_buf:
kfree(kbuf);
out: out:
sysctl_head_finish(head); sysctl_head_finish(head);

View File

@ -2841,7 +2841,7 @@ const struct quotactl_ops dquot_quotactl_sysfile_ops = {
EXPORT_SYMBOL(dquot_quotactl_sysfile_ops); EXPORT_SYMBOL(dquot_quotactl_sysfile_ops);
static int do_proc_dqstats(struct ctl_table *table, int write, static int do_proc_dqstats(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
unsigned int type = (unsigned long *)table->data - dqstats.stat; unsigned int type = (unsigned long *)table->data - dqstats.stat;
s64 value = percpu_counter_sum(&dqstats.counter[type]); s64 value = percpu_counter_sum(&dqstats.counter[type]);

View File

@ -13,7 +13,7 @@ STATIC int
xfs_stats_clear_proc_handler( xfs_stats_clear_proc_handler(
struct ctl_table *ctl, struct ctl_table *ctl,
int write, int write,
void __user *buffer, void *buffer,
size_t *lenp, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
@ -33,7 +33,7 @@ STATIC int
xfs_panic_mask_proc_handler( xfs_panic_mask_proc_handler(
struct ctl_table *ctl, struct ctl_table *ctl,
int write, int write,
void __user *buffer, void *buffer,
size_t *lenp, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {

View File

@ -138,8 +138,7 @@ int __cgroup_bpf_check_dev_permission(short dev_type, u32 major, u32 minor,
int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head, int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head,
struct ctl_table *table, int write, struct ctl_table *table, int write,
void __user *buf, size_t *pcount, void **buf, size_t *pcount, loff_t *ppos,
loff_t *ppos, void **new_buf,
enum bpf_attach_type type); enum bpf_attach_type type);
int __cgroup_bpf_run_filter_setsockopt(struct sock *sock, int *level, int __cgroup_bpf_run_filter_setsockopt(struct sock *sock, int *level,
@ -302,12 +301,12 @@ int bpf_percpu_cgroup_storage_update(struct bpf_map *map, void *key,
}) })
#define BPF_CGROUP_RUN_PROG_SYSCTL(head, table, write, buf, count, pos, nbuf) \ #define BPF_CGROUP_RUN_PROG_SYSCTL(head, table, write, buf, count, pos) \
({ \ ({ \
int __ret = 0; \ int __ret = 0; \
if (cgroup_bpf_enabled) \ if (cgroup_bpf_enabled) \
__ret = __cgroup_bpf_run_filter_sysctl(head, table, write, \ __ret = __cgroup_bpf_run_filter_sysctl(head, table, write, \
buf, count, pos, nbuf, \ buf, count, pos, \
BPF_CGROUP_SYSCTL); \ BPF_CGROUP_SYSCTL); \
__ret; \ __ret; \
}) })
@ -429,7 +428,7 @@ static inline int bpf_percpu_cgroup_storage_update(struct bpf_map *map,
#define BPF_CGROUP_RUN_PROG_UDP6_RECVMSG_LOCK(sk, uaddr) ({ 0; }) #define BPF_CGROUP_RUN_PROG_UDP6_RECVMSG_LOCK(sk, uaddr) ({ 0; })
#define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops) ({ 0; }) #define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops) ({ 0; })
#define BPF_CGROUP_RUN_PROG_DEVICE_CGROUP(type,major,minor,access) ({ 0; }) #define BPF_CGROUP_RUN_PROG_DEVICE_CGROUP(type,major,minor,access) ({ 0; })
#define BPF_CGROUP_RUN_PROG_SYSCTL(head,table,write,buf,count,pos,nbuf) ({ 0; }) #define BPF_CGROUP_RUN_PROG_SYSCTL(head,table,write,buf,count,pos) ({ 0; })
#define BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen) ({ 0; }) #define BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen) ({ 0; })
#define BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock, level, optname, optval, \ #define BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock, level, optname, optval, \
optlen, max_optlen, retval) ({ retval; }) optlen, max_optlen, retval) ({ retval; })

View File

@ -86,7 +86,7 @@ static inline unsigned long compact_gap(unsigned int order)
#ifdef CONFIG_COMPACTION #ifdef CONFIG_COMPACTION
extern int sysctl_compact_memory; extern int sysctl_compact_memory;
extern int sysctl_compaction_handler(struct ctl_table *table, int write, extern int sysctl_compaction_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos); void *buffer, size_t *length, loff_t *ppos);
extern int sysctl_extfrag_threshold; extern int sysctl_extfrag_threshold;
extern int sysctl_compact_unevictable_allowed; extern int sysctl_compact_unevictable_allowed;

View File

@ -3536,11 +3536,11 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
struct ctl_table; struct ctl_table;
int proc_nr_files(struct ctl_table *table, int write, int proc_nr_files(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
int proc_nr_dentry(struct ctl_table *table, int write, int proc_nr_dentry(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
int proc_nr_inodes(struct ctl_table *table, int write, int proc_nr_inodes(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
int __init get_filesystem_list(char *buf); int __init get_filesystem_list(char *buf);
#define __FMODE_EXEC ((__force int) FMODE_EXEC) #define __FMODE_EXEC ((__force int) FMODE_EXEC)

View File

@ -1005,8 +1005,7 @@ extern void disable_trace_on_warning(void);
extern int __disable_trace_on_warning; extern int __disable_trace_on_warning;
int tracepoint_printk_sysctl(struct ctl_table *table, int write, int tracepoint_printk_sysctl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos);
#else /* CONFIG_TRACING */ #else /* CONFIG_TRACING */
static inline void disable_trace_on_warning(void) { } static inline void disable_trace_on_warning(void) { }

View File

@ -105,14 +105,13 @@ struct hugepage_subpool *hugepage_new_subpool(struct hstate *h, long max_hpages,
void hugepage_put_subpool(struct hugepage_subpool *spool); void hugepage_put_subpool(struct hugepage_subpool *spool);
void reset_vma_resv_huge_pages(struct vm_area_struct *vma); void reset_vma_resv_huge_pages(struct vm_area_struct *vma);
int hugetlb_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); int hugetlb_sysctl_handler(struct ctl_table *, int, void *, size_t *, loff_t *);
int hugetlb_overcommit_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); int hugetlb_overcommit_handler(struct ctl_table *, int, void *, size_t *,
int hugetlb_treat_movable_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); loff_t *);
int hugetlb_treat_movable_handler(struct ctl_table *, int, void *, size_t *,
#ifdef CONFIG_NUMA loff_t *);
int hugetlb_mempolicy_sysctl_handler(struct ctl_table *, int, int hugetlb_mempolicy_sysctl_handler(struct ctl_table *, int, void *, size_t *,
void __user *, size_t *, loff_t *); loff_t *);
#endif
int copy_hugetlb_page_range(struct mm_struct *, struct mm_struct *, struct vm_area_struct *); int copy_hugetlb_page_range(struct mm_struct *, struct mm_struct *, struct vm_area_struct *);
long follow_hugetlb_page(struct mm_struct *, struct vm_area_struct *, long follow_hugetlb_page(struct mm_struct *, struct vm_area_struct *,

View File

@ -312,7 +312,7 @@ DEFINE_INSN_CACHE_OPS(optinsn);
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
extern int sysctl_kprobes_optimization; extern int sysctl_kprobes_optimization;
extern int proc_kprobes_optimization_handler(struct ctl_table *table, extern int proc_kprobes_optimization_handler(struct ctl_table *table,
int write, void __user *buffer, int write, void *buffer,
size_t *length, loff_t *ppos); size_t *length, loff_t *ppos);
#endif #endif
extern void wait_for_kprobe_optimizer(void); extern void wait_for_kprobe_optimizer(void);

View File

@ -38,8 +38,8 @@ account_scheduler_latency(struct task_struct *task, int usecs, int inter)
void clear_tsk_latency_tracing(struct task_struct *p); void clear_tsk_latency_tracing(struct task_struct *p);
extern int sysctl_latencytop(struct ctl_table *table, int write, int sysctl_latencytop(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos); size_t *lenp, loff_t *ppos);
#else #else

View File

@ -201,10 +201,10 @@ extern int sysctl_overcommit_memory;
extern int sysctl_overcommit_ratio; extern int sysctl_overcommit_ratio;
extern unsigned long sysctl_overcommit_kbytes; extern unsigned long sysctl_overcommit_kbytes;
extern int overcommit_ratio_handler(struct ctl_table *, int, void __user *, int overcommit_ratio_handler(struct ctl_table *, int, void *, size_t *,
size_t *, loff_t *); loff_t *);
extern int overcommit_kbytes_handler(struct ctl_table *, int, void __user *, int overcommit_kbytes_handler(struct ctl_table *, int, void *, size_t *,
size_t *, loff_t *); loff_t *);
#define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n)) #define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
@ -2957,8 +2957,8 @@ extern bool process_shares_mm(struct task_struct *p, struct mm_struct *mm);
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
extern int sysctl_drop_caches; extern int sysctl_drop_caches;
int drop_caches_sysctl_handler(struct ctl_table *, int, int drop_caches_sysctl_handler(struct ctl_table *, int, void *, size_t *,
void __user *, size_t *, loff_t *); loff_t *);
#endif #endif
void drop_slab(void); void drop_slab(void);

View File

@ -910,22 +910,21 @@ static inline int is_highmem(struct zone *zone)
/* These two functions are used to setup the per zone pages min values */ /* These two functions are used to setup the per zone pages min values */
struct ctl_table; struct ctl_table;
int min_free_kbytes_sysctl_handler(struct ctl_table *, int, int min_free_kbytes_sysctl_handler(struct ctl_table *, int, void *, size_t *,
void __user *, size_t *, loff_t *); loff_t *);
int watermark_scale_factor_sysctl_handler(struct ctl_table *, int, int watermark_scale_factor_sysctl_handler(struct ctl_table *, int, void *,
void __user *, size_t *, loff_t *); size_t *, loff_t *);
extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES]; extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES];
int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, void *,
void __user *, size_t *, loff_t *); size_t *, loff_t *);
int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int, int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int,
void __user *, size_t *, loff_t *); void *, size_t *, loff_t *);
int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int, int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int,
void __user *, size_t *, loff_t *); void *, size_t *, loff_t *);
int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int, int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int,
void __user *, size_t *, loff_t *); void *, size_t *, loff_t *);
int numa_zonelist_order_handler(struct ctl_table *, int,
extern int numa_zonelist_order_handler(struct ctl_table *, int, void *, size_t *, loff_t *);
void __user *, size_t *, loff_t *);
extern int percpu_pagelist_fraction; extern int percpu_pagelist_fraction;
extern char numa_zonelist_order[]; extern char numa_zonelist_order[];
#define NUMA_ZONELIST_ORDER_LEN 16 #define NUMA_ZONELIST_ORDER_LEN 16

View File

@ -202,16 +202,11 @@ static inline void watchdog_update_hrtimer_threshold(u64 period) { }
#endif #endif
struct ctl_table; struct ctl_table;
extern int proc_watchdog(struct ctl_table *, int , int proc_watchdog(struct ctl_table *, int, void *, size_t *, loff_t *);
void __user *, size_t *, loff_t *); int proc_nmi_watchdog(struct ctl_table *, int , void *, size_t *, loff_t *);
extern int proc_nmi_watchdog(struct ctl_table *, int , int proc_soft_watchdog(struct ctl_table *, int , void *, size_t *, loff_t *);
void __user *, size_t *, loff_t *); int proc_watchdog_thresh(struct ctl_table *, int , void *, size_t *, loff_t *);
extern int proc_soft_watchdog(struct ctl_table *, int , int proc_watchdog_cpumask(struct ctl_table *, int, void *, size_t *, loff_t *);
void __user *, size_t *, loff_t *);
extern int proc_watchdog_thresh(struct ctl_table *, int ,
void __user *, size_t *, loff_t *);
extern int proc_watchdog_cpumask(struct ctl_table *, int,
void __user *, size_t *, loff_t *);
#ifdef CONFIG_HAVE_ACPI_APEI_NMI #ifdef CONFIG_HAVE_ACPI_APEI_NMI
#include <asm/nmi.h> #include <asm/nmi.h>

View File

@ -1280,15 +1280,12 @@ extern int sysctl_perf_cpu_time_max_percent;
extern void perf_sample_event_took(u64 sample_len_ns); extern void perf_sample_event_took(u64 sample_len_ns);
extern int perf_proc_update_handler(struct ctl_table *table, int write, int perf_proc_update_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos); int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write,
extern int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos);
void __user *buffer, size_t *lenp,
loff_t *ppos);
int perf_event_max_stack_handler(struct ctl_table *table, int write, int perf_event_max_stack_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
/* Access to perf_event_open(2) syscall. */ /* Access to perf_event_open(2) syscall. */
#define PERF_SECURITY_OPEN 0 #define PERF_SECURITY_OPEN 0

View File

@ -189,7 +189,7 @@ extern int printk_delay_msec;
extern int dmesg_restrict; extern int dmesg_restrict;
extern int extern int
devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write, void __user *buf, devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write, void *buf,
size_t *lenp, loff_t *ppos); size_t *lenp, loff_t *ppos);
extern void wake_up_klogd(void); extern void wake_up_klogd(void);

View File

@ -12,9 +12,8 @@ extern unsigned int sysctl_hung_task_panic;
extern unsigned long sysctl_hung_task_timeout_secs; extern unsigned long sysctl_hung_task_timeout_secs;
extern unsigned long sysctl_hung_task_check_interval_secs; extern unsigned long sysctl_hung_task_check_interval_secs;
extern int sysctl_hung_task_warnings; extern int sysctl_hung_task_warnings;
extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, int proc_dohung_task_timeout_secs(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos);
size_t *lenp, loff_t *ppos);
#else #else
/* Avoid need for ifdefs elsewhere in the code */ /* Avoid need for ifdefs elsewhere in the code */
enum { sysctl_hung_task_timeout_secs = 0 }; enum { sysctl_hung_task_timeout_secs = 0 };
@ -43,8 +42,7 @@ extern __read_mostly unsigned int sysctl_sched_migration_cost;
extern __read_mostly unsigned int sysctl_sched_nr_migrate; extern __read_mostly unsigned int sysctl_sched_nr_migrate;
int sched_proc_update_handler(struct ctl_table *table, int write, int sched_proc_update_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, void *buffer, size_t *length, loff_t *ppos);
loff_t *ppos);
#endif #endif
/* /*
@ -72,33 +70,21 @@ extern unsigned int sysctl_sched_autogroup_enabled;
extern int sysctl_sched_rr_timeslice; extern int sysctl_sched_rr_timeslice;
extern int sched_rr_timeslice; extern int sched_rr_timeslice;
extern int sched_rr_handler(struct ctl_table *table, int write, int sched_rr_handler(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, size_t *lenp, loff_t *ppos);
loff_t *ppos); int sched_rt_handler(struct ctl_table *table, int write, void *buffer,
size_t *lenp, loff_t *ppos);
extern int sched_rt_handler(struct ctl_table *table, int write, int sysctl_sched_uclamp_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos); int sysctl_numa_balancing(struct ctl_table *table, int write, void *buffer,
size_t *lenp, loff_t *ppos);
#ifdef CONFIG_UCLAMP_TASK int sysctl_schedstats(struct ctl_table *table, int write, void *buffer,
extern int sysctl_sched_uclamp_handler(struct ctl_table *table, int write, size_t *lenp, loff_t *ppos);
void __user *buffer, size_t *lenp,
loff_t *ppos);
#endif
extern int sysctl_numa_balancing(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp,
loff_t *ppos);
extern int sysctl_schedstats(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp,
loff_t *ppos);
#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) #if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
extern unsigned int sysctl_sched_energy_aware; extern unsigned int sysctl_sched_energy_aware;
extern int sched_energy_aware_handler(struct ctl_table *table, int write, int sched_energy_aware_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos);
#endif #endif
#endif /* _LINUX_SCHED_SYSCTL_H */ #endif /* _LINUX_SCHED_SYSCTL_H */

View File

@ -211,7 +211,7 @@ struct request_sock;
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
extern int mmap_min_addr_handler(struct ctl_table *table, int write, extern int mmap_min_addr_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
#endif #endif
/* security_inode_init_security callback function to write xattrs */ /* security_inode_init_security callback function to write xattrs */

View File

@ -44,35 +44,26 @@ struct ctl_dir;
extern const int sysctl_vals[]; extern const int sysctl_vals[];
typedef int proc_handler (struct ctl_table *ctl, int write, typedef int proc_handler(struct ctl_table *ctl, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos); size_t *lenp, loff_t *ppos);
extern int proc_dostring(struct ctl_table *, int, int proc_dostring(struct ctl_table *, int, void *, size_t *, loff_t *);
void __user *, size_t *, loff_t *); int proc_dointvec(struct ctl_table *, int, void *, size_t *, loff_t *);
extern int proc_dointvec(struct ctl_table *, int, int proc_douintvec(struct ctl_table *, int, void *, size_t *, loff_t *);
void __user *, size_t *, loff_t *); int proc_dointvec_minmax(struct ctl_table *, int, void *, size_t *, loff_t *);
extern int proc_douintvec(struct ctl_table *, int, int proc_douintvec_minmax(struct ctl_table *table, int write, void *buffer,
void __user *, size_t *, loff_t *); size_t *lenp, loff_t *ppos);
extern int proc_dointvec_minmax(struct ctl_table *, int, int proc_dointvec_jiffies(struct ctl_table *, int, void *, size_t *, loff_t *);
void __user *, size_t *, loff_t *); int proc_dointvec_userhz_jiffies(struct ctl_table *, int, void *, size_t *,
extern int proc_douintvec_minmax(struct ctl_table *table, int write, loff_t *);
void __user *buffer, size_t *lenp, int proc_dointvec_ms_jiffies(struct ctl_table *, int, void *, size_t *,
loff_t *ppos); loff_t *);
extern int proc_dointvec_jiffies(struct ctl_table *, int, int proc_doulongvec_minmax(struct ctl_table *, int, void *, size_t *, loff_t *);
void __user *, size_t *, loff_t *); int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int, void *,
extern int proc_dointvec_userhz_jiffies(struct ctl_table *, int, size_t *, loff_t *);
void __user *, size_t *, loff_t *); int proc_do_large_bitmap(struct ctl_table *, int, void *, size_t *, loff_t *);
extern int proc_dointvec_ms_jiffies(struct ctl_table *, int, int proc_do_static_key(struct ctl_table *table, int write, void *buffer,
void __user *, size_t *, loff_t *); size_t *lenp, loff_t *ppos);
extern int proc_doulongvec_minmax(struct ctl_table *, int,
void __user *, size_t *, loff_t *);
extern int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int,
void __user *, size_t *, loff_t *);
extern int proc_do_large_bitmap(struct ctl_table *, int,
void __user *, size_t *, loff_t *);
extern int proc_do_static_key(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp,
loff_t *ppos);
/* /*
* Register a set of sysctl names by calling register_sysctl_table * Register a set of sysctl names by calling register_sysctl_table
@ -246,7 +237,7 @@ static inline void setup_sysctl_set(struct ctl_table_set *p,
#endif /* CONFIG_SYSCTL */ #endif /* CONFIG_SYSCTL */
int sysctl_max_threads(struct ctl_table *table, int write, int sysctl_max_threads(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos); size_t *lenp, loff_t *ppos);
#endif /* _LINUX_SYSCTL_H */ #endif /* _LINUX_SYSCTL_H */

View File

@ -201,8 +201,7 @@ struct ctl_table;
extern unsigned int sysctl_timer_migration; extern unsigned int sysctl_timer_migration;
int timer_migration_handler(struct ctl_table *table, int write, int timer_migration_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos);
#endif #endif
unsigned long __round_jiffies(unsigned long j, int cpu); unsigned long __round_jiffies(unsigned long j, int cpu);

View File

@ -16,8 +16,8 @@ extern int sysctl_stat_interval;
#define DISABLE_NUMA_STAT 0 #define DISABLE_NUMA_STAT 0
extern int sysctl_vm_numa_stat; extern int sysctl_vm_numa_stat;
DECLARE_STATIC_KEY_TRUE(vm_numa_stat_key); DECLARE_STATIC_KEY_TRUE(vm_numa_stat_key);
extern int sysctl_vm_numa_stat_handler(struct ctl_table *table, int sysctl_vm_numa_stat_handler(struct ctl_table *table, int write,
int write, void __user *buffer, size_t *length, loff_t *ppos); void *buffer, size_t *length, loff_t *ppos);
#endif #endif
struct reclaim_stat { struct reclaim_stat {
@ -274,8 +274,8 @@ void cpu_vm_stats_fold(int cpu);
void refresh_zone_stat_thresholds(void); void refresh_zone_stat_thresholds(void);
struct ctl_table; struct ctl_table;
int vmstat_refresh(struct ctl_table *, int write, int vmstat_refresh(struct ctl_table *, int write, void *buffer, size_t *lenp,
void __user *buffer, size_t *lenp, loff_t *ppos); loff_t *ppos);
void drain_zonestat(struct zone *zone, struct per_cpu_pageset *); void drain_zonestat(struct zone *zone, struct per_cpu_pageset *);

View File

@ -362,24 +362,18 @@ extern int vm_highmem_is_dirtyable;
extern int block_dump; extern int block_dump;
extern int laptop_mode; extern int laptop_mode;
extern int dirty_background_ratio_handler(struct ctl_table *table, int write, int dirty_background_ratio_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos); int dirty_background_bytes_handler(struct ctl_table *table, int write,
extern int dirty_background_bytes_handler(struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos);
void __user *buffer, size_t *lenp, int dirty_ratio_handler(struct ctl_table *table, int write,
loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
extern int dirty_ratio_handler(struct ctl_table *table, int write, int dirty_bytes_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos);
extern int dirty_bytes_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp,
loff_t *ppos);
int dirtytime_interval_handler(struct ctl_table *table, int write, int dirtytime_interval_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
int dirty_writeback_centisecs_handler(struct ctl_table *table, int write,
struct ctl_table; void *buffer, size_t *lenp, loff_t *ppos);
int dirty_writeback_centisecs_handler(struct ctl_table *, int,
void __user *, size_t *, loff_t *);
void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty); void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty);
unsigned long wb_calc_thresh(struct bdi_writeback *wb, unsigned long thresh); unsigned long wb_calc_thresh(struct bdi_writeback *wb, unsigned long thresh);

View File

@ -24,7 +24,7 @@ static void *get_ipc(struct ctl_table *table)
#ifdef CONFIG_PROC_SYSCTL #ifdef CONFIG_PROC_SYSCTL
static int proc_ipc_dointvec(struct ctl_table *table, int write, static int proc_ipc_dointvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table ipc_table; struct ctl_table ipc_table;
@ -35,7 +35,7 @@ static int proc_ipc_dointvec(struct ctl_table *table, int write,
} }
static int proc_ipc_dointvec_minmax(struct ctl_table *table, int write, static int proc_ipc_dointvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table ipc_table; struct ctl_table ipc_table;
@ -46,7 +46,7 @@ static int proc_ipc_dointvec_minmax(struct ctl_table *table, int write,
} }
static int proc_ipc_dointvec_minmax_orphans(struct ctl_table *table, int write, static int proc_ipc_dointvec_minmax_orphans(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ipc_namespace *ns = current->nsproxy->ipc_ns; struct ipc_namespace *ns = current->nsproxy->ipc_ns;
int err = proc_ipc_dointvec_minmax(table, write, buffer, lenp, ppos); int err = proc_ipc_dointvec_minmax(table, write, buffer, lenp, ppos);
@ -59,7 +59,7 @@ static int proc_ipc_dointvec_minmax_orphans(struct ctl_table *table, int write,
} }
static int proc_ipc_doulongvec_minmax(struct ctl_table *table, int write, static int proc_ipc_doulongvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table ipc_table; struct ctl_table ipc_table;
memcpy(&ipc_table, table, sizeof(ipc_table)); memcpy(&ipc_table, table, sizeof(ipc_table));
@ -70,7 +70,7 @@ static int proc_ipc_doulongvec_minmax(struct ctl_table *table, int write,
} }
static int proc_ipc_auto_msgmni(struct ctl_table *table, int write, static int proc_ipc_auto_msgmni(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table ipc_table; struct ctl_table ipc_table;
int dummy = 0; int dummy = 0;

View File

@ -19,7 +19,7 @@ static void *get_mq(struct ctl_table *table)
} }
static int proc_mq_dointvec(struct ctl_table *table, int write, static int proc_mq_dointvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table mq_table; struct ctl_table mq_table;
memcpy(&mq_table, table, sizeof(mq_table)); memcpy(&mq_table, table, sizeof(mq_table));
@ -29,7 +29,7 @@ static int proc_mq_dointvec(struct ctl_table *table, int write,
} }
static int proc_mq_dointvec_minmax(struct ctl_table *table, int write, static int proc_mq_dointvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table mq_table; struct ctl_table mq_table;
memcpy(&mq_table, table, sizeof(mq_table)); memcpy(&mq_table, table, sizeof(mq_table));

View File

@ -1137,16 +1137,13 @@ const struct bpf_verifier_ops cg_dev_verifier_ops = {
* @head: sysctl table header * @head: sysctl table header
* @table: sysctl table * @table: sysctl table
* @write: sysctl is being read (= 0) or written (= 1) * @write: sysctl is being read (= 0) or written (= 1)
* @buf: pointer to buffer passed by user space * @buf: pointer to buffer (in and out)
* @pcount: value-result argument: value is size of buffer pointed to by @buf, * @pcount: value-result argument: value is size of buffer pointed to by @buf,
* result is size of @new_buf if program set new value, initial value * result is size of @new_buf if program set new value, initial value
* otherwise * otherwise
* @ppos: value-result argument: value is position at which read from or write * @ppos: value-result argument: value is position at which read from or write
* to sysctl is happening, result is new position if program overrode it, * to sysctl is happening, result is new position if program overrode it,
* initial value otherwise * initial value otherwise
* @new_buf: pointer to pointer to new buffer that will be allocated if program
* overrides new value provided by user space on sysctl write
* NOTE: it's caller responsibility to free *new_buf if it was set
* @type: type of program to be executed * @type: type of program to be executed
* *
* Program is run when sysctl is being accessed, either read or written, and * Program is run when sysctl is being accessed, either read or written, and
@ -1157,8 +1154,7 @@ const struct bpf_verifier_ops cg_dev_verifier_ops = {
*/ */
int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head, int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head,
struct ctl_table *table, int write, struct ctl_table *table, int write,
void __user *buf, size_t *pcount, void **buf, size_t *pcount, loff_t *ppos,
loff_t *ppos, void **new_buf,
enum bpf_attach_type type) enum bpf_attach_type type)
{ {
struct bpf_sysctl_kern ctx = { struct bpf_sysctl_kern ctx = {
@ -1173,36 +1169,28 @@ int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head,
.new_updated = 0, .new_updated = 0,
}; };
struct cgroup *cgrp; struct cgroup *cgrp;
loff_t pos = 0;
int ret; int ret;
ctx.cur_val = kmalloc_track_caller(ctx.cur_len, GFP_KERNEL); ctx.cur_val = kmalloc_track_caller(ctx.cur_len, GFP_KERNEL);
if (ctx.cur_val) { if (!ctx.cur_val ||
mm_segment_t old_fs; table->proc_handler(table, 0, ctx.cur_val, &ctx.cur_len, &pos)) {
loff_t pos = 0;
old_fs = get_fs();
set_fs(KERNEL_DS);
if (table->proc_handler(table, 0, (void __user *)ctx.cur_val,
&ctx.cur_len, &pos)) {
/* Let BPF program decide how to proceed. */
ctx.cur_len = 0;
}
set_fs(old_fs);
} else {
/* Let BPF program decide how to proceed. */ /* Let BPF program decide how to proceed. */
ctx.cur_len = 0; ctx.cur_len = 0;
} }
if (write && buf && *pcount) { if (write && *buf && *pcount) {
/* BPF program should be able to override new value with a /* BPF program should be able to override new value with a
* buffer bigger than provided by user. * buffer bigger than provided by user.
*/ */
ctx.new_val = kmalloc_track_caller(PAGE_SIZE, GFP_KERNEL); ctx.new_val = kmalloc_track_caller(PAGE_SIZE, GFP_KERNEL);
ctx.new_len = min_t(size_t, PAGE_SIZE, *pcount); ctx.new_len = min_t(size_t, PAGE_SIZE, *pcount);
if (!ctx.new_val || if (ctx.new_val) {
copy_from_user(ctx.new_val, buf, ctx.new_len)) memcpy(ctx.new_val, *buf, ctx.new_len);
} else {
/* Let BPF program decide how to proceed. */ /* Let BPF program decide how to proceed. */
ctx.new_len = 0; ctx.new_len = 0;
}
} }
rcu_read_lock(); rcu_read_lock();
@ -1213,7 +1201,8 @@ int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head,
kfree(ctx.cur_val); kfree(ctx.cur_val);
if (ret == 1 && ctx.new_updated) { if (ret == 1 && ctx.new_updated) {
*new_buf = ctx.new_val; kfree(*buf);
*buf = ctx.new_val;
*pcount = ctx.new_len; *pcount = ctx.new_len;
} else { } else {
kfree(ctx.new_val); kfree(ctx.new_val);

View File

@ -236,7 +236,7 @@ exit_put:
* sysctl_perf_event_max_contexts_per_stack. * sysctl_perf_event_max_contexts_per_stack.
*/ */
int perf_event_max_stack_handler(struct ctl_table *table, int write, int perf_event_max_stack_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int *value = table->data; int *value = table->data;
int new_value = *value, ret; int new_value = *value, ret;

View File

@ -437,8 +437,7 @@ static void update_perf_cpu_limits(void)
static bool perf_rotate_context(struct perf_cpu_context *cpuctx); static bool perf_rotate_context(struct perf_cpu_context *cpuctx);
int perf_proc_update_handler(struct ctl_table *table, int write, int perf_proc_update_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret; int ret;
int perf_cpu = sysctl_perf_cpu_time_max_percent; int perf_cpu = sysctl_perf_cpu_time_max_percent;
@ -462,8 +461,7 @@ int perf_proc_update_handler(struct ctl_table *table, int write,
int sysctl_perf_cpu_time_max_percent __read_mostly = DEFAULT_CPU_TIME_MAX_PERCENT; int sysctl_perf_cpu_time_max_percent __read_mostly = DEFAULT_CPU_TIME_MAX_PERCENT;
int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write, int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);

View File

@ -892,7 +892,7 @@ static void unoptimize_all_kprobes(void)
static DEFINE_MUTEX(kprobe_sysctl_mutex); static DEFINE_MUTEX(kprobe_sysctl_mutex);
int sysctl_kprobes_optimization; int sysctl_kprobes_optimization;
int proc_kprobes_optimization_handler(struct ctl_table *table, int write, int proc_kprobes_optimization_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, void *buffer, size_t *length,
loff_t *ppos) loff_t *ppos)
{ {
int ret; int ret;

View File

@ -269,8 +269,8 @@ static int __init init_lstats_procfs(void)
return 0; return 0;
} }
int sysctl_latencytop(struct ctl_table *table, int write, int sysctl_latencytop(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
int err; int err;

View File

@ -263,7 +263,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)
#ifdef CONFIG_CHECKPOINT_RESTORE #ifdef CONFIG_CHECKPOINT_RESTORE
static int pid_ns_ctl_handler(struct ctl_table *table, int write, static int pid_ns_ctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct pid_namespace *pid_ns = task_active_pid_ns(current); struct pid_namespace *pid_ns = task_active_pid_ns(current);
struct ctl_table tmp = *table; struct ctl_table tmp = *table;

View File

@ -173,7 +173,7 @@ __setup("printk.devkmsg=", control_devkmsg);
char devkmsg_log_str[DEVKMSG_STR_MAX_SIZE] = "ratelimit"; char devkmsg_log_str[DEVKMSG_STR_MAX_SIZE] = "ratelimit";
int devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write, int devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
char old_str[DEVKMSG_STR_MAX_SIZE]; char old_str[DEVKMSG_STR_MAX_SIZE];
unsigned int old; unsigned int old;

View File

@ -1110,8 +1110,7 @@ static void uclamp_update_root_tg(void) { }
#endif #endif
int sysctl_sched_uclamp_handler(struct ctl_table *table, int write, int sysctl_sched_uclamp_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
bool update_root_tg = false; bool update_root_tg = false;
int old_min, old_max; int old_min, old_max;
@ -2723,7 +2722,7 @@ void set_numabalancing_state(bool enabled)
#ifdef CONFIG_PROC_SYSCTL #ifdef CONFIG_PROC_SYSCTL
int sysctl_numa_balancing(struct ctl_table *table, int write, int sysctl_numa_balancing(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table t; struct ctl_table t;
int err; int err;
@ -2797,8 +2796,8 @@ static void __init init_schedstats(void)
} }
#ifdef CONFIG_PROC_SYSCTL #ifdef CONFIG_PROC_SYSCTL
int sysctl_schedstats(struct ctl_table *table, int write, int sysctl_schedstats(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
struct ctl_table t; struct ctl_table t;
int err; int err;

View File

@ -645,8 +645,7 @@ struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq)
*/ */
int sched_proc_update_handler(struct ctl_table *table, int write, int sched_proc_update_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
unsigned int factor = get_update_sysctl_factor(); unsigned int factor = get_update_sysctl_factor();

View File

@ -2714,9 +2714,8 @@ static void sched_rt_do_global(void)
def_rt_bandwidth.rt_period = ns_to_ktime(global_rt_period()); def_rt_bandwidth.rt_period = ns_to_ktime(global_rt_period());
} }
int sched_rt_handler(struct ctl_table *table, int write, int sched_rt_handler(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int old_period, old_runtime; int old_period, old_runtime;
static DEFINE_MUTEX(mutex); static DEFINE_MUTEX(mutex);
@ -2754,9 +2753,8 @@ undo:
return ret; return ret;
} }
int sched_rr_handler(struct ctl_table *table, int write, int sched_rr_handler(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret; int ret;
static DEFINE_MUTEX(mutex); static DEFINE_MUTEX(mutex);

View File

@ -209,7 +209,7 @@ bool sched_energy_update;
#ifdef CONFIG_PROC_SYSCTL #ifdef CONFIG_PROC_SYSCTL
int sched_energy_aware_handler(struct ctl_table *table, int write, int sched_energy_aware_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int ret, state; int ret, state;

View File

@ -1776,7 +1776,7 @@ static void audit_actions_logged(u32 actions_logged, u32 old_actions_logged,
} }
static int seccomp_actions_logged_handler(struct ctl_table *ro_table, int write, static int seccomp_actions_logged_handler(struct ctl_table *ro_table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
int ret; int ret;

View File

@ -208,12 +208,10 @@ static int max_extfrag_threshold = 1000;
#ifdef CONFIG_PROC_SYSCTL #ifdef CONFIG_PROC_SYSCTL
static int _proc_do_string(char *data, int maxlen, int write, static int _proc_do_string(char *data, int maxlen, int write,
char __user *buffer, char *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
size_t len; size_t len;
char __user *p; char c, *p;
char c;
if (!data || !maxlen || !*lenp) { if (!data || !maxlen || !*lenp) {
*lenp = 0; *lenp = 0;
@ -238,8 +236,7 @@ static int _proc_do_string(char *data, int maxlen, int write,
*ppos += *lenp; *ppos += *lenp;
p = buffer; p = buffer;
while ((p - buffer) < *lenp && len < maxlen - 1) { while ((p - buffer) < *lenp && len < maxlen - 1) {
if (get_user(c, p++)) c = *(p++);
return -EFAULT;
if (c == 0 || c == '\n') if (c == 0 || c == '\n')
break; break;
data[len++] = c; data[len++] = c;
@ -261,11 +258,9 @@ static int _proc_do_string(char *data, int maxlen, int write,
if (len > *lenp) if (len > *lenp)
len = *lenp; len = *lenp;
if (len) if (len)
if (copy_to_user(buffer, data, len)) memcpy(buffer, data, len);
return -EFAULT;
if (len < *lenp) { if (len < *lenp) {
if (put_user('\n', buffer + len)) buffer[len] = '\n';
return -EFAULT;
len++; len++;
} }
*lenp = len; *lenp = len;
@ -326,13 +321,13 @@ static bool proc_first_pos_non_zero_ignore(loff_t *ppos,
* Returns 0 on success. * Returns 0 on success.
*/ */
int proc_dostring(struct ctl_table *table, int write, int proc_dostring(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
if (write) if (write)
proc_first_pos_non_zero_ignore(ppos, table); proc_first_pos_non_zero_ignore(ppos, table);
return _proc_do_string((char *)(table->data), table->maxlen, write, return _proc_do_string(table->data, table->maxlen, write, buffer, lenp,
(char __user *)buffer, lenp, ppos); ppos);
} }
static size_t proc_skip_spaces(char **buf) static size_t proc_skip_spaces(char **buf)
@ -463,11 +458,10 @@ static int proc_get_long(char **buf, size_t *size,
* @val: the integer to be converted * @val: the integer to be converted
* @neg: sign of the number, %TRUE for negative * @neg: sign of the number, %TRUE for negative
* *
* In case of success %0 is returned and @buf and @size are updated with * In case of success @buf and @size are updated with the amount of bytes
* the amount of bytes written. * written.
*/ */
static int proc_put_long(void __user **buf, size_t *size, unsigned long val, static void proc_put_long(void **buf, size_t *size, unsigned long val, bool neg)
bool neg)
{ {
int len; int len;
char tmp[TMPBUFLEN], *p = tmp; char tmp[TMPBUFLEN], *p = tmp;
@ -476,24 +470,22 @@ static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
len = strlen(tmp); len = strlen(tmp);
if (len > *size) if (len > *size)
len = *size; len = *size;
if (copy_to_user(*buf, tmp, len)) memcpy(*buf, tmp, len);
return -EFAULT;
*size -= len; *size -= len;
*buf += len; *buf += len;
return 0;
} }
#undef TMPBUFLEN #undef TMPBUFLEN
static int proc_put_char(void __user **buf, size_t *size, char c) static void proc_put_char(void **buf, size_t *size, char c)
{ {
if (*size) { if (*size) {
char __user **buffer = (char __user **)buf; char **buffer = (char **)buf;
if (put_user(c, *buffer)) **buffer = c;
return -EFAULT;
(*size)--, (*buffer)++; (*size)--;
(*buffer)++;
*buf = *buffer; *buf = *buffer;
} }
return 0;
} }
static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp, static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
@ -541,7 +533,7 @@ static int do_proc_douintvec_conv(unsigned long *lvalp,
static const char proc_wspace_sep[] = { ' ', '\t', '\n' }; static const char proc_wspace_sep[] = { ' ', '\t', '\n' };
static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table, static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
int write, void __user *buffer, int write, void *buffer,
size_t *lenp, loff_t *ppos, size_t *lenp, loff_t *ppos,
int (*conv)(bool *negp, unsigned long *lvalp, int *valp, int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
int write, void *data), int write, void *data),
@ -549,7 +541,7 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
{ {
int *i, vleft, first = 1, err = 0; int *i, vleft, first = 1, err = 0;
size_t left; size_t left;
char *kbuf = NULL, *p; char *p;
if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) { if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) {
*lenp = 0; *lenp = 0;
@ -569,9 +561,7 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
if (left > PAGE_SIZE - 1) if (left > PAGE_SIZE - 1)
left = PAGE_SIZE - 1; left = PAGE_SIZE - 1;
p = kbuf = memdup_user_nul(buffer, left); p = buffer;
if (IS_ERR(kbuf))
return PTR_ERR(kbuf);
} }
for (; left && vleft--; i++, first=0) { for (; left && vleft--; i++, first=0) {
@ -598,24 +588,17 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
break; break;
} }
if (!first) if (!first)
err = proc_put_char(&buffer, &left, '\t'); proc_put_char(&buffer, &left, '\t');
if (err) proc_put_long(&buffer, &left, lval, neg);
break;
err = proc_put_long(&buffer, &left, lval, neg);
if (err)
break;
} }
} }
if (!write && !first && left && !err) if (!write && !first && left && !err)
err = proc_put_char(&buffer, &left, '\n'); proc_put_char(&buffer, &left, '\n');
if (write && !err && left) if (write && !err && left)
left -= proc_skip_spaces(&p); left -= proc_skip_spaces(&p);
if (write) { if (write && first)
kfree(kbuf); return err ? : -EINVAL;
if (first)
return err ? : -EINVAL;
}
*lenp -= left; *lenp -= left;
out: out:
*ppos += *lenp; *ppos += *lenp;
@ -623,7 +606,7 @@ out:
} }
static int do_proc_dointvec(struct ctl_table *table, int write, static int do_proc_dointvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos, void *buffer, size_t *lenp, loff_t *ppos,
int (*conv)(bool *negp, unsigned long *lvalp, int *valp, int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
int write, void *data), int write, void *data),
void *data) void *data)
@ -634,7 +617,7 @@ static int do_proc_dointvec(struct ctl_table *table, int write,
static int do_proc_douintvec_w(unsigned int *tbl_data, static int do_proc_douintvec_w(unsigned int *tbl_data,
struct ctl_table *table, struct ctl_table *table,
void __user *buffer, void *buffer,
size_t *lenp, loff_t *ppos, size_t *lenp, loff_t *ppos,
int (*conv)(unsigned long *lvalp, int (*conv)(unsigned long *lvalp,
unsigned int *valp, unsigned int *valp,
@ -645,7 +628,7 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
int err = 0; int err = 0;
size_t left; size_t left;
bool neg; bool neg;
char *kbuf = NULL, *p; char *p = buffer;
left = *lenp; left = *lenp;
@ -655,10 +638,6 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
if (left > PAGE_SIZE - 1) if (left > PAGE_SIZE - 1)
left = PAGE_SIZE - 1; left = PAGE_SIZE - 1;
p = kbuf = memdup_user_nul(buffer, left);
if (IS_ERR(kbuf))
return -EINVAL;
left -= proc_skip_spaces(&p); left -= proc_skip_spaces(&p);
if (!left) { if (!left) {
err = -EINVAL; err = -EINVAL;
@ -682,7 +661,6 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
left -= proc_skip_spaces(&p); left -= proc_skip_spaces(&p);
out_free: out_free:
kfree(kbuf);
if (err) if (err)
return -EINVAL; return -EINVAL;
@ -694,7 +672,7 @@ bail_early:
return err; return err;
} }
static int do_proc_douintvec_r(unsigned int *tbl_data, void __user *buffer, static int do_proc_douintvec_r(unsigned int *tbl_data, void *buffer,
size_t *lenp, loff_t *ppos, size_t *lenp, loff_t *ppos,
int (*conv)(unsigned long *lvalp, int (*conv)(unsigned long *lvalp,
unsigned int *valp, unsigned int *valp,
@ -712,11 +690,11 @@ static int do_proc_douintvec_r(unsigned int *tbl_data, void __user *buffer,
goto out; goto out;
} }
err = proc_put_long(&buffer, &left, lval, false); proc_put_long(&buffer, &left, lval, false);
if (err || !left) if (!left)
goto out; goto out;
err = proc_put_char(&buffer, &left, '\n'); proc_put_char(&buffer, &left, '\n');
out: out:
*lenp -= left; *lenp -= left;
@ -726,7 +704,7 @@ out:
} }
static int __do_proc_douintvec(void *tbl_data, struct ctl_table *table, static int __do_proc_douintvec(void *tbl_data, struct ctl_table *table,
int write, void __user *buffer, int write, void *buffer,
size_t *lenp, loff_t *ppos, size_t *lenp, loff_t *ppos,
int (*conv)(unsigned long *lvalp, int (*conv)(unsigned long *lvalp,
unsigned int *valp, unsigned int *valp,
@ -762,7 +740,7 @@ static int __do_proc_douintvec(void *tbl_data, struct ctl_table *table,
} }
static int do_proc_douintvec(struct ctl_table *table, int write, static int do_proc_douintvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos, void *buffer, size_t *lenp, loff_t *ppos,
int (*conv)(unsigned long *lvalp, int (*conv)(unsigned long *lvalp,
unsigned int *valp, unsigned int *valp,
int write, void *data), int write, void *data),
@ -785,16 +763,15 @@ static int do_proc_douintvec(struct ctl_table *table, int write,
* *
* Returns 0 on success. * Returns 0 on success.
*/ */
int proc_dointvec(struct ctl_table *table, int write, int proc_dointvec(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
return do_proc_dointvec(table, write, buffer, lenp, ppos, NULL, NULL); return do_proc_dointvec(table, write, buffer, lenp, ppos, NULL, NULL);
} }
#ifdef CONFIG_COMPACTION #ifdef CONFIG_COMPACTION
static int proc_dointvec_minmax_warn_RT_change(struct ctl_table *table, static int proc_dointvec_minmax_warn_RT_change(struct ctl_table *table,
int write, void __user *buffer, int write, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
int ret, old; int ret, old;
@ -826,8 +803,8 @@ static int proc_dointvec_minmax_warn_RT_change(struct ctl_table *table,
* *
* Returns 0 on success. * Returns 0 on success.
*/ */
int proc_douintvec(struct ctl_table *table, int write, int proc_douintvec(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
return do_proc_douintvec(table, write, buffer, lenp, ppos, return do_proc_douintvec(table, write, buffer, lenp, ppos,
do_proc_douintvec_conv, NULL); do_proc_douintvec_conv, NULL);
@ -838,7 +815,7 @@ int proc_douintvec(struct ctl_table *table, int write,
* This means we can safely use a temporary. * This means we can safely use a temporary.
*/ */
static int proc_taint(struct ctl_table *table, int write, static int proc_taint(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table t; struct ctl_table t;
unsigned long tmptaint = get_taint(); unsigned long tmptaint = get_taint();
@ -870,7 +847,7 @@ static int proc_taint(struct ctl_table *table, int write,
#ifdef CONFIG_PRINTK #ifdef CONFIG_PRINTK
static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write, static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
if (write && !capable(CAP_SYS_ADMIN)) if (write && !capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
@ -936,7 +913,7 @@ static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp,
* Returns 0 on success or -EINVAL on write when the range check fails. * Returns 0 on success or -EINVAL on write when the range check fails.
*/ */
int proc_dointvec_minmax(struct ctl_table *table, int write, int proc_dointvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct do_proc_dointvec_minmax_conv_param param = { struct do_proc_dointvec_minmax_conv_param param = {
.min = (int *) table->extra1, .min = (int *) table->extra1,
@ -1005,7 +982,7 @@ static int do_proc_douintvec_minmax_conv(unsigned long *lvalp,
* Returns 0 on success or -ERANGE on write when the range check fails. * Returns 0 on success or -ERANGE on write when the range check fails.
*/ */
int proc_douintvec_minmax(struct ctl_table *table, int write, int proc_douintvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct do_proc_douintvec_minmax_conv_param param = { struct do_proc_douintvec_minmax_conv_param param = {
.min = (unsigned int *) table->extra1, .min = (unsigned int *) table->extra1,
@ -1036,7 +1013,7 @@ static int do_proc_dopipe_max_size_conv(unsigned long *lvalp,
} }
static int proc_dopipe_max_size(struct ctl_table *table, int write, static int proc_dopipe_max_size(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return do_proc_douintvec(table, write, buffer, lenp, ppos, return do_proc_douintvec(table, write, buffer, lenp, ppos,
do_proc_dopipe_max_size_conv, NULL); do_proc_dopipe_max_size_conv, NULL);
@ -1057,7 +1034,7 @@ static void validate_coredump_safety(void)
} }
static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int error = proc_dointvec_minmax(table, write, buffer, lenp, ppos); int error = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
if (!error) if (!error)
@ -1067,7 +1044,7 @@ static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write,
#ifdef CONFIG_COREDUMP #ifdef CONFIG_COREDUMP
static int proc_dostring_coredump(struct ctl_table *table, int write, static int proc_dostring_coredump(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int error = proc_dostring(table, write, buffer, lenp, ppos); int error = proc_dostring(table, write, buffer, lenp, ppos);
if (!error) if (!error)
@ -1078,7 +1055,7 @@ static int proc_dostring_coredump(struct ctl_table *table, int write,
#ifdef CONFIG_MAGIC_SYSRQ #ifdef CONFIG_MAGIC_SYSRQ
static int sysrq_sysctl_handler(struct ctl_table *table, int write, static int sysrq_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int tmp, ret; int tmp, ret;
@ -1096,16 +1073,14 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write,
} }
#endif #endif
static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write, static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table,
void __user *buffer, int write, void *buffer, size_t *lenp, loff_t *ppos,
size_t *lenp, loff_t *ppos, unsigned long convmul, unsigned long convdiv)
unsigned long convmul,
unsigned long convdiv)
{ {
unsigned long *i, *min, *max; unsigned long *i, *min, *max;
int vleft, first = 1, err = 0; int vleft, first = 1, err = 0;
size_t left; size_t left;
char *kbuf = NULL, *p; char *p;
if (!data || !table->maxlen || !*lenp || (*ppos && !write)) { if (!data || !table->maxlen || !*lenp || (*ppos && !write)) {
*lenp = 0; *lenp = 0;
@ -1124,9 +1099,7 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int
if (left > PAGE_SIZE - 1) if (left > PAGE_SIZE - 1)
left = PAGE_SIZE - 1; left = PAGE_SIZE - 1;
p = kbuf = memdup_user_nul(buffer, left); p = buffer;
if (IS_ERR(kbuf))
return PTR_ERR(kbuf);
} }
for (; left && vleft--; i++, first = 0) { for (; left && vleft--; i++, first = 0) {
@ -1154,26 +1127,18 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int
*i = val; *i = val;
} else { } else {
val = convdiv * (*i) / convmul; val = convdiv * (*i) / convmul;
if (!first) { if (!first)
err = proc_put_char(&buffer, &left, '\t'); proc_put_char(&buffer, &left, '\t');
if (err) proc_put_long(&buffer, &left, val, false);
break;
}
err = proc_put_long(&buffer, &left, val, false);
if (err)
break;
} }
} }
if (!write && !first && left && !err) if (!write && !first && left && !err)
err = proc_put_char(&buffer, &left, '\n'); proc_put_char(&buffer, &left, '\n');
if (write && !err) if (write && !err)
left -= proc_skip_spaces(&p); left -= proc_skip_spaces(&p);
if (write) { if (write && first)
kfree(kbuf); return err ? : -EINVAL;
if (first)
return err ? : -EINVAL;
}
*lenp -= left; *lenp -= left;
out: out:
*ppos += *lenp; *ppos += *lenp;
@ -1181,10 +1146,8 @@ out:
} }
static int do_proc_doulongvec_minmax(struct ctl_table *table, int write, static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos, unsigned long convmul,
size_t *lenp, loff_t *ppos, unsigned long convdiv)
unsigned long convmul,
unsigned long convdiv)
{ {
return __do_proc_doulongvec_minmax(table->data, table, write, return __do_proc_doulongvec_minmax(table->data, table, write,
buffer, lenp, ppos, convmul, convdiv); buffer, lenp, ppos, convmul, convdiv);
@ -1207,7 +1170,7 @@ static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
* Returns 0 on success. * Returns 0 on success.
*/ */
int proc_doulongvec_minmax(struct ctl_table *table, int write, int proc_doulongvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l); return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l);
} }
@ -1230,8 +1193,7 @@ int proc_doulongvec_minmax(struct ctl_table *table, int write,
* Returns 0 on success. * Returns 0 on success.
*/ */
int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write, int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
return do_proc_doulongvec_minmax(table, write, buffer, return do_proc_doulongvec_minmax(table, write, buffer,
lenp, ppos, HZ, 1000l); lenp, ppos, HZ, 1000l);
@ -1325,7 +1287,7 @@ static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp,
* Returns 0 on success. * Returns 0 on success.
*/ */
int proc_dointvec_jiffies(struct ctl_table *table, int write, int proc_dointvec_jiffies(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return do_proc_dointvec(table,write,buffer,lenp,ppos, return do_proc_dointvec(table,write,buffer,lenp,ppos,
do_proc_dointvec_jiffies_conv,NULL); do_proc_dointvec_jiffies_conv,NULL);
@ -1347,7 +1309,7 @@ int proc_dointvec_jiffies(struct ctl_table *table, int write,
* Returns 0 on success. * Returns 0 on success.
*/ */
int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write, int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return do_proc_dointvec(table,write,buffer,lenp,ppos, return do_proc_dointvec(table,write,buffer,lenp,ppos,
do_proc_dointvec_userhz_jiffies_conv,NULL); do_proc_dointvec_userhz_jiffies_conv,NULL);
@ -1369,15 +1331,15 @@ int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
* *
* Returns 0 on success. * Returns 0 on success.
*/ */
int proc_dointvec_ms_jiffies(struct ctl_table *table, int write, int proc_dointvec_ms_jiffies(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
return do_proc_dointvec(table, write, buffer, lenp, ppos, return do_proc_dointvec(table, write, buffer, lenp, ppos,
do_proc_dointvec_ms_jiffies_conv, NULL); do_proc_dointvec_ms_jiffies_conv, NULL);
} }
static int proc_do_cad_pid(struct ctl_table *table, int write, static int proc_do_cad_pid(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
struct pid *new_pid; struct pid *new_pid;
pid_t tmp; pid_t tmp;
@ -1416,7 +1378,7 @@ static int proc_do_cad_pid(struct ctl_table *table, int write,
* Returns 0 on success. * Returns 0 on success.
*/ */
int proc_do_large_bitmap(struct ctl_table *table, int write, int proc_do_large_bitmap(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int err = 0; int err = 0;
bool first = 1; bool first = 1;
@ -1432,7 +1394,7 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
} }
if (write) { if (write) {
char *kbuf, *p; char *p = buffer;
size_t skipped = 0; size_t skipped = 0;
if (left > PAGE_SIZE - 1) { if (left > PAGE_SIZE - 1) {
@ -1441,15 +1403,9 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
skipped = *lenp - left; skipped = *lenp - left;
} }
p = kbuf = memdup_user_nul(buffer, left);
if (IS_ERR(kbuf))
return PTR_ERR(kbuf);
tmp_bitmap = bitmap_zalloc(bitmap_len, GFP_KERNEL); tmp_bitmap = bitmap_zalloc(bitmap_len, GFP_KERNEL);
if (!tmp_bitmap) { if (!tmp_bitmap)
kfree(kbuf);
return -ENOMEM; return -ENOMEM;
}
proc_skip_char(&p, &left, '\n'); proc_skip_char(&p, &left, '\n');
while (!err && left) { while (!err && left) {
unsigned long val_a, val_b; unsigned long val_a, val_b;
@ -1513,7 +1469,6 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
first = 0; first = 0;
proc_skip_char(&p, &left, '\n'); proc_skip_char(&p, &left, '\n');
} }
kfree(kbuf);
left += skipped; left += skipped;
} else { } else {
unsigned long bit_a, bit_b = 0; unsigned long bit_a, bit_b = 0;
@ -1525,27 +1480,17 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
bit_b = find_next_zero_bit(bitmap, bitmap_len, bit_b = find_next_zero_bit(bitmap, bitmap_len,
bit_a + 1) - 1; bit_a + 1) - 1;
if (!first) { if (!first)
err = proc_put_char(&buffer, &left, ','); proc_put_char(&buffer, &left, ',');
if (err) proc_put_long(&buffer, &left, bit_a, false);
break;
}
err = proc_put_long(&buffer, &left, bit_a, false);
if (err)
break;
if (bit_a != bit_b) { if (bit_a != bit_b) {
err = proc_put_char(&buffer, &left, '-'); proc_put_char(&buffer, &left, '-');
if (err) proc_put_long(&buffer, &left, bit_b, false);
break;
err = proc_put_long(&buffer, &left, bit_b, false);
if (err)
break;
} }
first = 0; bit_b++; first = 0; bit_b++;
} }
if (!err) proc_put_char(&buffer, &left, '\n');
err = proc_put_char(&buffer, &left, '\n');
} }
if (!err) { if (!err) {
@ -1566,68 +1511,67 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
#else /* CONFIG_PROC_SYSCTL */ #else /* CONFIG_PROC_SYSCTL */
int proc_dostring(struct ctl_table *table, int write, int proc_dostring(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_dointvec(struct ctl_table *table, int write, int proc_dointvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_douintvec(struct ctl_table *table, int write, int proc_douintvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_dointvec_minmax(struct ctl_table *table, int write, int proc_dointvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_douintvec_minmax(struct ctl_table *table, int write, int proc_douintvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_dointvec_jiffies(struct ctl_table *table, int write, int proc_dointvec_jiffies(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write, int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_dointvec_ms_jiffies(struct ctl_table *table, int write, int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_doulongvec_minmax(struct ctl_table *table, int write, int proc_doulongvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write, int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
int proc_do_large_bitmap(struct ctl_table *table, int write, int proc_do_large_bitmap(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return -ENOSYS; return -ENOSYS;
} }
@ -1636,8 +1580,7 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
#if defined(CONFIG_SYSCTL) #if defined(CONFIG_SYSCTL)
int proc_do_static_key(struct ctl_table *table, int write, int proc_do_static_key(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct static_key *key = (struct static_key *)table->data; struct static_key *key = (struct static_key *)table->data;
static DEFINE_MUTEX(static_key_mutex); static DEFINE_MUTEX(static_key_mutex);

View File

@ -249,8 +249,7 @@ void timers_update_nohz(void)
} }
int timer_migration_handler(struct ctl_table *table, int write, int timer_migration_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret; int ret;

View File

@ -2661,7 +2661,7 @@ static void output_printk(struct trace_event_buffer *fbuffer)
} }
int tracepoint_printk_sysctl(struct ctl_table *table, int write, int tracepoint_printk_sysctl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
int save_tracepoint_printk; int save_tracepoint_printk;

View File

@ -630,7 +630,7 @@ int call_usermodehelper(const char *path, char **argv, char **envp, int wait)
EXPORT_SYMBOL(call_usermodehelper); EXPORT_SYMBOL(call_usermodehelper);
static int proc_cap_handler(struct ctl_table *table, int write, static int proc_cap_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table t; struct ctl_table t;
unsigned long cap_array[_KERNEL_CAPABILITY_U32S]; unsigned long cap_array[_KERNEL_CAPABILITY_U32S];

View File

@ -30,7 +30,7 @@ static void *get_uts(struct ctl_table *table)
* to observe. Should this be in kernel/sys.c ???? * to observe. Should this be in kernel/sys.c ????
*/ */
static int proc_do_uts_string(struct ctl_table *table, int write, static int proc_do_uts_string(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table uts_table; struct ctl_table uts_table;
int r; int r;

View File

@ -661,7 +661,7 @@ static void proc_watchdog_update(void)
* proc_soft_watchdog | soft_watchdog_user_enabled | SOFT_WATCHDOG_ENABLED * proc_soft_watchdog | soft_watchdog_user_enabled | SOFT_WATCHDOG_ENABLED
*/ */
static int proc_watchdog_common(int which, struct ctl_table *table, int write, static int proc_watchdog_common(int which, struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int err, old, *param = table->data; int err, old, *param = table->data;
@ -688,7 +688,7 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write,
* /proc/sys/kernel/watchdog * /proc/sys/kernel/watchdog
*/ */
int proc_watchdog(struct ctl_table *table, int write, int proc_watchdog(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return proc_watchdog_common(NMI_WATCHDOG_ENABLED|SOFT_WATCHDOG_ENABLED, return proc_watchdog_common(NMI_WATCHDOG_ENABLED|SOFT_WATCHDOG_ENABLED,
table, write, buffer, lenp, ppos); table, write, buffer, lenp, ppos);
@ -698,7 +698,7 @@ int proc_watchdog(struct ctl_table *table, int write,
* /proc/sys/kernel/nmi_watchdog * /proc/sys/kernel/nmi_watchdog
*/ */
int proc_nmi_watchdog(struct ctl_table *table, int write, int proc_nmi_watchdog(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
if (!nmi_watchdog_available && write) if (!nmi_watchdog_available && write)
return -ENOTSUPP; return -ENOTSUPP;
@ -710,7 +710,7 @@ int proc_nmi_watchdog(struct ctl_table *table, int write,
* /proc/sys/kernel/soft_watchdog * /proc/sys/kernel/soft_watchdog
*/ */
int proc_soft_watchdog(struct ctl_table *table, int write, int proc_soft_watchdog(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
return proc_watchdog_common(SOFT_WATCHDOG_ENABLED, return proc_watchdog_common(SOFT_WATCHDOG_ENABLED,
table, write, buffer, lenp, ppos); table, write, buffer, lenp, ppos);
@ -720,7 +720,7 @@ int proc_soft_watchdog(struct ctl_table *table, int write,
* /proc/sys/kernel/watchdog_thresh * /proc/sys/kernel/watchdog_thresh
*/ */
int proc_watchdog_thresh(struct ctl_table *table, int write, int proc_watchdog_thresh(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int err, old; int err, old;
@ -743,7 +743,7 @@ int proc_watchdog_thresh(struct ctl_table *table, int write,
* been brought online, if desired. * been brought online, if desired.
*/ */
int proc_watchdog_cpumask(struct ctl_table *table, int write, int proc_watchdog_cpumask(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int err; int err;

View File

@ -2463,7 +2463,7 @@ int sysctl_compact_memory;
* /proc/sys/vm/compact_memory * /proc/sys/vm/compact_memory
*/ */
int sysctl_compaction_handler(struct ctl_table *table, int write, int sysctl_compaction_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
if (write) if (write)
compact_nodes(); compact_nodes();

View File

@ -3352,7 +3352,7 @@ static unsigned int cpuset_mems_nr(unsigned int *array)
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
static int hugetlb_sysctl_handler_common(bool obey_mempolicy, static int hugetlb_sysctl_handler_common(bool obey_mempolicy,
struct ctl_table *table, int write, struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
struct hstate *h = &default_hstate; struct hstate *h = &default_hstate;
unsigned long tmp = h->max_huge_pages; unsigned long tmp = h->max_huge_pages;
@ -3375,7 +3375,7 @@ out:
} }
int hugetlb_sysctl_handler(struct ctl_table *table, int write, int hugetlb_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
return hugetlb_sysctl_handler_common(false, table, write, return hugetlb_sysctl_handler_common(false, table, write,
@ -3384,7 +3384,7 @@ int hugetlb_sysctl_handler(struct ctl_table *table, int write,
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
int hugetlb_mempolicy_sysctl_handler(struct ctl_table *table, int write, int hugetlb_mempolicy_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
return hugetlb_sysctl_handler_common(true, table, write, return hugetlb_sysctl_handler_common(true, table, write,
buffer, length, ppos); buffer, length, ppos);
@ -3392,8 +3392,7 @@ int hugetlb_mempolicy_sysctl_handler(struct ctl_table *table, int write,
#endif /* CONFIG_NUMA */ #endif /* CONFIG_NUMA */
int hugetlb_overcommit_handler(struct ctl_table *table, int write, int hugetlb_overcommit_handler(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *length, loff_t *ppos)
size_t *length, loff_t *ppos)
{ {
struct hstate *h = &default_hstate; struct hstate *h = &default_hstate;
unsigned long tmp; unsigned long tmp;

View File

@ -512,8 +512,7 @@ bool node_dirty_ok(struct pglist_data *pgdat)
} }
int dirty_background_ratio_handler(struct ctl_table *table, int write, int dirty_background_ratio_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret; int ret;
@ -524,8 +523,7 @@ int dirty_background_ratio_handler(struct ctl_table *table, int write,
} }
int dirty_background_bytes_handler(struct ctl_table *table, int write, int dirty_background_bytes_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret; int ret;
@ -535,9 +533,8 @@ int dirty_background_bytes_handler(struct ctl_table *table, int write,
return ret; return ret;
} }
int dirty_ratio_handler(struct ctl_table *table, int write, int dirty_ratio_handler(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int old_ratio = vm_dirty_ratio; int old_ratio = vm_dirty_ratio;
int ret; int ret;
@ -551,8 +548,7 @@ int dirty_ratio_handler(struct ctl_table *table, int write,
} }
int dirty_bytes_handler(struct ctl_table *table, int write, int dirty_bytes_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
unsigned long old_bytes = vm_dirty_bytes; unsigned long old_bytes = vm_dirty_bytes;
int ret; int ret;
@ -1972,7 +1968,7 @@ bool wb_over_bg_thresh(struct bdi_writeback *wb)
* sysctl handler for /proc/sys/vm/dirty_writeback_centisecs * sysctl handler for /proc/sys/vm/dirty_writeback_centisecs
*/ */
int dirty_writeback_centisecs_handler(struct ctl_table *table, int write, int dirty_writeback_centisecs_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
unsigned int old_interval = dirty_writeback_interval; unsigned int old_interval = dirty_writeback_interval;
int ret; int ret;

View File

@ -5546,21 +5546,11 @@ char numa_zonelist_order[] = "Node";
* sysctl handler for numa_zonelist_order * sysctl handler for numa_zonelist_order
*/ */
int numa_zonelist_order_handler(struct ctl_table *table, int write, int numa_zonelist_order_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, void *buffer, size_t *length, loff_t *ppos)
loff_t *ppos)
{ {
char *str; if (write)
int ret; return __parse_numa_zonelist_order(buffer);
return proc_dostring(table, write, buffer, length, ppos);
if (!write)
return proc_dostring(table, write, buffer, length, ppos);
str = memdup_user_nul(buffer, 16);
if (IS_ERR(str))
return PTR_ERR(str);
ret = __parse_numa_zonelist_order(str);
kfree(str);
return ret;
} }
@ -7963,7 +7953,7 @@ core_initcall(init_per_zone_wmark_min)
* changes. * changes.
*/ */
int min_free_kbytes_sysctl_handler(struct ctl_table *table, int write, int min_free_kbytes_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
int rc; int rc;
@ -7979,7 +7969,7 @@ int min_free_kbytes_sysctl_handler(struct ctl_table *table, int write,
} }
int watermark_scale_factor_sysctl_handler(struct ctl_table *table, int write, int watermark_scale_factor_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
int rc; int rc;
@ -8009,7 +7999,7 @@ static void setup_min_unmapped_ratio(void)
int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *table, int write, int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
int rc; int rc;
@ -8036,7 +8026,7 @@ static void setup_min_slab_ratio(void)
} }
int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *table, int write, int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
int rc; int rc;
@ -8060,7 +8050,7 @@ int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *table, int write,
* if in function of the boot time zone sizes. * if in function of the boot time zone sizes.
*/ */
int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *table, int write, int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
proc_dointvec_minmax(table, write, buffer, length, ppos); proc_dointvec_minmax(table, write, buffer, length, ppos);
setup_per_zone_lowmem_reserve(); setup_per_zone_lowmem_reserve();
@ -8082,7 +8072,7 @@ static void __zone_pcp_update(struct zone *zone)
* pagelist can have before it gets flushed back to buddy allocator. * pagelist can have before it gets flushed back to buddy allocator.
*/ */
int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *table, int write, int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
struct zone *zone; struct zone *zone;
int old_percpu_pagelist_fraction; int old_percpu_pagelist_fraction;

View File

@ -717,9 +717,8 @@ int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT;
unsigned long sysctl_user_reserve_kbytes __read_mostly = 1UL << 17; /* 128MB */ unsigned long sysctl_user_reserve_kbytes __read_mostly = 1UL << 17; /* 128MB */
unsigned long sysctl_admin_reserve_kbytes __read_mostly = 1UL << 13; /* 8MB */ unsigned long sysctl_admin_reserve_kbytes __read_mostly = 1UL << 13; /* 8MB */
int overcommit_ratio_handler(struct ctl_table *table, int write, int overcommit_ratio_handler(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret; int ret;
@ -729,9 +728,8 @@ int overcommit_ratio_handler(struct ctl_table *table, int write,
return ret; return ret;
} }
int overcommit_kbytes_handler(struct ctl_table *table, int write, int overcommit_kbytes_handler(struct ctl_table *table, int write, void *buffer,
void __user *buffer, size_t *lenp, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
int ret; int ret;

View File

@ -76,7 +76,7 @@ static void invalid_numa_statistics(void)
static DEFINE_MUTEX(vm_numa_stat_lock); static DEFINE_MUTEX(vm_numa_stat_lock);
int sysctl_vm_numa_stat_handler(struct ctl_table *table, int write, int sysctl_vm_numa_stat_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *length, loff_t *ppos) void *buffer, size_t *length, loff_t *ppos)
{ {
int ret, oldval; int ret, oldval;
@ -1751,7 +1751,7 @@ static void refresh_vm_stats(struct work_struct *work)
} }
int vmstat_refresh(struct ctl_table *table, int write, int vmstat_refresh(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
long val; long val;
int err; int err;

View File

@ -1027,7 +1027,7 @@ int br_nf_hook_thresh(unsigned int hook, struct net *net,
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
static static
int brnf_sysctl_call_tables(struct ctl_table *ctl, int write, int brnf_sysctl_call_tables(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int ret; int ret;

View File

@ -3379,7 +3379,7 @@ EXPORT_SYMBOL(neigh_app_ns);
static int unres_qlen_max = INT_MAX / SKB_TRUESIZE(ETH_FRAME_LEN); static int unres_qlen_max = INT_MAX / SKB_TRUESIZE(ETH_FRAME_LEN);
static int proc_unres_qlen(struct ctl_table *ctl, int write, static int proc_unres_qlen(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int size, ret; int size, ret;
struct ctl_table tmp = *ctl; struct ctl_table tmp = *ctl;
@ -3443,8 +3443,8 @@ static void neigh_proc_update(struct ctl_table *ctl, int write)
} }
static int neigh_proc_dointvec_zero_intmax(struct ctl_table *ctl, int write, static int neigh_proc_dointvec_zero_intmax(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp,
size_t *lenp, loff_t *ppos) loff_t *ppos)
{ {
struct ctl_table tmp = *ctl; struct ctl_table tmp = *ctl;
int ret; int ret;
@ -3457,8 +3457,8 @@ static int neigh_proc_dointvec_zero_intmax(struct ctl_table *ctl, int write,
return ret; return ret;
} }
int neigh_proc_dointvec(struct ctl_table *ctl, int write, int neigh_proc_dointvec(struct ctl_table *ctl, int write, void *buffer,
void __user *buffer, size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
@ -3467,8 +3467,7 @@ int neigh_proc_dointvec(struct ctl_table *ctl, int write,
} }
EXPORT_SYMBOL(neigh_proc_dointvec); EXPORT_SYMBOL(neigh_proc_dointvec);
int neigh_proc_dointvec_jiffies(struct ctl_table *ctl, int write, int neigh_proc_dointvec_jiffies(struct ctl_table *ctl, int write, void *buffer,
void __user *buffer,
size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
int ret = proc_dointvec_jiffies(ctl, write, buffer, lenp, ppos); int ret = proc_dointvec_jiffies(ctl, write, buffer, lenp, ppos);
@ -3479,8 +3478,8 @@ int neigh_proc_dointvec_jiffies(struct ctl_table *ctl, int write,
EXPORT_SYMBOL(neigh_proc_dointvec_jiffies); EXPORT_SYMBOL(neigh_proc_dointvec_jiffies);
static int neigh_proc_dointvec_userhz_jiffies(struct ctl_table *ctl, int write, static int neigh_proc_dointvec_userhz_jiffies(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp,
size_t *lenp, loff_t *ppos) loff_t *ppos)
{ {
int ret = proc_dointvec_userhz_jiffies(ctl, write, buffer, lenp, ppos); int ret = proc_dointvec_userhz_jiffies(ctl, write, buffer, lenp, ppos);
@ -3489,8 +3488,7 @@ static int neigh_proc_dointvec_userhz_jiffies(struct ctl_table *ctl, int write,
} }
int neigh_proc_dointvec_ms_jiffies(struct ctl_table *ctl, int write, int neigh_proc_dointvec_ms_jiffies(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
int ret = proc_dointvec_ms_jiffies(ctl, write, buffer, lenp, ppos); int ret = proc_dointvec_ms_jiffies(ctl, write, buffer, lenp, ppos);
@ -3500,8 +3498,8 @@ int neigh_proc_dointvec_ms_jiffies(struct ctl_table *ctl, int write,
EXPORT_SYMBOL(neigh_proc_dointvec_ms_jiffies); EXPORT_SYMBOL(neigh_proc_dointvec_ms_jiffies);
static int neigh_proc_dointvec_unres_qlen(struct ctl_table *ctl, int write, static int neigh_proc_dointvec_unres_qlen(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp,
size_t *lenp, loff_t *ppos) loff_t *ppos)
{ {
int ret = proc_unres_qlen(ctl, write, buffer, lenp, ppos); int ret = proc_unres_qlen(ctl, write, buffer, lenp, ppos);
@ -3510,8 +3508,8 @@ static int neigh_proc_dointvec_unres_qlen(struct ctl_table *ctl, int write,
} }
static int neigh_proc_base_reachable_time(struct ctl_table *ctl, int write, static int neigh_proc_base_reachable_time(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp,
size_t *lenp, loff_t *ppos) loff_t *ppos)
{ {
struct neigh_parms *p = ctl->extra2; struct neigh_parms *p = ctl->extra2;
int ret; int ret;

View File

@ -45,7 +45,7 @@ EXPORT_SYMBOL(sysctl_devconf_inherit_init_net);
#ifdef CONFIG_RPS #ifdef CONFIG_RPS
static int rps_sock_flow_sysctl(struct ctl_table *table, int write, static int rps_sock_flow_sysctl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
unsigned int orig_size, size; unsigned int orig_size, size;
int ret, i; int ret, i;
@ -115,8 +115,7 @@ static int rps_sock_flow_sysctl(struct ctl_table *table, int write,
static DEFINE_MUTEX(flow_limit_update_mutex); static DEFINE_MUTEX(flow_limit_update_mutex);
static int flow_limit_cpu_sysctl(struct ctl_table *table, int write, static int flow_limit_cpu_sysctl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct sd_flow_limit *cur; struct sd_flow_limit *cur;
struct softnet_data *sd; struct softnet_data *sd;
@ -180,10 +179,7 @@ write_unlock:
} }
if (len < *lenp) if (len < *lenp)
kbuf[len++] = '\n'; kbuf[len++] = '\n';
if (copy_to_user(buffer, kbuf, len)) { memcpy(buffer, kbuf, len);
ret = -EFAULT;
goto done;
}
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;
} }
@ -194,8 +190,7 @@ done:
} }
static int flow_limit_table_len_sysctl(struct ctl_table *table, int write, static int flow_limit_table_len_sysctl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
unsigned int old, *ptr; unsigned int old, *ptr;
int ret; int ret;
@ -217,7 +212,7 @@ static int flow_limit_table_len_sysctl(struct ctl_table *table, int write,
#ifdef CONFIG_NET_SCHED #ifdef CONFIG_NET_SCHED
static int set_default_qdisc(struct ctl_table *table, int write, static int set_default_qdisc(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
char id[IFNAMSIZ]; char id[IFNAMSIZ];
struct ctl_table tbl = { struct ctl_table tbl = {
@ -236,7 +231,7 @@ static int set_default_qdisc(struct ctl_table *table, int write,
#endif #endif
static int proc_do_dev_weight(struct ctl_table *table, int write, static int proc_do_dev_weight(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int ret; int ret;
@ -251,7 +246,7 @@ static int proc_do_dev_weight(struct ctl_table *table, int write,
} }
static int proc_do_rss_key(struct ctl_table *table, int write, static int proc_do_rss_key(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table fake_table; struct ctl_table fake_table;
char buf[NETDEV_RSS_KEY_LEN * 3]; char buf[NETDEV_RSS_KEY_LEN * 3];
@ -264,7 +259,7 @@ static int proc_do_rss_key(struct ctl_table *table, int write,
#ifdef CONFIG_BPF_JIT #ifdef CONFIG_BPF_JIT
static int proc_dointvec_minmax_bpf_enable(struct ctl_table *table, int write, static int proc_dointvec_minmax_bpf_enable(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
int ret, jit_enable = *(int *)table->data; int ret, jit_enable = *(int *)table->data;
@ -291,8 +286,7 @@ static int proc_dointvec_minmax_bpf_enable(struct ctl_table *table, int write,
# ifdef CONFIG_HAVE_EBPF_JIT # ifdef CONFIG_HAVE_EBPF_JIT
static int static int
proc_dointvec_minmax_bpf_restricted(struct ctl_table *table, int write, proc_dointvec_minmax_bpf_restricted(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
@ -303,8 +297,7 @@ proc_dointvec_minmax_bpf_restricted(struct ctl_table *table, int write,
static int static int
proc_dolongvec_minmax_bpf_restricted(struct ctl_table *table, int write, proc_dolongvec_minmax_bpf_restricted(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;

View File

@ -160,8 +160,8 @@ static int max_t3[] = { 8191 }; /* Must fit in 16 bits when multiplied by BCT3MU
static int min_priority[1]; static int min_priority[1];
static int max_priority[] = { 127 }; /* From DECnet spec */ static int max_priority[] = { 127 }; /* From DECnet spec */
static int dn_forwarding_proc(struct ctl_table *, int, static int dn_forwarding_proc(struct ctl_table *, int, void *, size_t *,
void __user *, size_t *, loff_t *); loff_t *);
static struct dn_dev_sysctl_table { static struct dn_dev_sysctl_table {
struct ctl_table_header *sysctl_header; struct ctl_table_header *sysctl_header;
struct ctl_table dn_dev_vars[5]; struct ctl_table dn_dev_vars[5];
@ -245,8 +245,7 @@ static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms)
} }
static int dn_forwarding_proc(struct ctl_table *table, int write, static int dn_forwarding_proc(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
#ifdef CONFIG_DECNET_ROUTER #ifdef CONFIG_DECNET_ROUTER
struct net_device *dev = table->extra1; struct net_device *dev = table->extra1;

View File

@ -134,8 +134,7 @@ static int parse_addr(__le16 *addr, char *str)
} }
static int dn_node_address_handler(struct ctl_table *table, int write, static int dn_node_address_handler(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
char addr[DN_ASCBUF_LEN]; char addr[DN_ASCBUF_LEN];
size_t len; size_t len;
@ -148,10 +147,7 @@ static int dn_node_address_handler(struct ctl_table *table, int write,
if (write) { if (write) {
len = (*lenp < DN_ASCBUF_LEN) ? *lenp : (DN_ASCBUF_LEN-1); len = (*lenp < DN_ASCBUF_LEN) ? *lenp : (DN_ASCBUF_LEN-1);
memcpy(addr, buffer, len);
if (copy_from_user(addr, buffer, len))
return -EFAULT;
addr[len] = 0; addr[len] = 0;
strip_it(addr); strip_it(addr);
@ -173,11 +169,9 @@ static int dn_node_address_handler(struct ctl_table *table, int write,
len = strlen(addr); len = strlen(addr);
addr[len++] = '\n'; addr[len++] = '\n';
if (len > *lenp) len = *lenp; if (len > *lenp)
len = *lenp;
if (copy_to_user(buffer, addr, len)) memcpy(buffer, addr, len);
return -EFAULT;
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;
@ -185,8 +179,7 @@ static int dn_node_address_handler(struct ctl_table *table, int write,
} }
static int dn_def_dev_handler(struct ctl_table *table, int write, static int dn_def_dev_handler(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
size_t len; size_t len;
struct net_device *dev; struct net_device *dev;
@ -201,9 +194,7 @@ static int dn_def_dev_handler(struct ctl_table *table, int write,
if (*lenp > 16) if (*lenp > 16)
return -E2BIG; return -E2BIG;
if (copy_from_user(devname, buffer, *lenp)) memcpy(devname, buffer, *lenp);
return -EFAULT;
devname[*lenp] = 0; devname[*lenp] = 0;
strip_it(devname); strip_it(devname);
@ -238,9 +229,7 @@ static int dn_def_dev_handler(struct ctl_table *table, int write,
if (len > *lenp) len = *lenp; if (len > *lenp) len = *lenp;
if (copy_to_user(buffer, devname, len)) memcpy(buffer, devname, len);
return -EFAULT;
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;

View File

@ -2361,8 +2361,7 @@ static int devinet_conf_ifindex(struct net *net, struct ipv4_devconf *cnf)
} }
static int devinet_conf_proc(struct ctl_table *ctl, int write, static int devinet_conf_proc(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
int old_value = *(int *)ctl->data; int old_value = *(int *)ctl->data;
int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
@ -2414,8 +2413,7 @@ static int devinet_conf_proc(struct ctl_table *ctl, int write,
} }
static int devinet_sysctl_forward(struct ctl_table *ctl, int write, static int devinet_sysctl_forward(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
int *valp = ctl->data; int *valp = ctl->data;
int val = *valp; int val = *valp;
@ -2458,8 +2456,7 @@ static int devinet_sysctl_forward(struct ctl_table *ctl, int write,
} }
static int ipv4_doint_and_flush(struct ctl_table *ctl, int write, static int ipv4_doint_and_flush(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
int *valp = ctl->data; int *valp = ctl->data;
int val = *valp; int val = *valp;

View File

@ -3336,8 +3336,7 @@ static int ip_rt_gc_elasticity __read_mostly = 8;
static int ip_min_valid_pmtu __read_mostly = IPV4_MIN_MTU; static int ip_min_valid_pmtu __read_mostly = IPV4_MIN_MTU;
static int ipv4_sysctl_rtcache_flush(struct ctl_table *__ctl, int write, static int ipv4_sysctl_rtcache_flush(struct ctl_table *__ctl, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
struct net *net = (struct net *)__ctl->extra1; struct net *net = (struct net *)__ctl->extra1;

View File

@ -71,8 +71,7 @@ static void set_local_port_range(struct net *net, int range[2])
/* Validate changes from /proc interface. */ /* Validate changes from /proc interface. */
static int ipv4_local_port_range(struct ctl_table *table, int write, static int ipv4_local_port_range(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
struct net *net = struct net *net =
container_of(table->data, struct net, ipv4.ip_local_ports.range); container_of(table->data, struct net, ipv4.ip_local_ports.range);
@ -107,7 +106,7 @@ static int ipv4_local_port_range(struct ctl_table *table, int write,
/* Validate changes from /proc interface. */ /* Validate changes from /proc interface. */
static int ipv4_privileged_ports(struct ctl_table *table, int write, static int ipv4_privileged_ports(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct net *net = container_of(table->data, struct net, struct net *net = container_of(table->data, struct net,
ipv4.sysctl_ip_prot_sock); ipv4.sysctl_ip_prot_sock);
@ -168,8 +167,7 @@ static void set_ping_group_range(struct ctl_table *table, kgid_t low, kgid_t hig
/* Validate changes from /proc interface. */ /* Validate changes from /proc interface. */
static int ipv4_ping_group_range(struct ctl_table *table, int write, static int ipv4_ping_group_range(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
struct user_namespace *user_ns = current_user_ns(); struct user_namespace *user_ns = current_user_ns();
int ret; int ret;
@ -204,8 +202,7 @@ static int ipv4_ping_group_range(struct ctl_table *table, int write,
} }
static int ipv4_fwd_update_priority(struct ctl_table *table, int write, static int ipv4_fwd_update_priority(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
struct net *net; struct net *net;
int ret; int ret;
@ -221,7 +218,7 @@ static int ipv4_fwd_update_priority(struct ctl_table *table, int write,
} }
static int proc_tcp_congestion_control(struct ctl_table *ctl, int write, static int proc_tcp_congestion_control(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct net *net = container_of(ctl->data, struct net, struct net *net = container_of(ctl->data, struct net,
ipv4.tcp_congestion_control); ipv4.tcp_congestion_control);
@ -241,9 +238,8 @@ static int proc_tcp_congestion_control(struct ctl_table *ctl, int write,
} }
static int proc_tcp_available_congestion_control(struct ctl_table *ctl, static int proc_tcp_available_congestion_control(struct ctl_table *ctl,
int write, int write, void *buffer,
void __user *buffer, size_t *lenp, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, }; struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, };
int ret; int ret;
@ -258,9 +254,8 @@ static int proc_tcp_available_congestion_control(struct ctl_table *ctl,
} }
static int proc_allowed_congestion_control(struct ctl_table *ctl, static int proc_allowed_congestion_control(struct ctl_table *ctl,
int write, int write, void *buffer,
void __user *buffer, size_t *lenp, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX }; struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };
int ret; int ret;
@ -296,8 +291,7 @@ static int sscanf_key(char *buf, __le32 *key)
} }
static int proc_tcp_fastopen_key(struct ctl_table *table, int write, static int proc_tcp_fastopen_key(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct net *net = container_of(table->data, struct net, struct net *net = container_of(table->data, struct net,
ipv4.sysctl_tcp_fastopen); ipv4.sysctl_tcp_fastopen);
@ -399,7 +393,7 @@ static void proc_configure_early_demux(int enabled, int protocol)
} }
static int proc_tcp_early_demux(struct ctl_table *table, int write, static int proc_tcp_early_demux(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int ret = 0; int ret = 0;
@ -415,7 +409,7 @@ static int proc_tcp_early_demux(struct ctl_table *table, int write,
} }
static int proc_udp_early_demux(struct ctl_table *table, int write, static int proc_udp_early_demux(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int ret = 0; int ret = 0;
@ -431,8 +425,7 @@ static int proc_udp_early_demux(struct ctl_table *table, int write,
} }
static int proc_tfo_blackhole_detect_timeout(struct ctl_table *table, static int proc_tfo_blackhole_detect_timeout(struct ctl_table *table,
int write, int write, void *buffer,
void __user *buffer,
size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
struct net *net = container_of(table->data, struct net, struct net *net = container_of(table->data, struct net,
@ -447,8 +440,7 @@ static int proc_tfo_blackhole_detect_timeout(struct ctl_table *table,
} }
static int proc_tcp_available_ulp(struct ctl_table *ctl, static int proc_tcp_available_ulp(struct ctl_table *ctl,
int write, int write, void *buffer, size_t *lenp,
void __user *buffer, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
struct ctl_table tbl = { .maxlen = TCP_ULP_BUF_MAX, }; struct ctl_table tbl = { .maxlen = TCP_ULP_BUF_MAX, };
@ -466,7 +458,7 @@ static int proc_tcp_available_ulp(struct ctl_table *ctl,
#ifdef CONFIG_IP_ROUTE_MULTIPATH #ifdef CONFIG_IP_ROUTE_MULTIPATH
static int proc_fib_multipath_hash_policy(struct ctl_table *table, int write, static int proc_fib_multipath_hash_policy(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
struct net *net = container_of(table->data, struct net, struct net *net = container_of(table->data, struct net,

View File

@ -6108,9 +6108,8 @@ static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
static static int addrconf_sysctl_forward(struct ctl_table *ctl, int write,
int addrconf_sysctl_forward(struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos)
void __user *buffer, size_t *lenp, loff_t *ppos)
{ {
int *valp = ctl->data; int *valp = ctl->data;
int val = *valp; int val = *valp;
@ -6134,9 +6133,8 @@ int addrconf_sysctl_forward(struct ctl_table *ctl, int write,
return ret; return ret;
} }
static static int addrconf_sysctl_mtu(struct ctl_table *ctl, int write,
int addrconf_sysctl_mtu(struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos)
void __user *buffer, size_t *lenp, loff_t *ppos)
{ {
struct inet6_dev *idev = ctl->extra1; struct inet6_dev *idev = ctl->extra1;
int min_mtu = IPV6_MIN_MTU; int min_mtu = IPV6_MIN_MTU;
@ -6206,9 +6204,8 @@ static int addrconf_disable_ipv6(struct ctl_table *table, int *p, int newf)
return 0; return 0;
} }
static static int addrconf_sysctl_disable(struct ctl_table *ctl, int write,
int addrconf_sysctl_disable(struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos)
void __user *buffer, size_t *lenp, loff_t *ppos)
{ {
int *valp = ctl->data; int *valp = ctl->data;
int val = *valp; int val = *valp;
@ -6232,9 +6229,8 @@ int addrconf_sysctl_disable(struct ctl_table *ctl, int write,
return ret; return ret;
} }
static static int addrconf_sysctl_proxy_ndp(struct ctl_table *ctl, int write,
int addrconf_sysctl_proxy_ndp(struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos)
void __user *buffer, size_t *lenp, loff_t *ppos)
{ {
int *valp = ctl->data; int *valp = ctl->data;
int ret; int ret;
@ -6275,7 +6271,7 @@ int addrconf_sysctl_proxy_ndp(struct ctl_table *ctl, int write,
} }
static int addrconf_sysctl_addr_gen_mode(struct ctl_table *ctl, int write, static int addrconf_sysctl_addr_gen_mode(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
int ret = 0; int ret = 0;
@ -6337,7 +6333,7 @@ out:
} }
static int addrconf_sysctl_stable_secret(struct ctl_table *ctl, int write, static int addrconf_sysctl_stable_secret(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
int err; int err;
@ -6404,8 +6400,7 @@ out:
static static
int addrconf_sysctl_ignore_routes_with_linkdown(struct ctl_table *ctl, int addrconf_sysctl_ignore_routes_with_linkdown(struct ctl_table *ctl,
int write, int write, void *buffer,
void __user *buffer,
size_t *lenp, size_t *lenp,
loff_t *ppos) loff_t *ppos)
{ {
@ -6505,10 +6500,8 @@ int addrconf_disable_policy(struct ctl_table *ctl, int *valp, int val)
return 0; return 0;
} }
static static int addrconf_sysctl_disable_policy(struct ctl_table *ctl, int write,
int addrconf_sysctl_disable_policy(struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos)
void __user *buffer, size_t *lenp,
loff_t *ppos)
{ {
int *valp = ctl->data; int *valp = ctl->data;
int val = *valp; int val = *valp;

View File

@ -1835,7 +1835,8 @@ static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
} }
} }
int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos) int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void *buffer,
size_t *lenp, loff_t *ppos)
{ {
struct net_device *dev = ctl->extra1; struct net_device *dev = ctl->extra1;
struct inet6_dev *idev; struct inet6_dev *idev;

View File

@ -6088,9 +6088,8 @@ static int rt6_stats_seq_show(struct seq_file *seq, void *v)
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
static static int ipv6_sysctl_rtcache_flush(struct ctl_table *ctl, int write,
int ipv6_sysctl_rtcache_flush(struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos)
void __user *buffer, size_t *lenp, loff_t *ppos)
{ {
struct net *net; struct net *net;
int delay; int delay;

View File

@ -26,8 +26,7 @@ static int auto_flowlabels_min;
static int auto_flowlabels_max = IP6_AUTO_FLOW_LABEL_MAX; static int auto_flowlabels_max = IP6_AUTO_FLOW_LABEL_MAX;
static int proc_rt6_multipath_hash_policy(struct ctl_table *table, int write, static int proc_rt6_multipath_hash_policy(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct net *net; struct net *net;
int ret; int ret;

View File

@ -1362,8 +1362,7 @@ done:
(&((struct mpls_dev *)0)->field) (&((struct mpls_dev *)0)->field)
static int mpls_conf_proc(struct ctl_table *ctl, int write, static int mpls_conf_proc(struct ctl_table *ctl, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
int oval = *(int *)ctl->data; int oval = *(int *)ctl->data;
int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
@ -2594,7 +2593,7 @@ nolabels:
} }
static int mpls_platform_labels(struct ctl_table *table, int write, static int mpls_platform_labels(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct net *net = table->data; struct net *net = table->data;
int platform_labels = net->mpls.platform_labels; int platform_labels = net->mpls.platform_labels;

View File

@ -1736,7 +1736,7 @@ static int three = 3;
static int static int
proc_do_defense_mode(struct ctl_table *table, int write, proc_do_defense_mode(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct netns_ipvs *ipvs = table->extra2; struct netns_ipvs *ipvs = table->extra2;
int *valp = table->data; int *valp = table->data;
@ -1763,7 +1763,7 @@ proc_do_defense_mode(struct ctl_table *table, int write,
static int static int
proc_do_sync_threshold(struct ctl_table *table, int write, proc_do_sync_threshold(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int *valp = table->data; int *valp = table->data;
int val[2]; int val[2];
@ -1788,7 +1788,7 @@ proc_do_sync_threshold(struct ctl_table *table, int write,
static int static int
proc_do_sync_ports(struct ctl_table *table, int write, proc_do_sync_ports(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int *valp = table->data; int *valp = table->data;
int val = *valp; int val = *valp;

View File

@ -517,7 +517,7 @@ static unsigned int nf_conntrack_htable_size_user __read_mostly;
static int static int
nf_conntrack_hash_sysctl(struct ctl_table *table, int write, nf_conntrack_hash_sysctl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int ret; int ret;

View File

@ -414,7 +414,7 @@ static struct ctl_table nf_log_sysctl_ftable[] = {
}; };
static int nf_log_proc_dostring(struct ctl_table *table, int write, static int nf_log_proc_dostring(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
const struct nf_logger *logger; const struct nf_logger *logger;
char buf[NFLOGGER_NAME_LEN]; char buf[NFLOGGER_NAME_LEN];

View File

@ -49,8 +49,7 @@ void phonet_get_local_port_range(int *min, int *max)
} }
static int proc_local_port_range(struct ctl_table *table, int write, static int proc_local_port_range(struct ctl_table *table, int write,
void __user *buffer, void *buffer, size_t *lenp, loff_t *ppos)
size_t *lenp, loff_t *ppos)
{ {
int ret; int ret;
int range[2] = {local_port_range[0], local_port_range[1]}; int range[2] = {local_port_range[0], local_port_range[1]};

View File

@ -62,8 +62,7 @@ static atomic_t rds_tcp_unloading = ATOMIC_INIT(0);
static struct kmem_cache *rds_tcp_conn_slab; static struct kmem_cache *rds_tcp_conn_slab;
static int rds_tcp_skbuf_handler(struct ctl_table *ctl, int write, static int rds_tcp_skbuf_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *fpos);
loff_t *fpos);
static int rds_tcp_min_sndbuf = SOCK_MIN_SNDBUF; static int rds_tcp_min_sndbuf = SOCK_MIN_SNDBUF;
static int rds_tcp_min_rcvbuf = SOCK_MIN_RCVBUF; static int rds_tcp_min_rcvbuf = SOCK_MIN_RCVBUF;
@ -676,8 +675,7 @@ static void rds_tcp_sysctl_reset(struct net *net)
} }
static int rds_tcp_skbuf_handler(struct ctl_table *ctl, int write, static int rds_tcp_skbuf_handler(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *fpos)
loff_t *fpos)
{ {
struct net *net = current->nsproxy->net_ns; struct net *net = current->nsproxy->net_ns;
int err; int err;

View File

@ -43,20 +43,15 @@ static unsigned long max_autoclose_max =
? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ; ? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ;
static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write, static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos);
static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos); static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, void *buffer,
static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, size_t *lenp, loff_t *ppos);
void __user *buffer, size_t *lenp,
loff_t *ppos);
static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write, static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos);
static int proc_sctp_do_auth(struct ctl_table *ctl, int write, static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos);
loff_t *ppos);
static struct ctl_table sctp_table[] = { static struct ctl_table sctp_table[] = {
{ {
@ -343,8 +338,7 @@ static struct ctl_table sctp_net_table[] = {
}; };
static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write, static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct net *net = current->nsproxy->net_ns; struct net *net = current->nsproxy->net_ns;
struct ctl_table tbl; struct ctl_table tbl;
@ -389,8 +383,7 @@ static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
} }
static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct net *net = current->nsproxy->net_ns; struct net *net = current->nsproxy->net_ns;
unsigned int min = *(unsigned int *) ctl->extra1; unsigned int min = *(unsigned int *) ctl->extra1;
@ -418,8 +411,7 @@ static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
} }
static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct net *net = current->nsproxy->net_ns; struct net *net = current->nsproxy->net_ns;
unsigned int min = *(unsigned int *) ctl->extra1; unsigned int min = *(unsigned int *) ctl->extra1;
@ -447,8 +439,7 @@ static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write,
} }
static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write, static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
if (write) if (write)
pr_warn_once("Changing rto_alpha or rto_beta may lead to " pr_warn_once("Changing rto_alpha or rto_beta may lead to "
@ -458,8 +449,7 @@ static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write,
} }
static int proc_sctp_do_auth(struct ctl_table *ctl, int write, static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
struct net *net = current->nsproxy->net_ns; struct net *net = current->nsproxy->net_ns;
struct ctl_table tbl; struct ctl_table tbl;

View File

@ -60,7 +60,7 @@ rpc_unregister_sysctl(void)
} }
static int proc_do_xprt(struct ctl_table *table, int write, static int proc_do_xprt(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
char tmpbuf[256]; char tmpbuf[256];
size_t len; size_t len;
@ -70,15 +70,15 @@ static int proc_do_xprt(struct ctl_table *table, int write,
return 0; return 0;
} }
len = svc_print_xprts(tmpbuf, sizeof(tmpbuf)); len = svc_print_xprts(tmpbuf, sizeof(tmpbuf));
return simple_read_from_buffer(buffer, *lenp, ppos, tmpbuf, len); return memory_read_from_buffer(buffer, *lenp, ppos, tmpbuf, len);
} }
static int static int
proc_dodebug(struct ctl_table *table, int write, proc_dodebug(struct ctl_table *table, int write, void *buffer, size_t *lenp,
void __user *buffer, size_t *lenp, loff_t *ppos) loff_t *ppos)
{ {
char tmpbuf[20], c, *s = NULL; char tmpbuf[20], *s = NULL;
char __user *p; char *p;
unsigned int value; unsigned int value;
size_t left, len; size_t left, len;
@ -90,18 +90,17 @@ proc_dodebug(struct ctl_table *table, int write,
left = *lenp; left = *lenp;
if (write) { if (write) {
if (!access_ok(buffer, left))
return -EFAULT;
p = buffer; p = buffer;
while (left && __get_user(c, p) >= 0 && isspace(c)) while (left && isspace(*p)) {
left--, p++; left--;
p++;
}
if (!left) if (!left)
goto done; goto done;
if (left > sizeof(tmpbuf) - 1) if (left > sizeof(tmpbuf) - 1)
return -EINVAL; return -EINVAL;
if (copy_from_user(tmpbuf, p, left)) memcpy(tmpbuf, p, left);
return -EFAULT;
tmpbuf[left] = '\0'; tmpbuf[left] = '\0';
value = simple_strtol(tmpbuf, &s, 0); value = simple_strtol(tmpbuf, &s, 0);
@ -121,11 +120,9 @@ proc_dodebug(struct ctl_table *table, int write,
len = sprintf(tmpbuf, "0x%04x", *(unsigned int *) table->data); len = sprintf(tmpbuf, "0x%04x", *(unsigned int *) table->data);
if (len > left) if (len > left)
len = left; len = left;
if (copy_to_user(buffer, tmpbuf, len)) memcpy(buffer, tmpbuf, len);
return -EFAULT;
if ((left -= len) > 0) { if ((left -= len) > 0) {
if (put_user('\n', (char __user *)buffer + len)) *((char *)buffer + len) = '\n';
return -EFAULT;
left--; left--;
} }
} }

View File

@ -80,8 +80,7 @@ atomic_t rdma_stat_sq_prod;
* current value. * current value.
*/ */
static int read_reset_stat(struct ctl_table *table, int write, static int read_reset_stat(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void *buffer, size_t *lenp, loff_t *ppos)
loff_t *ppos)
{ {
atomic_t *stat = (atomic_t *)table->data; atomic_t *stat = (atomic_t *)table->data;
@ -103,8 +102,8 @@ static int read_reset_stat(struct ctl_table *table, int write,
len -= *ppos; len -= *ppos;
if (len > *lenp) if (len > *lenp)
len = *lenp; len = *lenp;
if (len && copy_to_user(buffer, str_buf, len)) if (len)
return -EFAULT; memcpy(buffer, str_buf, len);
*lenp = len; *lenp = len;
*ppos += len; *ppos += len;
} }

View File

@ -1696,7 +1696,7 @@ static int __init alloc_buffers(void)
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
static int apparmor_dointvec(struct ctl_table *table, int write, static int apparmor_dointvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
if (!policy_admin_capable(NULL)) if (!policy_admin_capable(NULL))
return -EPERM; return -EPERM;

View File

@ -30,7 +30,7 @@ static void update_mmap_min_addr(void)
* calls update_mmap_min_addr() so non MAP_FIXED hints get rounded properly * calls update_mmap_min_addr() so non MAP_FIXED hints get rounded properly
*/ */
int mmap_min_addr_handler(struct ctl_table *table, int write, int mmap_min_addr_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
int ret; int ret;

View File

@ -430,7 +430,7 @@ static struct security_hook_list yama_hooks[] __lsm_ro_after_init = {
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
static int yama_dointvec_minmax(struct ctl_table *table, int write, static int yama_dointvec_minmax(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos) void *buffer, size_t *lenp, loff_t *ppos)
{ {
struct ctl_table table_copy; struct ctl_table table_copy;