Commit f65a03f6 authored by Dan Carpenter's avatar Dan Carpenter Committed by Linus Torvalds

kexec: return -EFAULT on copy_to_user() failures

copy_to/from_user() returns the number of bytes remaining to be copied.
It never returns a negative value.  The correct return code is -EFAULT and
not -EIO.

All the callers check for non-zero returns so that's Ok, but the return
code is passed to the user so we should fix this.
Signed-off-by: default avatarDan Carpenter <error27@gmail.com>
Cc: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Simon Kagstrom <simon.kagstrom@netinsight.net>
Acked-by: default avatarWANG Cong <xiyou.wangcong@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 832ccf6f
...@@ -151,8 +151,10 @@ static int do_kimage_alloc(struct kimage **rimage, unsigned long entry, ...@@ -151,8 +151,10 @@ static int do_kimage_alloc(struct kimage **rimage, unsigned long entry,
image->nr_segments = nr_segments; image->nr_segments = nr_segments;
segment_bytes = nr_segments * sizeof(*segments); segment_bytes = nr_segments * sizeof(*segments);
result = copy_from_user(image->segment, segments, segment_bytes); result = copy_from_user(image->segment, segments, segment_bytes);
if (result) if (result) {
result = -EFAULT;
goto out; goto out;
}
/* /*
* Verify we have good destination addresses. The caller is * Verify we have good destination addresses. The caller is
...@@ -827,7 +829,7 @@ static int kimage_load_normal_segment(struct kimage *image, ...@@ -827,7 +829,7 @@ static int kimage_load_normal_segment(struct kimage *image,
result = copy_from_user(ptr, buf, uchunk); result = copy_from_user(ptr, buf, uchunk);
kunmap(page); kunmap(page);
if (result) { if (result) {
result = (result < 0) ? result : -EIO; result = -EFAULT;
goto out; goto out;
} }
ubytes -= uchunk; ubytes -= uchunk;
...@@ -882,7 +884,7 @@ static int kimage_load_crash_segment(struct kimage *image, ...@@ -882,7 +884,7 @@ static int kimage_load_crash_segment(struct kimage *image,
kexec_flush_icache_page(page); kexec_flush_icache_page(page);
kunmap(page); kunmap(page);
if (result) { if (result) {
result = (result < 0) ? result : -EIO; result = -EFAULT;
goto out; goto out;
} }
ubytes -= uchunk; ubytes -= uchunk;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment