Message ID | 20190308011619.22402-8-mpe@ellerman.id.au (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v5,01/10] powerpc/powernv/idle: Restore IAMR after idle | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch next (9580b71b5a7863c24a9bd18bcd2ad759b86b1eff) |
snowpatch_ozlabs/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 11 lines checked |
Le 08/03/2019 à 02:16, Michael Ellerman a écrit : > From: Russell Currey <ruscur@russell.cc> > > __patch_instruction() is called in early boot, and uses > __put_user_size(), which includes the allow/prevent calls to enforce > KUAP, which could either be called too early, or in the Radix case, > forced to use "early_" versions of functions just to safely handle > this one case. > > __put_user_asm() does not do this, and thus is safe to use both in > early boot, and later on since in this case it should only ever be > touching kernel memory. > > __patch_instruction() was previously refactored to use > __put_user_size() in order to be able to return -EFAULT, which would > allow the kernel to patch instructions in userspace, which should > never happen. This has the functional change of causing faults on > userspace addresses if KUAP is turned on, which should never happen in > practice. What about modules patching, is there no risk of -EFAULT on module memory, as it is in vm area ? Christophe > > A future enhancement could be to double check the patch address is > definitely allowed to be tampered with by the kernel. > > Signed-off-by: Russell Currey <ruscur@russell.cc> > Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> > --- > v5: Unchanged. > > arch/powerpc/lib/code-patching.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c > index 506413a2c25e..42fdadac6587 100644 > --- a/arch/powerpc/lib/code-patching.c > +++ b/arch/powerpc/lib/code-patching.c > @@ -26,9 +26,9 @@ > static int __patch_instruction(unsigned int *exec_addr, unsigned int instr, > unsigned int *patch_addr) > { > - int err; > + int err = 0; > > - __put_user_size(instr, patch_addr, 4, err); > + __put_user_asm(instr, patch_addr, err, "stw"); > if (err) > return err; > >
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c index 506413a2c25e..42fdadac6587 100644 --- a/arch/powerpc/lib/code-patching.c +++ b/arch/powerpc/lib/code-patching.c @@ -26,9 +26,9 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr, unsigned int *patch_addr) { - int err; + int err = 0; - __put_user_size(instr, patch_addr, 4, err); + __put_user_asm(instr, patch_addr, err, "stw"); if (err) return err;