Patch "selftests/bpf: Fix backtrace printing for selftests crashes" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    selftests/bpf: Fix backtrace printing for selftests crashes

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     selftests-bpf-fix-backtrace-printing-for-selftests-c.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a9b9832b126b15a85f9160887f4027a8c5e2b6a5
Author: Eduard Zingerman <eddyz87@xxxxxxxxx>
Date:   Thu Oct 3 14:03:07 2024 -0700

    selftests/bpf: Fix backtrace printing for selftests crashes
    
    [ Upstream commit 5bf1557e3d6a69113649d831276ea2f97585fc33 ]
    
    test_progs uses glibc specific functions backtrace() and
    backtrace_symbols_fd() to print backtrace in case of SIGSEGV.
    
    Recent commit (see fixes) updated test_progs.c to define stub versions
    of the same functions with attriubte "weak" in order to allow linking
    test_progs against musl libc. Unfortunately this broke the backtrace
    handling for glibc builds.
    
    As it turns out, glibc defines backtrace() and backtrace_symbols_fd()
    as weak:
    
      $ llvm-readelf --symbols /lib64/libc.so.6 \
         | grep -P '( backtrace_symbols_fd| backtrace)$'
      4910: 0000000000126b40   161 FUNC    WEAK   DEFAULT    16 backtrace
      6843: 0000000000126f90   852 FUNC    WEAK   DEFAULT    16 backtrace_symbols_fd
    
    So does test_progs:
    
     $ llvm-readelf --symbols test_progs \
        | grep -P '( backtrace_symbols_fd| backtrace)$'
      2891: 00000000006ad190    15 FUNC    WEAK   DEFAULT    13 backtrace
     11215: 00000000006ad1a0    41 FUNC    WEAK   DEFAULT    13 backtrace_symbols_fd
    
    In such situation dynamic linker is not obliged to favour glibc
    implementation over the one defined in test_progs.
    
    Compiling with the following simple modification to test_progs.c
    demonstrates the issue:
    
      $ git diff
      ...
      \--- a/tools/testing/selftests/bpf/test_progs.c
      \+++ b/tools/testing/selftests/bpf/test_progs.c
      \@@ -1817,6 +1817,7 @@ int main(int argc, char **argv)
              if (err)
                      return err;
    
      +       *(int *)0xdeadbeef  = 42;
              err = cd_flavor_subdir(argv[0]);
              if (err)
                      return err;
    
      $ ./test_progs
      [0]: Caught signal #11!
      Stack trace:
      <backtrace not supported>
      Segmentation fault (core dumped)
    
    Resolve this by hiding stub definitions behind __GLIBC__ macro check
    instead of using "weak" attribute.
    
    Fixes: c9a83e76b5a9 ("selftests/bpf: Fix compile if backtrace support missing in libc")
    Signed-off-by: Eduard Zingerman <eddyz87@xxxxxxxxx>
    Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx>
    Tested-by: Tony Ambardar <tony.ambardar@xxxxxxxxx>
    Reviewed-by: Tony Ambardar <tony.ambardar@xxxxxxxxx>
    Acked-by: Daniel Xu <dxu@xxxxxxxxx>
    Link: https://lore.kernel.org/bpf/20241003210307.3847907-1-eddyz87@xxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c
index 11d4c51c7d211..6068f5bde8fd5 100644
--- a/tools/testing/selftests/bpf/test_progs.c
+++ b/tools/testing/selftests/bpf/test_progs.c
@@ -16,11 +16,13 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 
+/* backtrace() and backtrace_symbols_fd() are glibc specific,
+ * use header file when glibc is available and provide stub
+ * implementations when another libc implementation is used.
+ */
 #ifdef __GLIBC__
 #include <execinfo.h> /* backtrace */
-#endif
-
-/* Default backtrace funcs if missing at link */
+#else
 __weak int backtrace(void **buffer, int size)
 {
 	return 0;
@@ -30,6 +32,7 @@ __weak void backtrace_symbols_fd(void *const *buffer, int size, int fd)
 {
 	dprintf(fd, "<backtrace not supported>\n");
 }
+#endif /*__GLIBC__ */
 
 static bool verbose(void)
 {




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux