[glibc] support: Improve tst-support_descriptors compatibility with containers

Florian Weimer via Glibc-cvs <[email protected]>
Newsgroups gmane.comp.lib.glibc.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=55873e86e1861ffe010a83455ac7eb5df239ec3e

commit 55873e86e1861ffe010a83455ac7eb5df239ec3e
Author: Florian Weimer <[email protected]>
Date:   Mon May 4 17:18:38 2026 +0200

    support: Improve tst-support_descriptors compatibility with containers
    
    If /dev/null is bind-mounted, /dev and /dev/null are on different
    devices, so the expected failure has an additional line describe
    the device change.
    
    Reviewed-by: Carlos O'Donell <[email protected]>

Diff:
---
 support/tst-support_descriptors.c | 41 ++++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/support/tst-support_descriptors.c b/support/tst-support_descriptors.c
index 97d7284c69..d25cb7d67a 100644
--- a/support/tst-support_descriptors.c
+++ b/support/tst-support_descriptors.c
@@ -128,21 +128,48 @@ test_run (void)
   support_capture_subprocess_free (&proc);
   free (expected);
 
-  expected = xasprintf ("\nDifferences:\n"
-                        "error: descriptor %d changed from \"/dev/null\""
-                        " to \"/dev\"\n"
-                        "error: descriptor %d changed ino ",
-                        free_descriptor, free_descriptor);
   good = good && !support_record_failure_is_failed ();
   proc = support_capture_subprocess (&subprocess_changed_descriptor, NULL);
   good = good && support_record_failure_is_failed ();
   support_record_failure_reset (); /* Discard the reported error.  */
   report_subprocess_output ("subprocess_changed_descriptor", &proc);
-  TEST_VERIFY (strstr (proc.out.buffer, expected) != NULL);
+
+  expected = xasprintf ("\nDifferences:\n"
+                        "error: descriptor %d changed from \"/dev/null\""
+                        " to \"/dev\"\n"
+                        "error: descriptor %d changed ino ",
+                        free_descriptor, free_descriptor);
+  if (strstr (proc.out.buffer, expected) != NULL)
+    {
+      /* No change of device.  */
+      free (expected);
+    }
+  else
+    {
+      /* The device changed in addition to the inode number.  This
+         happens if /dev/null is bind-mounted from another file
+         system, so that /dev is on a difference device.  */
+      expected = xasprintf ("\nDifferences:\n"
+                            "error: descriptor %d changed from \"/dev/null\""
+                            " to \"/dev\"\n"
+                            "error: descriptor %d changed device ",
+                            free_descriptor, free_descriptor);
+      TEST_VERIFY (strstr (proc.out.buffer, expected) != NULL);
+      free (expected);
+
+      /* We assume that the inode number changes, although in theory
+         it is possible that the directory happens to have the same
+         inode number as the null device because it is on a different
+         file system.  */
+      expected = xasprintf ("\nerror: descriptor %d changed ino ",
+                            free_descriptor);
+      TEST_VERIFY (strstr (proc.out.buffer, expected) != NULL);
+      free (expected);
+    }
+
   support_capture_subprocess_check (&proc, "subprocess_changed_descriptor",
                                     0, sc_allow_stdout);
   support_capture_subprocess_free (&proc);
-  free (expected);
 }
 
 static int
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.