From: Ulrich Drepper Date: Sun, 19 Dec 2010 21:00:59 +0000 (-0500) Subject: More accurate computatin of reclen in readdir_r. X-Git-Tag: upstream/2.30~12605 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=db753e2cfb2051ebf20dc089f87c5b1297cc2cff;p=external%2Fglibc.git 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. --- diff --git a/ChangeLog b/ChangeLog index 7650dba..3db482a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2010-12-19 Ulrich Drepper + + * 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 * sysdeps/i386/i686/multiarch/strcmp.S: Undo accident checkin. 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 #undef readdir64_r weak_alias (__readdir_r, readdir64_r)