* [PATCH 00/10] Convert signal32 to user read access by block @ 2021-03-19 11:06 Christophe Leroy 2021-03-19 11:06 ` [PATCH 01/10] signal: Add unsafe_get_compat_sigset() Christophe Leroy 2021-04-10 14:28 ` [PATCH 00/10] Convert signal32 to user read access by block Michael Ellerman 0 siblings, 2 replies; 3+ messages in thread From: Christophe Leroy @ 2021-03-19 11:06 UTC (permalink / raw) To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman, cmr Cc: linux-kernel, linuxppc-dev, linux-arch Similarly to the work done earlier with writes, this series converts signal32 to using user_read_access_begin/end and unsafe_get_user() and friends. Applies on to of the signal64 series, ie on merge-test (ca6e327fefb2) Christophe Leroy (10): signal: Add unsafe_get_compat_sigset() powerpc/uaccess: Also perform 64 bits copies in unsafe_copy_from_user() on ppc32 powerpc/signal: Add unsafe_copy_ck{fpr/vsx}_from_user powerpc/signal32: Rename save_user_regs_unsafe() and save_general_regs_unsafe() powerpc/signal32: Remove ifdefery in middle of if/else in sigreturn() powerpc/signal32: Perform access_ok() inside restore_user_regs() powerpc/signal32: Reorder user reads in restore_tm_user_regs() powerpc/signal32: Convert restore_[tm]_user_regs() to user access block powerpc/signal32: Convert do_setcontext[_tm]() to user access block powerpc/signal32: Simplify logging in sigreturn() arch/powerpc/include/asm/ptrace.h | 2 +- arch/powerpc/include/asm/uaccess.h | 6 +- arch/powerpc/kernel/signal.h | 22 +++ arch/powerpc/kernel/signal_32.c | 251 ++++++++++++++++------------- include/linux/compat.h | 35 ++++ include/linux/uaccess.h | 1 + 6 files changed, 205 insertions(+), 112 deletions(-) -- 2.25.0 ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 01/10] signal: Add unsafe_get_compat_sigset() 2021-03-19 11:06 [PATCH 00/10] Convert signal32 to user read access by block Christophe Leroy @ 2021-03-19 11:06 ` Christophe Leroy 2021-04-10 14:28 ` [PATCH 00/10] Convert signal32 to user read access by block Michael Ellerman 1 sibling, 0 replies; 3+ messages in thread From: Christophe Leroy @ 2021-03-19 11:06 UTC (permalink / raw) To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman, cmr Cc: linux-kernel, linuxppc-dev, linux-arch In the same way as commit 14026b94ccfe ("signal: Add unsafe_put_compat_sigset()"), this time add unsafe_get_compat_sigset() macro which is the 'unsafe' version of get_compat_sigset() For the bigendian, use unsafe_get_user() directly to avoid intermediate copy through the stack. For the littleendian, use a straight unsafe_copy_from_user(). This commit adds the generic fallback for unsafe_copy_from_user(). Architectures wanting to use unsafe_get_compat_sigset() have to make sure they have their own unsafe_copy_from_user(). Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> --- include/linux/compat.h | 35 +++++++++++++++++++++++++++++++++++ include/linux/uaccess.h | 1 + 2 files changed, 36 insertions(+) diff --git a/include/linux/compat.h b/include/linux/compat.h index 6e65be753603..5112c3e35782 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -465,6 +465,34 @@ put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set, unsafe_put_user(__s->sig[0], &__c->sig[0], label); \ } \ } while (0) + +#define unsafe_get_compat_sigset(set, compat, label) do { \ + const compat_sigset_t __user *__c = compat; \ + compat_sigset_word hi, lo; \ + sigset_t *__s = set; \ + \ + switch (_NSIG_WORDS) { \ + case 4: \ + unsafe_get_user(lo, &__c->sig[7], label); \ + unsafe_get_user(hi, &__c->sig[6], label); \ + __s->sig[3] = hi | (((long)lo) << 32); \ + fallthrough; \ + case 3: \ + unsafe_get_user(lo, &__c->sig[5], label); \ + unsafe_get_user(hi, &__c->sig[4], label); \ + __s->sig[2] = hi | (((long)lo) << 32); \ + fallthrough; \ + case 2: \ + unsafe_get_user(lo, &__c->sig[3], label); \ + unsafe_get_user(hi, &__c->sig[2], label); \ + __s->sig[1] = hi | (((long)lo) << 32); \ + fallthrough; \ + case 1: \ + unsafe_get_user(lo, &__c->sig[1], label); \ + unsafe_get_user(hi, &__c->sig[0], label); \ + __s->sig[0] = hi | (((long)lo) << 32); \ + } \ +} while (0) #else #define unsafe_put_compat_sigset(compat, set, label) do { \ compat_sigset_t __user *__c = compat; \ @@ -472,6 +500,13 @@ put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set, \ unsafe_copy_to_user(__c, __s, sizeof(*__c), label); \ } while (0) + +#define unsafe_get_compat_sigset(set, compat, label) do { \ + const compat_sigset_t __user *__c = compat; \ + sigset_t *__s = set; \ + \ + unsafe_copy_from_user(__s, __c, sizeof(*__c), label); \ +} while (0) #endif extern int compat_ptrace_request(struct task_struct *child, diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h index c7c6e8b8344d..c05e903cef02 100644 --- a/include/linux/uaccess.h +++ b/include/linux/uaccess.h @@ -397,6 +397,7 @@ long strnlen_user_nofault(const void __user *unsafe_addr, long count); #define unsafe_get_user(x,p,e) unsafe_op_wrap(__get_user(x,p),e) #define unsafe_put_user(x,p,e) unsafe_op_wrap(__put_user(x,p),e) #define unsafe_copy_to_user(d,s,l,e) unsafe_op_wrap(__copy_to_user(d,s,l),e) +#define unsafe_copy_from_user(d,s,l,e) unsafe_op_wrap(__copy_from_user(d,s,l),e) static inline unsigned long user_access_save(void) { return 0UL; } static inline void user_access_restore(unsigned long flags) { } #endif -- 2.25.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 00/10] Convert signal32 to user read access by block 2021-03-19 11:06 [PATCH 00/10] Convert signal32 to user read access by block Christophe Leroy 2021-03-19 11:06 ` [PATCH 01/10] signal: Add unsafe_get_compat_sigset() Christophe Leroy @ 2021-04-10 14:28 ` Michael Ellerman 1 sibling, 0 replies; 3+ messages in thread From: Michael Ellerman @ 2021-04-10 14:28 UTC (permalink / raw) To: Benjamin Herrenschmidt, Michael Ellerman, Christophe Leroy, cmr, Paul Mackerras Cc: linux-kernel, linuxppc-dev, linux-arch On Fri, 19 Mar 2021 11:06:49 +0000 (UTC), Christophe Leroy wrote: > Similarly to the work done earlier with writes, this series > converts signal32 to using user_read_access_begin/end and > unsafe_get_user() and friends. > > Applies on to of the signal64 series, ie on merge-test (ca6e327fefb2) > > Christophe Leroy (10): > signal: Add unsafe_get_compat_sigset() > powerpc/uaccess: Also perform 64 bits copies in > unsafe_copy_from_user() on ppc32 > powerpc/signal: Add unsafe_copy_ck{fpr/vsx}_from_user > powerpc/signal32: Rename save_user_regs_unsafe() and > save_general_regs_unsafe() > powerpc/signal32: Remove ifdefery in middle of if/else in sigreturn() > powerpc/signal32: Perform access_ok() inside restore_user_regs() > powerpc/signal32: Reorder user reads in restore_tm_user_regs() > powerpc/signal32: Convert restore_[tm]_user_regs() to user access > block > powerpc/signal32: Convert do_setcontext[_tm]() to user access block > powerpc/signal32: Simplify logging in sigreturn() > > [...] Applied to powerpc/next. [01/10] signal: Add unsafe_get_compat_sigset() https://git.kernel.org/powerpc/c/fb05121fd6a20f0830ff2a4420c51af6ca4ac6e7 [02/10] powerpc/uaccess: Also perform 64 bits copies in unsafe_copy_from_user() on ppc32 https://git.kernel.org/powerpc/c/c1cc1570bc8d94f288060f262f11be8f7672578c [03/10] powerpc/signal: Add unsafe_copy_ck{fpr/vsx}_from_user https://git.kernel.org/powerpc/c/7c11f8893a76ac4e86c07f4b57371d5fa593627f [04/10] powerpc/signal32: Rename save_user_regs_unsafe() and save_general_regs_unsafe() https://git.kernel.org/powerpc/c/f918a81e209f24acb45cd935bcfb78d2c024f6a1 [05/10] powerpc/signal32: Remove ifdefery in middle of if/else in sigreturn() https://git.kernel.org/powerpc/c/ca9e1605cdd9473a0eb4d6da238d2524be12591a [06/10] powerpc/signal32: Perform access_ok() inside restore_user_regs() https://git.kernel.org/powerpc/c/362471b3192e4184fff5fedee1ea20bdf637a0c8 [07/10] powerpc/signal32: Reorder user reads in restore_tm_user_regs() https://git.kernel.org/powerpc/c/036fc2cb1dc2245c2ea7d2f03c7af80417b6310c [08/10] powerpc/signal32: Convert restore_[tm]_user_regs() to user access block https://git.kernel.org/powerpc/c/627b72bee84d6652e0af26617e71ce2b3c18fcd5 [09/10] powerpc/signal32: Convert do_setcontext[_tm]() to user access block https://git.kernel.org/powerpc/c/887f3ceb51cd34109ac17bfc98695162e299e657 [10/10] powerpc/signal32: Simplify logging in sigreturn() https://git.kernel.org/powerpc/c/c7393a71eb1abdda7e3a3ef798bae60de11540ec cheers ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-04-10 14:29 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-03-19 11:06 [PATCH 00/10] Convert signal32 to user read access by block Christophe Leroy 2021-03-19 11:06 ` [PATCH 01/10] signal: Add unsafe_get_compat_sigset() Christophe Leroy 2021-04-10 14:28 ` [PATCH 00/10] Convert signal32 to user read access by block Michael Ellerman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).