From 45c24c06543eeb5eda07101aea5bb4488da9174a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 27 Aug 2003 16:54:04 +0000 Subject: Update. 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. --- sysdeps/unix/opendir.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'sysdeps/unix/opendir.c') 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; -- cgit v1.2.3