kexec: return -EFAULT on copy_to_user() failures
Subsystems (2)
PATCH 1/1 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.
kernel/kexec.c +5 -3
@@ -151,8 +151,10 @@ static int do_kimage_alloc(struct kimage **rimage, unsigned long entry, image->nr_segments = nr_segments; segment_bytes = nr_segments *sizeof (*segments); result =copy_from_user (image->segment, segments, segment_bytes); -if (result) +if (result) { + result = -EFAULT ; goto out; + }/* * Verify we have good destination addresses. The caller is
@@ -827,7 +829,7 @@ static int kimage_load_normal_segment(struct kimage *image, result =copy_from_user (ptr, buf, uchunk);kunmap (page);if (result) { - result = (result <0 ) ? result : -EIO ; + result = -EFAULT ; goto out; } ubytes -= uchunk;
@@ -882,7 +884,7 @@ static int kimage_load_crash_segment(struct kimage *image,kexec_flush_icache_page (page);kunmap (page);if (result) { - result = (result <0 ) ? result : -EIO ; + result = -EFAULT ; goto out; } ubytes -= uchunk;
Quoted 8 lines · Dan Carpenter
copy_to/from_user() returns the number of bytes remaining to be copied. It never returns a negative value. The correct return code is
-EFAULTand 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 Dan Carpenter <[email protected]>
Quoted 40 lines
kernel/kexec.c +5
-4@@ -151,8 +151,10 @@ static int do_kimage_alloc(struct kimage **rimage, unsigned long entry, image->nr_segments = nr_segments; segment_bytes = nr_segments *sizeof (*segments); result =copy_from_user (image->segment, segments, segment_bytes); -if (result) +if (result) { + result = -EFAULT ; goto out; + }/* * Verify we have good destination addresses. The caller is @@ -827,7 +829,7 @@ static int kimage_load_normal_segment(struct kimage *image, result =copy_from_user (ptr, buf, uchunk);kunmap (page);if (result) { - result = (result <0 ) ? result : -EIO ; + result = -EFAULT ; goto out; } ubytes -= uchunk;@@ -882,7 +884,7 @@ static int kimage_load_crash_segment(struct kimage *image,kexec_flush_icache_page (page);kunmap (page);if (result) { - result = (result <0 ) ? result : -EIO ; + result = -EFAULT ; goto out; } ubytes -= uchunk; --To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/