]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/testsuite: handle failure to start process for later attach test
authorAndrew Burgess <aburgess@redhat.com>
Wed, 25 Jun 2025 10:24:30 +0000 (11:24 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Thu, 26 Jun 2025 12:39:24 +0000 (13:39 +0100)
Commit:

  commit b23903836007d1acaf7f8c059ab000ee83fcebfa
  Date:   Tue Mar 21 13:01:26 2023 +0100

      gdb: linux-namespaces: enter user namespace when appropriate

added a new test gdb.base/user-namespace-attach.exp.  It has been
reported that this test will sometimes fail, like this:

  (gdb) attach 184732
  Attaching to process 184732
  warning: process 184732 is a zombie - the process has already terminated
  ptrace: Operation not permitted.
  (gdb) FAIL: gdb.base/user-namespace-attach.exp: flags=--mount --map-root-user: attach to inferior

the test tries to run the 'unshare' application.  Sometimes though,
the application is present, but the set of flags used is not
supported (maybe due to restrictions on the local machine), so we see
behaviour like this:

  $ unshare --mount --map-root-user /bin/true; echo $?
  unshare: unshare failed: Operation not permitted
  1

Handle this case by first running 'unshare' with the same flags, but
using '/bin/true', if this fails then assume the flags are not
supported, and skip the test.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33108

gdb/testsuite/gdb.base/user-namespace-attach.exp

index 9936bb998eb00529134ecbd5fbafb95724d8eed1..741093c2c1450598d5480560b1f6b5596d9f7b0f 100644 (file)
@@ -56,10 +56,22 @@ proc run_test { flags } {
        set prefix ""
     }
 
+    set unshare_cmd "unshare $flags"
 
+    # Run '/bin/true' using UNSHARE_CMD.  If the flags in UNSHARE_CMD
+    # aren't supported then this will fail, this means we shouldn't
+    # spawn the command with our test executable and try attaching.
+    #
+    # This will also fail if /bin/true isn't present, or doesn't work
+    # as we expect.  But this should be fine for many targets.
+    set res [remote_exec target "$unshare_cmd /bin/true"]
+    if { [lindex $res 0] != 0 } {
+       unsupported "unshare flags not supported"
+       return
+    }
 
     set inferior_spawn_id \
-       [spawn_wait_for_attach [list "unshare $flags $::binfile"]]
+       [spawn_wait_for_attach [list "$unshare_cmd $::binfile"]]
     if { $inferior_spawn_id == -1 } {
        unsupported "failed to spawn for attach"
        return