mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
BACKPORT: 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. Change-Id: Ib7ad5ec475ea28257d651bdea23a4026a268c576 Signed-off-by: Christoph Hellwig <[email protected]> Acked-by: Andrey Ignatov <[email protected]> Signed-off-by: Al Viro <[email protected]>
This commit is contained in:
parent
16652c0b17
commit
97a739c638
86 changed files with 458 additions and 639 deletions
|
|
@ -60,7 +60,7 @@ rpc_unregister_sysctl(void)
|
|||
}
|
||||
|
||||
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];
|
||||
size_t len;
|
||||
|
|
@ -70,15 +70,15 @@ static int proc_do_xprt(struct ctl_table *table, int write,
|
|||
return 0;
|
||||
}
|
||||
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
|
||||
proc_dodebug(struct ctl_table *table, int write,
|
||||
void __user *buffer, size_t *lenp, loff_t *ppos)
|
||||
proc_dodebug(struct ctl_table *table, int write, void *buffer, size_t *lenp,
|
||||
loff_t *ppos)
|
||||
{
|
||||
char tmpbuf[20], c, *s = NULL;
|
||||
char __user *p;
|
||||
char tmpbuf[20], *s = NULL;
|
||||
char *p;
|
||||
unsigned int value;
|
||||
size_t left, len;
|
||||
|
||||
|
|
@ -90,18 +90,17 @@ proc_dodebug(struct ctl_table *table, int write,
|
|||
left = *lenp;
|
||||
|
||||
if (write) {
|
||||
if (!access_ok(buffer, left))
|
||||
return -EFAULT;
|
||||
p = buffer;
|
||||
while (left && __get_user(c, p) >= 0 && isspace(c))
|
||||
left--, p++;
|
||||
while (left && isspace(*p)) {
|
||||
left--;
|
||||
p++;
|
||||
}
|
||||
if (!left)
|
||||
goto done;
|
||||
|
||||
if (left > sizeof(tmpbuf) - 1)
|
||||
return -EINVAL;
|
||||
if (copy_from_user(tmpbuf, p, left))
|
||||
return -EFAULT;
|
||||
memcpy(tmpbuf, p, left);
|
||||
tmpbuf[left] = '\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);
|
||||
if (len > left)
|
||||
len = left;
|
||||
if (copy_to_user(buffer, tmpbuf, len))
|
||||
return -EFAULT;
|
||||
memcpy(buffer, tmpbuf, len);
|
||||
if ((left -= len) > 0) {
|
||||
if (put_user('\n', (char __user *)buffer + len))
|
||||
return -EFAULT;
|
||||
*((char *)buffer + len) = '\n';
|
||||
left--;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,8 +80,7 @@ atomic_t rdma_stat_sq_prod;
|
|||
* current value.
|
||||
*/
|
||||
static int read_reset_stat(struct ctl_table *table, int write,
|
||||
void __user *buffer, size_t *lenp,
|
||||
loff_t *ppos)
|
||||
void *buffer, size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
atomic_t *stat = (atomic_t *)table->data;
|
||||
|
||||
|
|
@ -103,8 +102,8 @@ static int read_reset_stat(struct ctl_table *table, int write,
|
|||
len -= *ppos;
|
||||
if (len > *lenp)
|
||||
len = *lenp;
|
||||
if (len && copy_to_user(buffer, str_buf, len))
|
||||
return -EFAULT;
|
||||
if (len)
|
||||
memcpy(buffer, str_buf, len);
|
||||
*lenp = len;
|
||||
*ppos += len;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue