From 07bba9c34d355cf7b2ee62ab0ad038939a0fd733 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sat, 20 Mar 2004 16:38:10 -0800 Subject: [PATCH] [PATCH] Add missing uacccess checks for sysctl.c From: Marc-Christian Petersen Kernel 2.6 lacks two -EFAULT returns in get_user() in kernel/sysctl.c. --- kernel/sysctl.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 1e6fc4218df80..b790c5ecf37f6 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1004,7 +1004,8 @@ int do_sysctl_strategy (ctl_table *table, * zero, proceed with automatic r/w */ if (table->data && table->maxlen) { if (oldval && oldlenp) { - get_user(len, oldlenp); + if (get_user(len, oldlenp)) + return -EFAULT; if (len) { if (len > table->maxlen) len = table->maxlen; @@ -1303,7 +1304,7 @@ int proc_dostring(ctl_table *table, int write, struct file *filp, len = 0; p = buffer; while (len < *lenp) { - if(get_user(c, p++)) + if (get_user(c, p++)) return -EFAULT; if (c == 0 || c == '\n') break; @@ -1470,7 +1471,7 @@ static int do_proc_dointvec(ctl_table *table, int write, struct file *filp, p = (char *) buffer; while (left) { char c; - if(get_user(c, p++)) + if (get_user(c, p++)) return -EFAULT; if (!isspace(c)) break; @@ -1705,7 +1706,7 @@ static int do_proc_doulongvec_minmax(ctl_table *table, int write, p = (char *) buffer; while (left) { char c; - if(get_user(c, p++)) + if (get_user(c, p++)) return -EFAULT; if (!isspace(c)) break; @@ -1930,7 +1931,7 @@ int sysctl_string(ctl_table *table, int __user *name, int nlen, return -ENOTDIR; if (oldval && oldlenp) { - if(get_user(len, oldlenp)) + if (get_user(len, oldlenp)) return -EFAULT; if (len) { l = strlen(table->data); @@ -1987,7 +1988,8 @@ int sysctl_intvec(ctl_table *table, int __user *name, int nlen, for (i = 0; i < length; i++) { int value; - get_user(value, vec + i); + if (get_user(value, vec + i)) + return -EFAULT; if (min && value < min[i]) return -EINVAL; if (max && value > max[i]) -- 2.53.0