Re: [v5 17/20] x86/umip: Force a page fault when unable to copy emulated result to user

Andy Lutomirski <[email protected]>
Newsgroups gmane.linux.msdos.general,gmane.linux.kernel,gmane.comp.emulators.wine.devel
Message-ID <CALCETrW=QOnXUFoDS0rFN0bzN4nB8a8-EOqM_YPhm1EJ7Q07pA@mail.gmail.com>
On Fri, Mar 3, 2017 at 1:41 PM, Ricardo Neri
<[email protected]> wrote:
> fixup_umip_exception will be called from do_general_protection. If the
> former returns false, the latter will issue a SIGSEGV with SEND_SIG_PRIV.
> However, when emulation is successful but the emulated result cannot be
> copied to user space memory, it is more accurate to issue a SIGSEGV with
> SEGV_MAPERR with the offending address. A new function is inspired in
> force_sig_info_fault is introduced to model the page fault.
>
> Signed-off-by: Ricardo Neri <[email protected]>
> ---
>  arch/x86/kernel/umip.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 43 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/kernel/umip.c b/arch/x86/kernel/umip.c
> index e932f40..5b6a7cf 100644
> --- a/arch/x86/kernel/umip.c
> +++ b/arch/x86/kernel/umip.c
> @@ -170,6 +170,41 @@ static int __emulate_umip_insn(struct insn *insn, enum umip_insn umip_inst,
>  }
>
>  /**
> + * __force_sig_info_umip_fault - Force a SIGSEGV with SEGV_MAPERR
> + * @address:   Address that caused the signal
> + * @regs:      Register set containing the instruction pointer
> + *
> + * Force a SIGSEGV signal with SEGV_MAPERR as the error code. This function is
> + * intended to be used to provide a segmentation fault when the result of the
> + * UMIP emulation could not be copied to the user space memory.
> + *
> + * Return: none
> + */
> +static void __force_sig_info_umip_fault(void __user *address,
> +                                       struct pt_regs *regs)
> +{
> +       siginfo_t info;
> +       struct task_struct *tsk = current;
> +
> +       if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV)) {
> +               printk_ratelimited("%s[%d] umip emulation segfault ip:%lx sp:%lx error:%lx in %lx\n",
> +                                  tsk->comm, task_pid_nr(tsk), regs->ip,
> +                                  regs->sp, UMIP_PF_USER | UMIP_PF_WRITE,
> +                                  regs->ip);
> +       }
> +
> +       tsk->thread.cr2         = (unsigned long)address;
> +       tsk->thread.error_code  = UMIP_PF_USER | UMIP_PF_WRITE;

Please just move enum x86_pf_error_code into a header and rename the
fields X86_PF_USER, etc rather than duplicating it.

--Andy
--
To unsubscribe from this list: send the line "unsubscribe linux-msdos" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.