summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2022-05-06 14:31:06 +0100
committerJonathan Wakely <jwakely@redhat.com>2022-05-09 12:28:27 +0100
commitdf8e384d5f91076f35852baed0974793b37ec313 (patch)
tree1622c947c3ed72e140406769ba165ddd6af6ea8f /libstdc++-v3
parent197b7ace534e67ee2456149dcd03856483b4ecdb (diff)
libstdc++: Fix test that fails on Solaris [PR104731]
On Solaris the dirent::d_name member is a single char, causing this test to fail with warnings about buffer overflow. Change the test to use a union with additional space for writing a string to the d_name member. libstdc++-v3/ChangeLog: PR libstdc++/104731 * testsuite/27_io/filesystem/iterators/error_reporting.cc: Use a trailing char array as storage for dirent::d_name. (cherry picked from commit aa8bdfee1db818b9a56908ab0197ff02c54bf281)
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/iterators/error_reporting.cc35
1 files changed, 22 insertions, 13 deletions
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/iterators/error_reporting.cc b/libstdc++-v3/testsuite/27_io/filesystem/iterators/error_reporting.cc
index 1f297a731a3..1c8ea4c9249 100644
--- a/libstdc++-v3/testsuite/27_io/filesystem/iterators/error_reporting.cc
+++ b/libstdc++-v3/testsuite/27_io/filesystem/iterators/error_reporting.cc
@@ -28,35 +28,44 @@
int choice;
-struct dirent global_dirent;
-
extern "C" struct dirent* readdir(DIR*)
{
+ // On some targets dirent::d_name is very small, but the OS allocates
+ // a trailing char array after the dirent struct. Emulate that here.
+ union State
+ {
+ struct dirent d;
+ char buf[sizeof(struct dirent) + 16] = {};
+ };
+
+ static State state;
+ char* d_name = state.buf + offsetof(struct dirent, d_name);
+
switch (choice)
{
case 1:
- global_dirent.d_ino = 999;
+ state.d.d_ino = 999;
#if defined _GLIBCXX_HAVE_STRUCT_DIRENT_D_TYPE && defined DT_REG
- global_dirent.d_type = DT_REG;
+ state.d.d_type = DT_REG;
#endif
- global_dirent.d_reclen = 0;
- std::char_traits<char>::copy(global_dirent.d_name, "file", 5);
+ state.d.d_reclen = 0;
+ std::char_traits<char>::copy(d_name, "file", 5);
choice = 0;
- return &global_dirent;
+ return &state.d;
case 2:
- global_dirent.d_ino = 111;
+ state.d.d_ino = 111;
#if defined _GLIBCXX_HAVE_STRUCT_DIRENT_D_TYPE && defined DT_DIR
- global_dirent.d_type = DT_DIR;
+ state.d.d_type = DT_DIR;
#endif
- global_dirent.d_reclen = 60;
- std::char_traits<char>::copy(global_dirent.d_name, "subdir", 7);
+ state.d.d_reclen = 60;
+ std::char_traits<char>::copy(d_name, "subdir", 7);
choice = 1;
- return &global_dirent;
+ return &state.d;
default:
errno = EIO;
return nullptr;
}
- return &global_dirent;
+ return &state.d;
}
void