github.com/opencontainers/runc@v1.2.0-rc.1.0.20240520010911-492dc558cdd6/libcontainer/dmz/nolibc/stackprotector.h (about)

     1  /* SPDX-License-Identifier: LGPL-2.1 OR MIT */
     2  /*
     3   * Stack protector support for NOLIBC
     4   * Copyright (C) 2023 Thomas Weißschuh <linux@weissschuh.net>
     5   */
     6  
     7  #ifndef _NOLIBC_STACKPROTECTOR_H
     8  #define _NOLIBC_STACKPROTECTOR_H
     9  
    10  #include "compiler.h"
    11  
    12  #if defined(_NOLIBC_STACKPROTECTOR)
    13  
    14  #include "sys.h"
    15  #include "stdlib.h"
    16  
    17  /* The functions in this header are using raw syscall macros to avoid
    18   * triggering stack protector errors themselves
    19   */
    20  
    21  __attribute__((weak,noreturn,section(".text.nolibc_stack_chk")))
    22  void __stack_chk_fail(void)
    23  {
    24  	pid_t pid;
    25  	my_syscall3(__NR_write, STDERR_FILENO, "!!Stack smashing detected!!\n", 28);
    26  	pid = my_syscall0(__NR_getpid);
    27  	my_syscall2(__NR_kill, pid, SIGABRT);
    28  	for (;;);
    29  }
    30  
    31  __attribute__((weak,noreturn,section(".text.nolibc_stack_chk")))
    32  void __stack_chk_fail_local(void)
    33  {
    34  	__stack_chk_fail();
    35  }
    36  
    37  __attribute__((weak,section(".data.nolibc_stack_chk")))
    38  uintptr_t __stack_chk_guard;
    39  
    40  static __no_stack_protector void __stack_chk_init(void)
    41  {
    42  	my_syscall3(__NR_getrandom, &__stack_chk_guard, sizeof(__stack_chk_guard), 0);
    43  	/* a bit more randomness in case getrandom() fails, ensure the guard is never 0 */
    44  	if (__stack_chk_guard != (uintptr_t) &__stack_chk_guard)
    45  		__stack_chk_guard ^= (uintptr_t) &__stack_chk_guard;
    46  }
    47  #else /* !defined(_NOLIBC_STACKPROTECTOR) */
    48  static void __stack_chk_init(void) {}
    49  #endif /* defined(_NOLIBC_STACKPROTECTOR) */
    50  
    51  #endif /* _NOLIBC_STACKPROTECTOR_H */