From 5c25879dd9d906dd78a59d3b29501c2869af57ea Mon Sep 17 00:00:00 2001 From: Jesper Juhl Date: Thu, 2 Sep 2004 20:26:52 -0700 Subject: [PATCH] [PATCH] x86_64: read_ldt() clear_user() return value checking Signed-off-by: Jesper Juhl Cc: Andi Kleen Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- arch/x86_64/kernel/ldt.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/x86_64/kernel/ldt.c b/arch/x86_64/kernel/ldt.c index c7d7dac048793..d7e5d0cf4285f 100644 --- a/arch/x86_64/kernel/ldt.c +++ b/arch/x86_64/kernel/ldt.c @@ -135,6 +135,7 @@ static int read_ldt(void __user * ptr, unsigned long bytecount) return 0; if (bytecount > LDT_ENTRY_SIZE*LDT_ENTRIES) bytecount = LDT_ENTRY_SIZE*LDT_ENTRIES; + down(&mm->context.sem); size = mm->context.size*LDT_ENTRY_SIZE; if (size > bytecount) @@ -145,12 +146,17 @@ static int read_ldt(void __user * ptr, unsigned long bytecount) err = -EFAULT; up(&mm->context.sem); if (err < 0) - return err; + goto error_return; if (size != bytecount) { /* zero-fill the rest */ - clear_user(ptr+size, bytecount-size); + if (clear_user(ptr+size, bytecount-size) != 0) { + err = -EFAULT; + goto error_return; + } } return bytecount; +error_return: + return err; } static int read_default_ldt(void __user * ptr, unsigned long bytecount) -- 2.53.0