1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-21 02:50:18 +03:00

boot: Add undefined sanitizer support

Sadly, no stack traces, but this is better than nothing.
This commit is contained in:
Jan Janssen 2023-03-12 16:51:48 +01:00
parent 0b482b37f9
commit 1e7ff4ba88
4 changed files with 62 additions and 5 deletions

View File

@ -6,7 +6,7 @@
static unsigned log_count = 0;
_noreturn_ static void freeze(void) {
void freeze(void) {
for (;;)
BS->Stall(60 * 1000 * 1000);
}

View File

@ -19,6 +19,7 @@ __attribute__((no_stack_protector, noinline)) void __stack_chk_guard_init(void);
# define __stack_chk_guard_init()
#endif
_noreturn_ void freeze(void);
void log_wait(void);
_gnu_printf_(2, 3) EFI_STATUS log_internal(EFI_STATUS status, const char *format, ...);
#define log_error_status(status, ...) log_internal(status, __VA_ARGS__)

View File

@ -179,17 +179,23 @@ efi_disabled_c_args = cc.get_supported_arguments(
'-fcf-protection=none',
'-fno-asynchronous-unwind-tables',
'-fno-exceptions',
'-fno-sanitize=all',
'-fno-unwind-tables',
)
efi_c_args += efi_disabled_c_args
efi_c_ld_args += efi_disabled_c_args
efi_override_options = [
'b_coverage=false',
'b_pgo=off',
'b_sanitize=none',
]
if get_option('b_sanitize') == 'undefined'
efi_disabled_c_args += cc.get_supported_arguments('-fno-sanitize-link-runtime')
else
efi_disabled_c_args += cc.get_supported_arguments('-fno-sanitize=all')
efi_override_options += 'b_sanitize=none'
endif
efi_c_args += efi_disabled_c_args
efi_c_ld_args += efi_disabled_c_args
if cc.get_id() == 'clang'
# clang is too picky sometimes.
efi_c_args += '-Wno-unused-command-line-argument'
@ -252,6 +258,10 @@ stub_sources = files(
'stub.c',
)
if get_option('b_sanitize') == 'undefined'
libefi_sources += files('ubsan.c')
endif
if host_machine.cpu_family() in ['x86', 'x86_64']
stub_sources += files('linux_x86.c')
endif

46
src/boot/efi/ubsan.c Normal file
View File

@ -0,0 +1,46 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "log.h"
typedef struct {
const char *filename;
uint32_t line;
uint32_t column;
} SourceLocation;
/* Note that all ubsan handlers have a pointer to a type-specific struct passed as first argument.
* Since we do not inspect the extra data in it we can just treat it as a SourceLocation struct
* directly to keep things simple. */
#define HANDLER(name, ...) \
_used_ _noreturn_ void __ubsan_handle_##name(__VA_ARGS__); \
void __ubsan_handle_##name(__VA_ARGS__) { \
log_error("systemd-boot: %s in %s@%u:%u", \
__func__, \
location->filename, \
location->line, \
location->column); \
freeze(); \
}
#define UNARY_HANDLER(name) HANDLER(name, SourceLocation *location, uintptr_t v)
#define BINARY_HANDLER(name) HANDLER(name, SourceLocation *location, uintptr_t v1, uintptr_t v2)
UNARY_HANDLER(load_invalid_value);
UNARY_HANDLER(negate_overflow);
UNARY_HANDLER(out_of_bounds);
UNARY_HANDLER(type_mismatch_v1);
UNARY_HANDLER(vla_bound_not_positive);
BINARY_HANDLER(add_overflow);
BINARY_HANDLER(divrem_overflow);
BINARY_HANDLER(implicit_conversion);
BINARY_HANDLER(mul_overflow);
BINARY_HANDLER(pointer_overflow);
BINARY_HANDLER(shift_out_of_bounds);
BINARY_HANDLER(sub_overflow);
HANDLER(builtin_unreachable, SourceLocation *location);
HANDLER(invalid_builtin, SourceLocation *location);
HANDLER(nonnull_arg, SourceLocation *location);
HANDLER(nonnull_return_v1, SourceLocation *attr_location, SourceLocation *location);