(Albert's @google.com address is gone, removing it from CC list) On Fri, Oct 23, 2020 at 10:16 AM Alexander Potapenko <glider@xxxxxxxxxx> wrote: > > From: Albert van der Linde <alinde@xxxxxxxxxx> > > To test fault-tolerance of user memory acceses in x86, add support for > fault injection. > > Make both put_user() and get_user() fail with -EFAULT, and clear_user() > fail by not clearing any bytes. > > Reviewed-by: Akinobu Mita <akinobu.mita@xxxxxxxxx> > Reviewed-by: Alexander Potapenko <glider@xxxxxxxxxx> > Signed-off-by: Albert van der Linde <alinde@xxxxxxxxxx> > Signed-off-by: Alexander Potapenko <glider@xxxxxxxxxx> > > --- > v2: > - no significant changes > > v3: > - no changes > > v4: > - instrument the new out-of-line implementations of get_user()/put_user() > - fix a minor checkpatch warning in the inline assembly > > --- > --- > arch/x86/include/asm/uaccess.h | 36 ++++++++++++++++++++++------------ > arch/x86/lib/usercopy_64.c | 3 +++ > 2 files changed, 26 insertions(+), 13 deletions(-) > > diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h > index f13659523108..7041ebc48b75 100644 > --- a/arch/x86/include/asm/uaccess.h > +++ b/arch/x86/include/asm/uaccess.h > @@ -5,6 +5,7 @@ > * User space memory access functions > */ > #include <linux/compiler.h> > +#include <linux/fault-inject-usercopy.h> > #include <linux/kasan-checks.h> > #include <linux/string.h> > #include <asm/asm.h> > @@ -126,11 +127,16 @@ extern int __get_user_bad(void); > int __ret_gu; \ > register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX); \ > __chk_user_ptr(ptr); \ > - asm volatile("call __" #fn "_%P4" \ > - : "=a" (__ret_gu), "=r" (__val_gu), \ > - ASM_CALL_CONSTRAINT \ > - : "0" (ptr), "i" (sizeof(*(ptr)))); \ > - (x) = (__force __typeof__(*(ptr))) __val_gu; \ > + if (should_fail_usercopy()) { \ > + (x) = 0; \ > + __ret_gu = -EFAULT; \ > + } else { \ > + asm volatile("call __" #fn "_%P4" \ > + : "=a" (__ret_gu), "=r" (__val_gu), \ > + ASM_CALL_CONSTRAINT \ > + : "0" (ptr), "i" (sizeof(*(ptr)))); \ > + (x) = (__force __typeof__(*(ptr))) __val_gu; \ > + } \ > __builtin_expect(__ret_gu, 0); \ > }) > > @@ -213,14 +219,18 @@ extern void __put_user_nocheck_8(void); > int __ret_pu; \ > register __typeof__(*(ptr)) __val_pu asm("%"_ASM_AX); \ > __chk_user_ptr(ptr); \ > - __val_pu = (x); \ > - asm volatile("call __" #fn "_%P[size]" \ > - : "=c" (__ret_pu), \ > - ASM_CALL_CONSTRAINT \ > - : "0" (ptr), \ > - "r" (__val_pu), \ > - [size] "i" (sizeof(*(ptr))) \ > - :"ebx"); \ > + if (unlikely(should_fail_usercopy())) { \ > + __ret_pu = -EFAULT; \ > + } else { \ > + __val_pu = (x); \ > + asm volatile("call __" #fn "_%P[size]" \ > + : "=c" (__ret_pu), \ > + ASM_CALL_CONSTRAINT \ > + : "0" (ptr), \ > + "r" (__val_pu), \ > + [size] "i" (sizeof(*(ptr))) \ > + : "ebx"); \ > + } \ > __builtin_expect(__ret_pu, 0); \ > }) > > diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c > index 508c81e97ab1..5617b3864586 100644 > --- a/arch/x86/lib/usercopy_64.c > +++ b/arch/x86/lib/usercopy_64.c > @@ -7,6 +7,7 @@ > * Copyright 2002 Andi Kleen <ak@xxxxxxx> > */ > #include <linux/export.h> > +#include <linux/fault-inject-usercopy.h> > #include <linux/uaccess.h> > #include <linux/highmem.h> > > @@ -50,6 +51,8 @@ EXPORT_SYMBOL(__clear_user); > > unsigned long clear_user(void __user *to, unsigned long n) > { > + if (should_fail_usercopy()) > + return n; > if (access_ok(to, n)) > return __clear_user(to, n); > return n; > -- > 2.29.0.rc2.309.g374f81d7ae-goog > -- Alexander Potapenko Software Engineer Google Germany GmbH Erika-Mann-Straße, 33 80636 München Geschäftsführer: Paul Manicle, Halimah DeLaine Prado Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg