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