Commit 4c9d0786 authored by Ihor Solodrai's avatar Ihor Solodrai Committed by Alexei Starovoitov
Browse files

selftests/bpf: Don't override SIGSEGV handler with ASAN

test_progs has custom SIGSEGV handler, which interferes with the
address sanitizer [1]. Add an #ifndef to avoid this.

Additionally, declare an __asan_on_error() to dump the test logs in
the same way it happens in the custom SIGSEGV handler.

[1] https://lore.kernel.org/bpf/73d832948b01dbc0ebc60d85574bdf8537f3a810.camel@gmail.com/



Acked-by: default avatarMykyta Yatsenko <yatsenko@meta.com>
Acked-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Signed-off-by: default avatarIhor Solodrai <ihor.solodrai@linux.dev>
Link: https://lore.kernel.org/r/20260223191118.655185-3-ihor.solodrai@linux.dev


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent a2714e73
Loading
Loading
Loading
Loading
+26 −10
Original line number Diff line number Diff line
@@ -1261,14 +1261,8 @@ int get_bpf_max_tramp_links(void)
	return ret;
}

#define MAX_BACKTRACE_SZ 128
void crash_handler(int signum)
static void dump_crash_log(void)
{
	void *bt[MAX_BACKTRACE_SZ];
	size_t sz;

	sz = backtrace(bt, ARRAY_SIZE(bt));

	fflush(stdout);
	stdout = env.stdout_saved;
	stderr = env.stderr_saved;
@@ -1277,12 +1271,32 @@ void crash_handler(int signum)
		env.test_state->error_cnt++;
		dump_test_log(env.test, env.test_state, true, false, NULL);
	}
}

#define MAX_BACKTRACE_SZ 128

void crash_handler(int signum)
{
	void *bt[MAX_BACKTRACE_SZ];
	size_t sz;

	sz = backtrace(bt, ARRAY_SIZE(bt));

	dump_crash_log();

	if (env.worker_id != -1)
		fprintf(stderr, "[%d]: ", env.worker_id);
	fprintf(stderr, "Caught signal #%d!\nStack trace:\n", signum);
	backtrace_symbols_fd(bt, sz, STDERR_FILENO);
}

#ifdef __SANITIZE_ADDRESS__
void __asan_on_error(void)
{
	dump_crash_log();
}
#endif

void hexdump(const char *prefix, const void *buf, size_t len)
{
	for (int i = 0; i < len; i++) {
@@ -1944,13 +1958,15 @@ int main(int argc, char **argv)
		.parser = parse_arg,
		.doc = argp_program_doc,
	};
	int err, i;

#ifndef __SANITIZE_ADDRESS__
	struct sigaction sigact = {
		.sa_handler = crash_handler,
		.sa_flags = SA_RESETHAND,
	};
	int err, i;

	sigaction(SIGSEGV, &sigact, NULL);
#endif

	env.stdout_saved = stdout;
	env.stderr_saved = stderr;