From: Marc-Christian Petersen <m.c.p@wolk-project.de>

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])

_