Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1047aa77 authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Linus Torvalds
Browse files

[PATCH] s390: const pointer uaccess



Using __typeof__(*ptr) on a pointer to const makes the __x variable in
__get_user const as well.  The latest gcc will refuse to write to it.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent cdb32dc9
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -200,21 +200,37 @@ extern int __put_user_bad(void) __attribute__((noreturn));

#define __get_user(x, ptr)					\
({								\
	__typeof__(*(ptr)) __x;					\
	int __gu_err;						\
        __chk_user_ptr(ptr);                                    \
	switch (sizeof(*(ptr))) {				\
	case 1:							\
	case 2:							\
	case 4:							\
	case 8:							\
	case 1: {						\
		unsigned char __x;				\
		__get_user_asm(__x, ptr, __gu_err);		\
		(x) = (__typeof__(*(ptr))) __x;			\
		break;						\
	};							\
	case 2: {						\
		unsigned short __x;				\
		__get_user_asm(__x, ptr, __gu_err);		\
		(x) = (__typeof__(*(ptr))) __x;			\
		break;						\
	};							\
	case 4: {						\
		unsigned int __x;				\
		__get_user_asm(__x, ptr, __gu_err);		\
		(x) = (__typeof__(*(ptr))) __x;			\
		break;						\
	};							\
	case 8: {						\
		unsigned long long __x;				\
		__get_user_asm(__x, ptr, __gu_err);		\
		(x) = (__typeof__(*(ptr))) __x;			\
		break;						\
	};							\
	default:						\
		__get_user_bad();				\
		break;						\
	}							\
	(x) = __x;						\
	__gu_err;						\
})