More accurate computatin of reclen in readdir_r.
authorUlrich Drepper <drepper@gmail.com>
Sun, 19 Dec 2010 21:00:59 +0000 (16:00 -0500)
committerUlrich Drepper <drepper@gmail.com>
Sun, 19 Dec 2010 21:00:59 +0000 (16:00 -0500)
Alignment issue can increase the reclen limit.
Make sure Linux 64-bit readdir_r also accounts for 64-bit alignment
in getdents.

ChangeLog
sysdeps/unix/readdir_r.c
sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c

index 7650dba..3db482a 100644 (file)
--- 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.
index 9372791..e166174 100644 (file)
@@ -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
index adb92db..12ca1a1 100644 (file)
@@ -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)