linux-uconsole/arch/powerpc/lib
Paul Mackerras 800b55c471 powerpc/64: Fix incorrect return value from __copy_tofrom_user
commit 1a34439e5a upstream.

Debugging a data corruption issue with virtio-net/vhost-net led to
the observation that __copy_tofrom_user was occasionally returning
a value 16 larger than it should.  Since the return value from
__copy_tofrom_user is the number of bytes not copied, this means
that __copy_tofrom_user can occasionally return a value larger
than the number of bytes it was asked to copy.  In turn this can
cause higher-level copy functions such as copy_page_to_iter_iovec
to corrupt memory by copying data into the wrong memory locations.

It turns out that the failing case involves a fault on the store
at label 79, and at that point the first unmodified byte of the
destination is at R3 + 16.  Consequently the exception handler
for that store needs to add 16 to R3 before using it to work out
how many bytes were not copied, but in this one case it was not
adding the offset to R3.  To fix it, this moves the label 179 to
the point where we add 16 to R3.  I have checked manually all the
exception handlers for the loads and stores in this code and the
rest of them are correct (it would be excellent to have an
automated test of all the exception cases).

This bug has been present since this code was initially
committed in May 2002 to Linux version 2.5.20.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2016-10-28 03:01:28 -04:00
..
alloc.c powerpc: Replace mem_init_done with slab_is_available() 2015-04-10 20:02:48 +10:00
checksum_32.S powerpc: put csum_tcpudp_magic inline 2015-08-07 22:59:19 -05:00
checksum_64.S powerpc: put csum_tcpudp_magic inline 2015-08-07 22:59:19 -05:00
checksum_wrappers_64.c powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
code-patching.c powerpc: Move the patch_exception to a common place 2013-12-02 14:06:54 +11:00
copy_32.S powerpc32: memset: only use dcbz once cache is enabled 2015-09-17 10:36:53 +10:00
copypage_64.S powerpc: Exported functions __clear_user and copy_page use r2 so need _GLOBAL_TOC() 2014-06-05 13:20:41 +10:00
copypage_power7.S powerpc: Change vrX register defines to vX to match gcc and glibc 2015-03-16 18:32:11 +11:00
copyuser_64.S powerpc/64: Fix incorrect return value from __copy_tofrom_user 2016-10-28 03:01:28 -04:00
copyuser_power7.S powerpc: Change vrX register defines to vX to match gcc and glibc 2015-03-16 18:32:11 +11:00
crtsavres.S powerpc: Change vrX register defines to vX to match gcc and glibc 2015-03-16 18:32:11 +11:00
div64.S
feature-fixups-test.S powerpc: Ensure the else case of feature sections will fit 2011-01-21 14:08:33 +11:00
feature-fixups.c powerpc: Make a bunch of things static 2014-09-25 23:14:41 +10:00
hweight_64.S powerpc: No need to use dot symbols when branching to a function 2014-04-23 10:05:16 +10:00
ldstfp.S powerpc: Change vsrX register defines to vsX to match gcc and glibc 2015-03-16 18:32:11 +11:00
locks.c cpufreq/ppc: Add missing #include <asm/smp.h> 2015-03-25 16:53:28 +11:00
Makefile powerpc: Only use -mabi=altivec if toolchain supports it 2015-06-11 17:33:05 +10:00
mem_64.S powerpc: use _GLOBAL_TOC for memmove 2014-07-22 15:56:04 +10:00
memcmp_64.S powerpc: Add 64bit optimised memcmp 2015-01-23 14:02:55 +11:00
memcpy_64.S Merge remote-tracking branch 'anton/abiv2' into next 2014-05-05 20:57:12 +10:00
memcpy_power7.S powerpc: Change vrX register defines to vX to match gcc and glibc 2015-03-16 18:32:11 +11:00
ppc_ksyms.c powerpc: Remove duplicate cacheable_memcpy/memzero functions 2015-03-17 11:25:50 +11:00
rheap.c powerpc: Delete unnecessary checks before kfree() 2015-03-16 18:50:14 +11:00
sstep.c powerpc: Fix compilation of emulate_step() 2014-11-12 15:54:29 +11:00
string.S powerpc: Add 64bit optimised memcmp 2015-01-23 14:02:55 +11:00
string_64.S powerpc: Exported functions __clear_user and copy_page use r2 so need _GLOBAL_TOC() 2014-06-05 13:20:41 +10:00
usercopy_64.c
vmx-helper.c sched/preempt, powerpc: Disable preemption in enable_kernel_altivec() explicitly 2015-05-19 08:39:17 +02:00
xor_vmx.c powerpc: Add VMX optimised xor for RAID5 2013-10-30 16:02:28 +11:00