From 640ce3d18dccc38e9e8b70e2d67e72ee514797e7 Mon Sep 17 00:00:00 2001 From: Gordon Jin Date: Tue, 19 Oct 2004 18:12:34 -0700 Subject: [PATCH] [PATCH] x86_64: correct copy_user_generic return value when exception happens Fix a bug that arch/x86_64/lib/copy_user:copy_user_generic will return a wrong value when exception happens. In the case the address is not 8-byte aligned (i.e. go into Lbad_alignment), if exception happens in Ls11, %rdx will be wrong number of copied bytes, then copy_user_generic returns wrong value. It also fixed a bug of zeroing wrong number of bytes of destination at this situation. (In Lzero_rest) Signed-off-by: Yanmin Zhang Signed-off-by: Nanhai Zou Signed-off-by: Gordon Jin Signed-off-by: Suresh Siddha Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- arch/x86_64/lib/copy_user.S | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/arch/x86_64/lib/copy_user.S b/arch/x86_64/lib/copy_user.S index 6859a780964c5..bd556c8042488 100644 --- a/arch/x86_64/lib/copy_user.S +++ b/arch/x86_64/lib/copy_user.S @@ -73,7 +73,7 @@ bad_to_user: * rdx count * * Output: - * eax uncopied bytes or 0 if successfull. + * eax uncopied bytes or 0 if successful. */ .globl copy_user_generic .p2align 4 @@ -179,9 +179,9 @@ copy_user_generic: movl $8,%r9d subl %ecx,%r9d movl %r9d,%ecx - subq %r9,%rdx - jz .Lsmall_align - js .Lsmall_align + cmpq %r9,%rdx + jz .Lhandle_7 + js .Lhandle_7 .Lalign_1: .Ls11: movb (%rsi),%bl .Ld11: movb %bl,(%rdi) @@ -189,10 +189,8 @@ copy_user_generic: incq %rdi decl %ecx jnz .Lalign_1 + subq %r9,%rdx jmp .Lafter_bad_alignment -.Lsmall_align: - addq %r9,%rdx - jmp .Lhandle_7 #endif /* table sorted by exception address */ @@ -219,8 +217,8 @@ copy_user_generic: .quad .Ls10,.Le_byte .quad .Ld10,.Le_byte #ifdef FIX_ALIGNMENT - .quad .Ls11,.Le_byte - .quad .Ld11,.Le_byte + .quad .Ls11,.Lzero_rest + .quad .Ld11,.Lzero_rest #endif .quad .Le5,.Le_zero .previous -- 2.53.0