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


Reply via email to