lkml.org 
[lkml]   [2020]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v28 19/22] x86/fault: Add helper function to sanitize error code
    Date
    From: Sean Christopherson <sean.j.christopherson@intel.com>

    Add helper function to sanitize error code to prepare for vDSO exception
    fixup, which will expose the error code to userspace and runs before
    set_signal_archinfo(), i.e. suppresses the signal when fixup is successful.

    Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
    ---
    arch/x86/mm/fault.c | 24 +++++++++++++++++-------
    1 file changed, 17 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
    index dee9504cde79..6b662d272af6 100644
    --- a/arch/x86/mm/fault.c
    +++ b/arch/x86/mm/fault.c
    @@ -682,6 +682,18 @@ pgtable_bad(struct pt_regs *regs, unsigned long error_code,
    oops_end(flags, regs, sig);
    }

    +static void sanitize_error_code(unsigned long address,
    + unsigned long *error_code)
    +{
    + /*
    + * To avoid leaking information about the kernel page
    + * table layout, pretend that user-mode accesses to
    + * kernel addresses are always protection faults.
    + */
    + if (address >= TASK_SIZE_MAX)
    + *error_code |= X86_PF_PROT;
    +}
    +
    static void set_signal_archinfo(unsigned long address,
    unsigned long error_code)
    {
    @@ -738,6 +750,8 @@ no_context(struct pt_regs *regs, unsigned long error_code,
    * faulting through the emulate_vsyscall() logic.
    */
    if (current->thread.sig_on_uaccess_err && signal) {
    + sanitize_error_code(address, &error_code);
    +
    set_signal_archinfo(address, error_code);

    /* XXX: hwpoison faults will set the wrong code. */
    @@ -886,13 +900,7 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
    if (is_errata100(regs, address))
    return;

    - /*
    - * To avoid leaking information about the kernel page table
    - * layout, pretend that user-mode accesses to kernel addresses
    - * are always protection faults.
    - */
    - if (address >= TASK_SIZE_MAX)
    - error_code |= X86_PF_PROT;
    + sanitize_error_code(address, &error_code);

    if (likely(show_unhandled_signals))
    show_signal_msg(regs, error_code, address, tsk);
    @@ -1009,6 +1017,8 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
    if (is_prefetch(regs, error_code, address))
    return;

    + sanitize_error_code(address, &error_code);
    +
    set_signal_archinfo(address, error_code);

    #ifdef CONFIG_MEMORY_FAILURE
    --
    2.25.0
    \
     
     \ /
      Last update: 2020-03-04 00:40    [W:2.068 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site