• Masahiro Yamada's avatar
    Revert "[PATCH] uml: export symbols added by GCC hardened" · 8635e8df
    Masahiro Yamada authored
    This reverts commit cead61a6.
    
    It exported __stack_smash_handler and __guard, while they may not be
    defined by anyone.
    
    The code *declares* __stack_smash_handler and __guard. It does not
    create weak symbols. If no external library is linked, they are left
    undefined, but yet exported.
    
    If a loadable module tries to access non-existing symbols, bad things
    (a page fault, NULL pointer dereference, etc.) will happen. So, the
    current code is wrong and dangerous.
    
    If the code were written as follows, it would *define* them as weak
    symbols so modules would be able to get access to them.
    
      void (*__stack_smash_handler)(void *) __attribute__((weak));
      EXPORT_SYMBOL(__stack_smash_handler);
    
      long __guard __attribute__((weak));
      EXPORT_SYMBOL(__guard);
    
    In fact, modpost forbids exporting undefined symbols. It shows an error
    message if it detects such a mistake.
    
      ERROR: modpost: "..." [...] was exported without definition
    
    Unfortunately, it is checked only when the code is built as modular.
    The problem described above has been unnoticed for a long time because
    arch/um/os-Linux/user_syms.c is always built-in.
    
    With a planned change in Kbuild, exporting undefined symbols will always
    result in a build error instead of a run-time error. It is a good thing,
    but we need to fix the breakage in advance.
    
    One fix is to define weak symbols as shown above. An alternative is to
    export them conditionally as follows:
    
      #ifdef CONFIG_STACKPROTECTOR
      extern void __stack_smash_handler(void *);
      EXPORT_SYMBOL(__stack_smash_handler);
    
      external long __guard;
      EXPORT_SYMBOL(__guard);
      #endif
    
    This is what other architectures do; EXPORT_SYMBOL(__stack_chk_guard)
    is guarded by #ifdef CONFIG_STACKPROTECTOR.
    
    However, adding the #ifdef guard is not sensible because UML cannot
    enable the stack-protector in the first place! (Please note UML does
    not select HAVE_STACKPROTECTOR in Kconfig.)
    
    So, the code is already broken (and unused) in multiple ways.
    
    Just remove.
    Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
    8635e8df
user_syms.c 1.2 KB