linux/arch/riscv
Alexandre Ghiti 258b867f40 riscv: uaccess: Return the number of bytes effectively not copied
[ Upstream commit 4b05b99390 ]

It was reported that the riscv kernel hangs while executing the test
in [1].

Indeed, the test hangs when trying to write a buffer to a file. The
problem is that the riscv implementation of raw_copy_from_user() does not
return the correct number of bytes not written when an exception happens
and is fixed up, instead it always returns the initial size to copy,
even if some bytes were actually copied.

generic_perform_write() pre-faults the user pages and bails out if nothing
can be written, otherwise it will access the userspace buffer: here the
riscv implementation keeps returning it was not able to copy any byte
though the pre-faulting indicates otherwise. So generic_perform_write()
keeps retrying to access the user memory and ends up in an infinite
loop.

Note that before the commit mentioned in [1] that introduced this
regression, it worked because generic_perform_write() would bail out if
only one byte could not be written.

So fix this by returning the number of bytes effectively not written in
__asm_copy_[to|from]_user() and __clear_user(), as it is expected.

Link: https://lore.kernel.org/linux-riscv/20230309151841.bomov6hq3ybyp42a@debian/ [1]
Fixes: ebcbd75e39 ("riscv: Fix the bug in memory access fixup code")
Reported-by: Bo YU <tsu.yubo@gmail.com>
Closes: https://lore.kernel.org/linux-riscv/20230309151841.bomov6hq3ybyp42a@debian/#t
Reported-by: Aurelien Jarno <aurelien@aurel32.net>
Closes: https://lore.kernel.org/linux-riscv/ZNOnCakhwIeue3yr@aurel32.net/
Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Reviewed-by: Björn Töpel <bjorn@rivosinc.com>
Tested-by: Aurelien Jarno <aurelien@aurel32.net>
Reviewed-by: Aurelien Jarno <aurelien@aurel32.net>
Link: https://lore.kernel.org/r/20230811150604.1621784-1-alexghiti@rivosinc.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2023-08-23 17:32:51 +02:00
..
boot RISC-V Patches for the 6.4 Merge Window, Part 1 2023-04-28 16:55:39 -07:00
configs Remove orphaned CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT 2023-03-27 13:12:09 +02:00
errata riscv: Fix relocatable kernels with early alternatives using -fno-pie 2023-05-31 07:07:07 -07:00
include riscv: correct riscv_insn_is_c_jr() and riscv_insn_is_c_jalr() 2023-08-23 17:32:51 +02:00
kernel riscv: entry: set a0 = -ENOSYS only when syscall != -1 2023-08-23 17:32:51 +02:00
kvm RISC-V Patches for the 6.4 Merge Window, Part 2 2023-05-05 12:23:33 -07:00
lib riscv: uaccess: Return the number of bytes effectively not copied 2023-08-23 17:32:51 +02:00
mm riscv: mm: fix 2 instances of -Wmissing-variable-declarations 2023-08-16 18:32:18 +02:00
net riscv, bpf: Fix inconsistent JIT image generation 2023-07-23 13:53:46 +02:00
purgatory riscv/purgatory: remove PGO flags 2023-06-12 11:31:51 -07:00
tools riscv: Check relocations at compile time 2023-04-19 07:46:32 -07:00
Kbuild riscv: move errata/ and kvm/ builds to arch/riscv/Kbuild 2022-06-01 22:26:32 -07:00
Kconfig riscv/mm: Convert to using lock_mm_and_find_vma() 2023-07-01 13:12:39 +02:00
Kconfig.debug RISC-V: Remove EARLY_PRINTK support 2018-12-17 10:23:46 -08:00
Kconfig.errata Merge patch series "RISC-V: Fixes for riscv_has_extension[un]likely()'s alternative dependency" 2023-03-29 12:26:38 -07:00
Kconfig.socs RISC-V Patches for the 6.3 Merge Window, Part 1 2023-02-25 11:14:08 -08:00
Makefile RISC-V Patches for the 6.4 Merge Window, Part 1 2023-04-28 16:55:39 -07:00
Makefile.postlink riscv: Use --emit-relocs in order to move .rela.dyn in init 2023-04-19 07:46:33 -07:00