• G
    mm/pgtable: Fix multiple -Wstringop-overflow warnings · 25226df4
    Gustavo A. R. Silva 提交于
    The actual size of the following arrays at run-time depends on
    CONFIG_X86_PAE.
    
    427         pmd_t *u_pmds[MAX_PREALLOCATED_USER_PMDS];
    428         pmd_t *pmds[MAX_PREALLOCATED_PMDS];
    
    If CONFIG_X86_PAE is not enabled, their final size will be zero (which
    is technically not a legal storage size in C, but remains "valid" via
    the GNU extension). In that case, the compiler complains about trying to
    access objects of size zero when calling functions where these objects
    are passed as arguments.
    
    Fix this by sanity-checking the size of those arrays just before the
    function calls. Also, the following warnings are fixed by these changes
    when building with GCC 11+ and -Wstringop-overflow enabled:
    
    arch/x86/mm/pgtable.c:437:13: warning: ‘preallocate_pmds.constprop’ accessing 8 bytes in a region of size 0 [-Wstringop-overflow=]
    arch/x86/mm/pgtable.c:440:13: warning: ‘preallocate_pmds.constprop’ accessing 8 bytes in a region of size 0 [-Wstringop-overflow=]
    arch/x86/mm/pgtable.c:462:9: warning: ‘free_pmds.constprop’ accessing 8 bytes in a region of size 0 [-Wstringop-overflow=]
    arch/x86/mm/pgtable.c:455:9: warning: ‘pgd_prepopulate_user_pmd’ accessing 8 bytes in a region of size 0 [-Wstringop-overflow=]
    arch/x86/mm/pgtable.c:464:9: warning: ‘free_pmds.constprop’ accessing 8 bytes in a region of size 0 [-Wstringop-overflow=]
    
    This is one of the last cases in the ongoing effort to globally enable
    -Wstringop-overflow.
    
    The alternative to this is to make the originally suggested change:
    make the pmds argument from an array pointer to a pointer pointer. That
    situation is considered "legal" for C in the sense that it does not have
    a way to reason about the storage. i.e.:
    
    -static void pgd_prepopulate_pmd(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmds[])
    +static void pgd_prepopulate_pmd(struct mm_struct *mm, pgd_t *pgd, pmd_t **pmds)
    
    With the above change, there's no difference in binary output, and the
    compiler warning is silenced.
    
    However, with this patch, the compiler can actually figure out that it
    isn't using the code at all, and it gets dropped:
    
       text    data     bss     dec     hex filename
       8218     718      32    8968    2308 arch/x86/mm/pgtable.o.before
       7765     694      32    8491    212b arch/x86/mm/pgtable.o.after
    
    So this case (fixing a warning and reducing image size) is a clear win.
    
    Additionally drops an old work-around for GCC in the same code.
    
    Link: https://github.com/KSPP/linux/issues/203
    Link: https://github.com/KSPP/linux/issues/181Signed-off-by: NGustavo A. R. Silva <gustavoars@kernel.org>
    Reviewed-by: NKees Cook <keescook@chromium.org>
    Signed-off-by: NKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/Yytb67xvrnctxnEe@work
    25226df4
pgtable.c 21.0 KB