[hurd, commited] tst-xdirent: Fix allocating dirent for readdir_r call

Samuel Thibault samuel.thibault@ens-lyon.org
Tue Jan 7 00:58:34 GMT 2025


As documented in the glibc manual, “Some systems don’t define the d_name
element sufficiently long”, and it provides an example of using a union to
properly allocate the storage under the dirent.
---
 support/tst-xdirent.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/support/tst-xdirent.c b/support/tst-xdirent.c
index e14fab6934..d2aa042bbb 100644
--- a/support/tst-xdirent.c
+++ b/support/tst-xdirent.c
@@ -50,10 +50,14 @@ do_test (void)
 
   {
     DIR *d = xopendir (".");
-    struct dirent buf = { 0, };
-    TEST_VERIFY (xreaddir_r (d, &buf));
-    TEST_COMPARE_STRING (buf.d_name, ".");
-    while (xreaddir_r (d, &buf))
+    union
+      {
+	struct dirent d;
+	char b[offsetof (struct dirent, d_name) + NAME_MAX + 1];
+      } buf;
+    TEST_VERIFY (xreaddir_r (d, &buf.d));
+    TEST_COMPARE_STRING (buf.d.d_name, ".");
+    while (xreaddir_r (d, &buf.d))
       ;
     xclosedir (d);
   }
-- 
2.45.2



More information about the Libc-alpha mailing list