[PATCH] m32r: security fix of {get,put}_user macros
Update {get,put}_user macros for m32r kernel.
- Modify get_user to use __get_user_asm macro, instead of __get_user_x macro.
- Remove arch/m32r/lib/{get,put}user.S.
- Some cosmetic updates.
I would like to thank NIIBE Yutaka for his reporting about the m32r kernel's
security problem in {get,put}_user macros.
There were no address checking for user space access in {get,put}_user macros.
;-)
Signed-off-by: Hirokazu Takata <takata@linux-m32r.org>
Cc: NIIBE Yutaka <gniibe@fsij.org>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
7c1c4e5418
commit
04dfd0de4e
@@ -2,6 +2,6 @@
|
||||
# Makefile for M32R-specific library files..
|
||||
#
|
||||
|
||||
lib-y := checksum.o ashxdi3.o memset.o memcpy.o getuser.o \
|
||||
putuser.o delay.o strlen.o usercopy.o csum_partial_copy.o
|
||||
lib-y := checksum.o ashxdi3.o memset.o memcpy.o \
|
||||
delay.o strlen.o usercopy.o csum_partial_copy.o
|
||||
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
* __get_user functions.
|
||||
*
|
||||
* (C) Copyright 2001 Hirokazu Takata
|
||||
*
|
||||
* These functions have a non-standard call interface
|
||||
* to make them more efficient, especially as they
|
||||
* return an error value in addition to the "real"
|
||||
* return value.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
/*
|
||||
* __get_user_X
|
||||
*
|
||||
* Inputs: r0 contains the address
|
||||
*
|
||||
* Outputs: r0 is error code (0 or -EFAULT)
|
||||
* r1 contains zero-extended value
|
||||
*
|
||||
* These functions should not modify any other registers,
|
||||
* as they get called from within inline assembly.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_ISA_DUAL_ISSUE
|
||||
|
||||
.text
|
||||
.balign 4
|
||||
.globl __get_user_1
|
||||
__get_user_1:
|
||||
1: ldub r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __get_user_2
|
||||
__get_user_2:
|
||||
2: lduh r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __get_user_4
|
||||
__get_user_4:
|
||||
3: ld r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
bad_get_user:
|
||||
ldi r1, #0 || ldi r0, #-14
|
||||
jmp r14
|
||||
|
||||
#else /* not CONFIG_ISA_DUAL_ISSUE */
|
||||
|
||||
.text
|
||||
.balign 4
|
||||
.globl __get_user_1
|
||||
__get_user_1:
|
||||
1: ldub r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __get_user_2
|
||||
__get_user_2:
|
||||
2: lduh r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __get_user_4
|
||||
__get_user_4:
|
||||
3: ld r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
bad_get_user:
|
||||
ldi r1, #0
|
||||
ldi r0, #-14
|
||||
jmp r14
|
||||
|
||||
#endif /* not CONFIG_ISA_DUAL_ISSUE */
|
||||
|
||||
.section __ex_table,"a"
|
||||
.long 1b,bad_get_user
|
||||
.long 2b,bad_get_user
|
||||
.long 3b,bad_get_user
|
||||
.previous
|
||||
|
||||
.end
|
||||
@@ -1,84 +0,0 @@
|
||||
/*
|
||||
* __put_user functions.
|
||||
*
|
||||
* (C) Copyright 1998 Linus Torvalds
|
||||
* (C) Copyright 2001 Hirokazu Takata
|
||||
*
|
||||
* These functions have a non-standard call interface
|
||||
* to make them more efficient.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
/*
|
||||
* __put_user_X
|
||||
*
|
||||
* Inputs: r0 contains the address
|
||||
* r1 contains the value
|
||||
*
|
||||
* Outputs: r0 is error code (0 or -EFAULT)
|
||||
* r1 is corrupted (will contain "current_task").
|
||||
*
|
||||
* These functions should not modify any other registers,
|
||||
* as they get called from within inline assembly.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_ISA_DUAL_ISSUE
|
||||
|
||||
.text
|
||||
.balign 4
|
||||
.globl __put_user_1
|
||||
__put_user_1:
|
||||
1: stb r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __put_user_2
|
||||
__put_user_2:
|
||||
2: sth r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __put_user_4
|
||||
__put_user_4:
|
||||
3: st r1, @r0 || ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
bad_put_user:
|
||||
ldi r0, #-14 || jmp r14
|
||||
|
||||
#else /* not CONFIG_ISA_DUAL_ISSUE */
|
||||
|
||||
.text
|
||||
.balign 4
|
||||
.globl __put_user_1
|
||||
__put_user_1:
|
||||
1: stb r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __put_user_2
|
||||
__put_user_2:
|
||||
2: sth r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
.balign 4
|
||||
.globl __put_user_4
|
||||
__put_user_4:
|
||||
3: st r1, @r0
|
||||
ldi r0, #0
|
||||
jmp r14
|
||||
|
||||
bad_put_user:
|
||||
ldi r0, #-14
|
||||
jmp r14
|
||||
|
||||
#endif /* not CONFIG_ISA_DUAL_ISSUE */
|
||||
|
||||
.section __ex_table,"a"
|
||||
.long 1b,bad_put_user
|
||||
.long 2b,bad_put_user
|
||||
.long 3b,bad_put_user
|
||||
.previous
|
||||
Reference in New Issue
Block a user