lkml.org 
[lkml]   [2020]   [Mar]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC][PATCH v2 14/22] x86: ia32_setup_frame(): consolidate uaccess areas
    Date
    From: Al Viro <viro@zeniv.linux.org.uk>

    Currently we have user_access block, followed by __put_user(),
    deciding what the restorer will be and finally a put_user_try
    block.

    Moving the calculation of restorer first allows the rest
    (actual copyout work) to coalesce into a single user_access block.

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    ---
    arch/x86/ia32/ia32_signal.c | 39 ++++++++++++---------------------------
    1 file changed, 12 insertions(+), 27 deletions(-)

    diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
    index 799ca5b31b87..7018c2c325a1 100644
    --- a/arch/x86/ia32/ia32_signal.c
    +++ b/arch/x86/ia32/ia32_signal.c
    @@ -236,7 +236,6 @@ int ia32_setup_frame(int sig, struct ksignal *ksig,
    {
    struct sigframe_ia32 __user *frame;
    void __user *restorer;
    - int err = 0;
    void __user *fp = NULL;

    /* copy_to_user optimizes that into a single 8 byte store */
    @@ -252,21 +251,6 @@ int ia32_setup_frame(int sig, struct ksignal *ksig,

    frame = get_sigframe(ksig, regs, sizeof(*frame), &fp);

    - if (!access_ok(frame, sizeof(*frame)))
    - return -EFAULT;
    -
    - if (__put_user(sig, &frame->sig))
    - return -EFAULT;
    -
    - if (!user_access_begin(&frame->sc, sizeof(struct sigcontext_32)))
    - return -EFAULT;
    -
    - unsafe_put_sigcontext32(&frame->sc, fp, regs, set, Efault);
    - user_access_end();
    -
    - if (__put_user(set->sig[1], &frame->extramask[0]))
    - return -EFAULT;
    -
    if (ksig->ka.sa.sa_flags & SA_RESTORER) {
    restorer = ksig->ka.sa.sa_restorer;
    } else {
    @@ -278,19 +262,20 @@ int ia32_setup_frame(int sig, struct ksignal *ksig,
    restorer = &frame->retcode;
    }

    - put_user_try {
    - put_user_ex(ptr_to_compat(restorer), &frame->pretcode);
    -
    - /*
    - * These are actually not used anymore, but left because some
    - * gdb versions depend on them as a marker.
    - */
    - put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode);
    - } put_user_catch(err);
    -
    - if (err)
    + if (!user_access_begin(frame, sizeof(*frame)))
    return -EFAULT;

    + unsafe_put_user(sig, &frame->sig, Efault);
    + unsafe_put_sigcontext32(&frame->sc, fp, regs, set, Efault);
    + unsafe_put_user(set->sig[1], &frame->extramask[0], Efault);
    + unsafe_put_user(ptr_to_compat(restorer), &frame->pretcode, Efault);
    + /*
    + * These are actually not used anymore, but left because some
    + * gdb versions depend on them as a marker.
    + */
    + unsafe_put_user(*((u64 *)&code), (u64 __user *)frame->retcode, Efault);
    + user_access_end();
    +
    /* Set up registers for signal handler */
    regs->sp = (unsigned long) frame;
    regs->ip = (unsigned long) ksig->ka.sa.sa_handler;
    --
    2.11.0
    \
     
     \ /
      Last update: 2020-03-27 03:33    [W:2.582 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site