mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-16 04:04:06 +00:00
proc: proc_skip_spaces() shouldn't think it is working on C strings
commit bce9332220
upstream.
proc_skip_spaces() seems to think it is working on C strings, and ends
up being just a wrapper around skip_spaces() with a really odd calling
convention.
Instead of basing it on skip_spaces(), it should have looked more like
proc_skip_char(), which really is the exact same function (except it
skips a particular character, rather than whitespace). So use that as
inspiration, odd coding and all.
Now the calling convention actually makes sense and works for the
intended purpose.
Reported-and-tested-by: Kyle Zeng <zengyhkyle@gmail.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
c83e0b063e
commit
f7eb4cfa0e
1 changed files with 13 additions and 12 deletions
|
@ -379,13 +379,14 @@ int proc_dostring(struct ctl_table *table, int write,
|
|||
ppos);
|
||||
}
|
||||
|
||||
static size_t proc_skip_spaces(char **buf)
|
||||
static void proc_skip_spaces(char **buf, size_t *size)
|
||||
{
|
||||
size_t ret;
|
||||
char *tmp = skip_spaces(*buf);
|
||||
ret = tmp - *buf;
|
||||
*buf = tmp;
|
||||
return ret;
|
||||
while (*size) {
|
||||
if (!isspace(**buf))
|
||||
break;
|
||||
(*size)--;
|
||||
(*buf)++;
|
||||
}
|
||||
}
|
||||
|
||||
static void proc_skip_char(char **buf, size_t *size, const char v)
|
||||
|
@ -632,7 +633,7 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
|
|||
bool neg;
|
||||
|
||||
if (write) {
|
||||
left -= proc_skip_spaces(&p);
|
||||
proc_skip_spaces(&p, &left);
|
||||
|
||||
if (!left)
|
||||
break;
|
||||
|
@ -659,7 +660,7 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
|
|||
if (!write && !first && left && !err)
|
||||
proc_put_char(&buffer, &left, '\n');
|
||||
if (write && !err && left)
|
||||
left -= proc_skip_spaces(&p);
|
||||
proc_skip_spaces(&p, &left);
|
||||
if (write && first)
|
||||
return err ? : -EINVAL;
|
||||
*lenp -= left;
|
||||
|
@ -701,7 +702,7 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
|
|||
if (left > PAGE_SIZE - 1)
|
||||
left = PAGE_SIZE - 1;
|
||||
|
||||
left -= proc_skip_spaces(&p);
|
||||
proc_skip_spaces(&p, &left);
|
||||
if (!left) {
|
||||
err = -EINVAL;
|
||||
goto out_free;
|
||||
|
@ -721,7 +722,7 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
|
|||
}
|
||||
|
||||
if (!err && left)
|
||||
left -= proc_skip_spaces(&p);
|
||||
proc_skip_spaces(&p, &left);
|
||||
|
||||
out_free:
|
||||
if (err)
|
||||
|
@ -1258,7 +1259,7 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table,
|
|||
if (write) {
|
||||
bool neg;
|
||||
|
||||
left -= proc_skip_spaces(&p);
|
||||
proc_skip_spaces(&p, &left);
|
||||
if (!left)
|
||||
break;
|
||||
|
||||
|
@ -1286,7 +1287,7 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table,
|
|||
if (!write && !first && left && !err)
|
||||
proc_put_char(&buffer, &left, '\n');
|
||||
if (write && !err)
|
||||
left -= proc_skip_spaces(&p);
|
||||
proc_skip_spaces(&p, &left);
|
||||
if (write && first)
|
||||
return err ? : -EINVAL;
|
||||
*lenp -= left;
|
||||
|
|
Loading…
Add table
Reference in a new issue