lkml.org 
[lkml]   [2021]   [Jul]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 7/7] signal: Verify the alignment and size of siginfo_t

    Update the static assertions about siginfo_t to also describe
    it's alignment and size.

    While investigating if it was possible to add a 64bit field into
    siginfo_t[1] it became apparent that the alignment of siginfo_t
    is as much a part of the ABI as the size of the structure.

    If the alignment changes siginfo_t when embedded in another structure
    can move to a different offset. Which is not acceptable from an ABI
    structure.

    So document that fact and add static assertions to notify developers
    if they change change the alignment by accident.

    [1] https://lkml.kernel.org/r/YJEZdhe6JGFNYlum@elver.google.com
    Acked-by: Marco Elver <elver@google.com>
    v1: https://lkml.kernel.org/r/20210505141101.11519-4-ebiederm@xmission.co
    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    ---
    arch/arm/kernel/signal.c | 2 ++
    arch/arm64/kernel/signal.c | 2 ++
    arch/arm64/kernel/signal32.c | 2 ++
    arch/sparc/kernel/signal32.c | 2 ++
    arch/sparc/kernel/signal_64.c | 2 ++
    arch/x86/kernel/signal_compat.c | 6 ++++++
    include/uapi/asm-generic/siginfo.h | 5 +++++
    7 files changed, 21 insertions(+)

    diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
    index 7ef453e8a96f..f3800c0f428b 100644
    --- a/arch/arm/kernel/signal.c
    +++ b/arch/arm/kernel/signal.c
    @@ -737,6 +737,8 @@ static_assert(NSIGBUS == 5);
    static_assert(NSIGTRAP == 6);
    static_assert(NSIGCHLD == 6);
    static_assert(NSIGSYS == 2);
    +static_assert(sizeof(siginfo_t) == 128);
    +static_assert(__alignof__(siginfo_t) == 4);
    static_assert(offsetof(siginfo_t, si_signo) == 0x00);
    static_assert(offsetof(siginfo_t, si_errno) == 0x04);
    static_assert(offsetof(siginfo_t, si_code) == 0x08);
    diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
    index 4413b6a4e32a..d3721e01441b 100644
    --- a/arch/arm64/kernel/signal.c
    +++ b/arch/arm64/kernel/signal.c
    @@ -1011,6 +1011,8 @@ static_assert(NSIGBUS == 5);
    static_assert(NSIGTRAP == 6);
    static_assert(NSIGCHLD == 6);
    static_assert(NSIGSYS == 2);
    +static_assert(sizeof(siginfo_t) == 128);
    +static_assert(__alignof__(siginfo_t) == 8);
    static_assert(offsetof(siginfo_t, si_signo) == 0x00);
    static_assert(offsetof(siginfo_t, si_errno) == 0x04);
    static_assert(offsetof(siginfo_t, si_code) == 0x08);
    diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c
    index ab1775216712..d3be01c46bec 100644
    --- a/arch/arm64/kernel/signal32.c
    +++ b/arch/arm64/kernel/signal32.c
    @@ -469,6 +469,8 @@ static_assert(NSIGBUS == 5);
    static_assert(NSIGTRAP == 6);
    static_assert(NSIGCHLD == 6);
    static_assert(NSIGSYS == 2);
    +static_assert(sizeof(compat_siginfo_t) == 128);
    +static_assert(__alignof__(compat_siginfo_t) == 4);
    static_assert(offsetof(compat_siginfo_t, si_signo) == 0x00);
    static_assert(offsetof(compat_siginfo_t, si_errno) == 0x04);
    static_assert(offsetof(compat_siginfo_t, si_code) == 0x08);
    diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c
    index 65fd26ae9d25..4276b9e003ca 100644
    --- a/arch/sparc/kernel/signal32.c
    +++ b/arch/sparc/kernel/signal32.c
    @@ -757,6 +757,8 @@ static_assert(NSIGBUS == 5);
    static_assert(NSIGTRAP == 6);
    static_assert(NSIGCHLD == 6);
    static_assert(NSIGSYS == 2);
    +static_assert(sizeof(compat_siginfo_t) == 128);
    +static_assert(__alignof__(compat_siginfo_t) == 4);
    static_assert(offsetof(compat_siginfo_t, si_signo) == 0x00);
    static_assert(offsetof(compat_siginfo_t, si_errno) == 0x04);
    static_assert(offsetof(compat_siginfo_t, si_code) == 0x08);
    diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c
    index a58e0cc45d24..cea23cf95600 100644
    --- a/arch/sparc/kernel/signal_64.c
    +++ b/arch/sparc/kernel/signal_64.c
    @@ -567,6 +567,8 @@ static_assert(NSIGBUS == 5);
    static_assert(NSIGTRAP == 6);
    static_assert(NSIGCHLD == 6);
    static_assert(NSIGSYS == 2);
    +static_assert(sizeof(siginfo_t) == 128);
    +static_assert(__alignof__(siginfo_t) == 8);
    static_assert(offsetof(siginfo_t, si_signo) == 0x00);
    static_assert(offsetof(siginfo_t, si_errno) == 0x04);
    static_assert(offsetof(siginfo_t, si_code) == 0x08);
    diff --git a/arch/x86/kernel/signal_compat.c b/arch/x86/kernel/signal_compat.c
    index 06743ec054d2..b52407c56000 100644
    --- a/arch/x86/kernel/signal_compat.c
    +++ b/arch/x86/kernel/signal_compat.c
    @@ -34,7 +34,13 @@ static inline void signal_compat_build_tests(void)
    BUILD_BUG_ON(NSIGSYS != 2);

    /* This is part of the ABI and can never change in size: */
    + BUILD_BUG_ON(sizeof(siginfo_t) != 128);
    BUILD_BUG_ON(sizeof(compat_siginfo_t) != 128);
    +
    + /* This is a part of the ABI and can never change in alignment */
    + BUILD_BUG_ON(__alignof__(siginfo_t) != 8);
    + BUILD_BUG_ON(__alignof__(compat_siginfo_t) != 4);
    +
    /*
    * The offsets of all the (unioned) si_fields are fixed
    * in the ABI, of course. Make sure none of them ever
    diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/siginfo.h
    index 5a3c221f4c9d..3ba180f550d7 100644
    --- a/include/uapi/asm-generic/siginfo.h
    +++ b/include/uapi/asm-generic/siginfo.h
    @@ -29,6 +29,11 @@ typedef union sigval {
    #define __ARCH_SI_ATTRIBUTES
    #endif

    +/*
    + * Be careful when extending this union. On 32bit siginfo_t is 32bit
    + * aligned. Which means that a 64bit field or any other field that
    + * would increase the alignment of siginfo_t will break the ABI.
    + */
    union __sifields {
    /* kill() */
    struct {
    --
    2.20.1
    \
     
     \ /
      Last update: 2021-07-16 18:08    [W:4.405 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site