aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2010-12-19 16:00:59 -0500
committerUlrich Drepper <drepper@gmail.com>2010-12-19 16:00:59 -0500
commitdb753e2cfb2051ebf20dc089f87c5b1297cc2cff (patch)
tree5d68eb522e716f4a0ed441e60bb6259bafc40418 /sysdeps/unix
parent283007197c526f8f59bdc029a38d76538c70b0ff (diff)
downloadglibc-db753e2cfb2051ebf20dc089f87c5b1297cc2cff.zip
glibc-db753e2cfb2051ebf20dc089f87c5b1297cc2cff.tar.gz
glibc-db753e2cfb2051ebf20dc089f87c5b1297cc2cff.tar.bz2
More accurate computatin of reclen in readdir_r.
Alignment issue can increase the reclen limit. Make sure Linux 64-bit readdir_r also accounts for 64-bit alignment in getdents.
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/readdir_r.c3
-rw-r--r--sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c1
2 files changed, 3 insertions, 1 deletions
diff --git a/sysdeps/unix/readdir_r.c b/sysdeps/unix/readdir_r.c
index 9372791..e166174 100644
--- a/sysdeps/unix/readdir_r.c
+++ b/sysdeps/unix/readdir_r.c
@@ -117,7 +117,8 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result)
#ifdef GETDENTS_64BIT_ALIGNED
/* The d_reclen value might include padding which is not part of
the DIRENT_TYPE data structure. */
- reclen = MIN (reclen, sizeof (DIRENT_TYPE));
+ reclen = MIN (reclen,
+ offsetof (DIRENT_TYPE, d_name) + sizeof (dp->d_name));
#endif
*result = memcpy (entry, dp, reclen);
#ifdef GETDENTS_64BIT_ALIGNED
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c
index adb92db..12ca1a1 100644
--- a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c
+++ b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c
@@ -1,4 +1,5 @@
#define readdir64_r __no_readdir64_r_decl
+#define GETDENTS_64BIT_ALIGNED 1
#include <sysdeps/unix/readdir_r.c>
#undef readdir64_r
weak_alias (__readdir_r, readdir64_r)