]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
selftests/bpf: Don't override SIGSEGV handler with ASAN
authorIhor Solodrai <ihor.solodrai@linux.dev>
Mon, 23 Feb 2026 19:11:18 +0000 (11:11 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 24 Feb 2026 16:19:49 +0000 (08:19 -0800)
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: Mykyta Yatsenko <yatsenko@meta.com>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Link: https://lore.kernel.org/r/20260223191118.655185-3-ihor.solodrai@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/test_progs.c

index d1418ec1f3513dcf72396536ab8ed8142e2d6d13..0929f4a7bda4602fbea4f9fe4cd1113e4be7418c 100644 (file)
@@ -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;