summary refs log tree commit diff
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
parent283007197c526f8f59bdc029a38d76538c70b0ff (diff)
downloadglibc-db753e2cfb2051ebf20dc089f87c5b1297cc2cff.tar.gz
glibc-db753e2cfb2051ebf20dc089f87c5b1297cc2cff.tar.xz
glibc-db753e2cfb2051ebf20dc089f87c5b1297cc2cff.zip
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.
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/unix/readdir_r.c3
-rw-r--r--sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c1
3 files changed, 9 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 7650dbae4f..3db482a368 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-12-19  Ulrich Drepper  <drepper@gmail.com>
+
+	* sysdeps/unix/readdir_r.c (__READDIR_R): Compute reclen more accurate.
+	* sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c: Define
+	GETDENTS_64BIT_ALIGNED.
+
 2010-12-14  Ulrich Drepper  <dreper@gmail.com>
 
 	* sysdeps/i386/i686/multiarch/strcmp.S: Undo accident checkin.
diff --git a/sysdeps/unix/readdir_r.c b/sysdeps/unix/readdir_r.c
index 93727912c1..e166174883 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 adb92db6af..12ca1a1ef7 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)