diff --git a/ChangeLog b/ChangeLog index 43cf653f40..00ec632130 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2003-08-27 Jakub Jelinek + + * sysdeps/unix/opendir.c (__opendir): Make sure even struct dirent64 + fits into allocation. Add padding on 32-bit arches so that + dirp->data is enough aligned for struct dirent64. + Avoid clearing of the buffer, just clear DIR structure. + 2003-08-26 Ulrich Drepper * nss/nsswitch.c: Add libc_hidden_def for __nss_lookup_function. diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c index 5e7c6e54a6..2938c67e4a 100644 --- a/sysdeps/unix/opendir.c +++ b/sysdeps/unix/opendir.c @@ -137,15 +137,17 @@ __opendir (const char *name) goto lose; #ifdef _STATBUF_ST_BLKSIZE - if (__builtin_expect ((size_t) statbuf.st_blksize >= sizeof (struct dirent), + if (__builtin_expect ((size_t) statbuf.st_blksize >= sizeof (struct dirent64), 1)) allocation = statbuf.st_blksize; else #endif - allocation = (BUFSIZ < sizeof (struct dirent) - ? sizeof (struct dirent) : BUFSIZ); + allocation = (BUFSIZ < sizeof (struct dirent64) + ? sizeof (struct dirent64) : BUFSIZ); - dirp = (DIR *) calloc (1, sizeof (DIR) + allocation); /* Zero-fill. */ + const int pad = -sizeof (DIR) % __alignof__ (struct dirent64); + + dirp = (DIR *) malloc (sizeof (DIR) + allocation + pad); if (dirp == NULL) lose: { @@ -154,7 +156,8 @@ __opendir (const char *name) __set_errno (save_errno); return NULL; } - dirp->data = (char *) (dirp + 1); + memset (dirp, '\0', sizeof (DIR)); + dirp->data = (char *) (dirp + 1) + pad; dirp->allocation = allocation; dirp->fd = fd;