lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Mon, 23 Mar 2020 17:11:36 -0400
From:   Brian Gerst <brgerst@...il.com>
To:     Ingo Molnar <mingo@...nel.org>
Cc:     Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
        "the arch/x86 maintainers" <x86@...nel.org>,
        Thomas Gleixner <tglx@...utronix.de>,
        Borislav Petkov <bp@...en8.de>,
        "H . Peter Anvin" <hpa@...or.com>,
        Andy Lutomirski <luto@...nel.org>,
        Dominik Brodowski <linux@...inikbrodowski.net>
Subject: Re: [PATCH] x86/entry: Fix SYS_NI() build failure

On Mon, Mar 23, 2020 at 4:11 AM Ingo Molnar <mingo@...nel.org> wrote:
>
>
> * Brian Gerst <brgerst@...il.com> wrote:
>
> > Pull the common code out from the SYS_NI macros into a new __SYS_NI macro.
> > Also conditionalize the X64 version in preparation for enabling syscall
> > wrappers on 32-bit native kernels.
> >
> > Signed-off-by: Brian Gerst <brgerst@...il.com>
> > Reviewed-by: Dominik Brodowski <linux@...inikbrodowski.net>
> > Reviewed-by: Andy Lutomirski <luto@...nel.org>
>
> >  #define COMPAT_SYS_NI(name)                                          \
> > -     SYSCALL_ALIAS(__ia32_compat_sys_##name, sys_ni_posix_timers);   \
> > -     SYSCALL_ALIAS(__x32_compat_sys_##name, sys_ni_posix_timers)
> > +     __IA32_COMPAT_SYS_NI(name)                                      \
> > +     __X32_COMPAT_SYS_NI(name)
> >
> >  #endif /* CONFIG_COMPAT */
> >
> > @@ -231,9 +245,9 @@ struct pt_regs;
> >       __X64_COND_SYSCALL(name)                                        \
> >       __IA32_COND_SYSCALL(name)
> >
> > -#ifndef SYS_NI
> > -#define SYS_NI(name) SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers);
> > -#endif
> > +#define SYS_NI(name)                                                 \
> > +     __X64_SYS_NI(name)                                              \
> > +     __IA32_SYS_NI(name)
>
> This breaks the x86-64 build on !CONFIG_POSIX_TIMERS (and probably also
> with some x32 build variants), because of a missing ';' between
> __X64_SYS_NI() and __IA32_SYS_NI().
>
> I suspect testing didn't catch this because SYS_NI() is rarely used in
> our x86-64 Kconfig space.
>
> Very lightly tested fix attached.
>
> I didn't see the COND_SYSCALL_COMPAT() build failure, but seems to have a
> similar bug.
>
> Thanks,
>
>         Ingo
>
> Signed-off-by: Ingo Molnar <mingo@...nel.org>
>
> ---
>  arch/x86/include/asm/syscall_wrapper.h | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
> index e10efa1454bc..8929419b9783 100644
> --- a/arch/x86/include/asm/syscall_wrapper.h
> +++ b/arch/x86/include/asm/syscall_wrapper.h
> @@ -214,12 +214,12 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
>   * COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in
>   * kernel/time/posix-stubs.c to cover this case as well.
>   */
> -#define COND_SYSCALL_COMPAT(name)                                      \
> -       __IA32_COMPAT_COND_SYSCALL(name)                                \
> +#define COND_SYSCALL_COMPAT(name)                                      \
> +       __IA32_COMPAT_COND_SYSCALL(name);                               \
>         __X32_COMPAT_COND_SYSCALL(name)
>
>  #define COMPAT_SYS_NI(name)                                            \
> -       __IA32_COMPAT_SYS_NI(name)                                      \
> +       __IA32_COMPAT_SYS_NI(name);                                     \
>         __X32_COMPAT_SYS_NI(name)
>
>  #endif /* CONFIG_COMPAT */
> @@ -257,7 +257,7 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
>         __IA32_COND_SYSCALL(name)
>
>  #define SYS_NI(name)                                                   \
> -       __X64_SYS_NI(name)                       6e4847640c6aebcaa2d9b3686cecc91b41f09269                       \
> +       __X64_SYS_NI(name);                                             \
>         __IA32_SYS_NI(name)
>
>

A simpler fix would be to add the semicolon to the end of the __SYS_NI
macro.  COND_SYSCALL_COMPAT isn't a problem because it expands to a
function instead of an asm statement.

That said, I think __SYS_NI should be changed to mirror
__COND_SYSCALL, so that the function prototypes match (see commit
6e484764)

--
Brian Gerst

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ