From: Yufan Chen <[email protected]> Use kstrtouint() in proc_dodebug() after trimming trailing whitespace. This keeps accepted whitespace behavior while enforcing full-token parsing with standard errno returns.
Signed-off-by: Yufan Chen <[email protected]> --- net/sunrpc/sysctl.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c index bdb587a72..07072218b 100644 --- a/net/sunrpc/sysctl.c +++ b/net/sunrpc/sysctl.c @@ -12,6 +12,7 @@ #include <linux/linkage.h> #include <linux/ctype.h> #include <linux/fs.h> +#include <linux/kernel.h> #include <linux/sysctl.h> #include <linux/module.h> @@ -65,10 +66,11 @@ static int proc_dodebug(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos) { - char tmpbuf[20], *s = NULL; + char tmpbuf[20]; char *p; unsigned int value; size_t left, len; + int ret; if ((*ppos && !write) || !*lenp) { *lenp = 0; @@ -89,19 +91,17 @@ proc_dodebug(const struct ctl_table *table, int write, void *buffer, size_t *len if (left > sizeof(tmpbuf) - 1) return -EINVAL; memcpy(tmpbuf, p, left); + + while (left && isspace(tmpbuf[left - 1])) + left--; tmpbuf[left] = '\0'; + if (!tmpbuf[0]) + goto done; - value = simple_strtol(tmpbuf, &s, 0); - if (s) { - left -= (s - tmpbuf); - if (left && !isspace(*s)) - return -EINVAL; - while (left && isspace(*s)) { - left--; - s++; - } - } else - left = 0; + ret = kstrtouint(tmpbuf, 0, &value); + if (ret) + return ret; + left = 0; *(unsigned int *) table->data = value; /* Display the RPC tasks on writing to rpc_debug */ if (strcmp(table->procname, "rpc_debug") == 0) -- 2.47.3

