From: Marc-Christian Petersen Kernel 2.6 lacks two -EFAULT returns in get_user() in kernel/sysctl.c. --- 25-akpm/kernel/sysctl.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff -puN kernel/sysctl.c~sysctl-EFAULT-fixes kernel/sysctl.c --- 25/kernel/sysctl.c~sysctl-EFAULT-fixes 2004-03-21 00:05:42.459598280 -0800 +++ 25-akpm/kernel/sysctl.c 2004-03-21 00:05:42.462597824 -0800 @@ -1024,7 +1024,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; @@ -1323,7 +1324,7 @@ int proc_dostring(ctl_table *table, int 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; @@ -1490,7 +1491,7 @@ static int do_proc_dointvec(ctl_table *t p = (char *) buffer; while (left) { char c; - if(get_user(c, p++)) + if (get_user(c, p++)) return -EFAULT; if (!isspace(c)) break; @@ -1725,7 +1726,7 @@ static int do_proc_doulongvec_minmax(ctl p = (char *) buffer; while (left) { char c; - if(get_user(c, p++)) + if (get_user(c, p++)) return -EFAULT; if (!isspace(c)) break; @@ -1950,7 +1951,7 @@ int sysctl_string(ctl_table *table, int return -ENOTDIR; if (oldval && oldlenp) { - if(get_user(len, oldlenp)) + if (get_user(len, oldlenp)) return -EFAULT; if (len) { l = strlen(table->data); @@ -2007,7 +2008,8 @@ int sysctl_intvec(ctl_table *table, int 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]) _