Skip to contentSkip to conversation

fix put_user for 80386

PATCH New Manfred Spraul 1 participant 1 message Mar 12, 2005

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix put_user for 80386

Hi,

Linus noticed that put_user doesn't to the manual page table lookup that is required for cpus without a working WP flag. The solution is simple: if CONFIG_X86_WP_WORKS_OK is not set, then the put_user macros must call __copy_to_user_ll(). That function contains the required checks. This is already implemented for __put_user_size(), somehow I overlooked __put_user_{1,2,4,8,X}.

What do you think?
Patch against 2.6.11-mm2, test booted with bochs.

--
Manfred

include/asm-i386/uaccess.h +17 -0
@@ -217,6 +217,8 @@
  *
  * Returns zero on success, or -EFAULT on error.
  */
+#ifdef CONFIG_X86_WP_WORKS_OK
+
 #define put_user(x,ptr)						\
 ({	int __ret_pu;						\
 	__chk_user_ptr(ptr);					\
@@ -230,6 +232,21 @@
 	__ret_pu;						\
 })
 
+#else
+#define put_user(x,ptr)						\
+({								\
+ 	int __ret_pu;						\
+	__typeof__(*(ptr)) __pus_tmp = x;			\
+	__ret_pu=0;						\
+	if(unlikely(__copy_to_user_ll(ptr, &__pus_tmp,		\
+				sizeof(*(ptr))) != 0))		\
+ 		__ret_pu=-EFAULT;				\
+ 	__ret_pu;						\
+ })
+
+
+#endif
+
 /**
  * __get_user: - Get a simple variable from user space, with less checking.
  * @x:   Variable to store result.