From fa39685d5c7df2502213418bead44e9543a9b9ec Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 3 Aug 2007 03:35:12 +0000 Subject: [PATCH] * sysdeps/unix/opendir.c (__alloc_dir): Don't initialize ->data. Avoid memset, add explicit initialization. * sysdeps/unix/dirstream.h (struct __dirstream): Move data elemtn to the end and change into zero-sized array. Move lock member to fill a hole on 64-bit platforms. --- ChangeLog | 7 +++++-- sysdeps/unix/dirstream.h | 5 +++-- sysdeps/unix/opendir.c | 13 ++++++------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2514584e09..169bb7edaa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,10 @@ 2007-08-02 Ulrich Drepper - * sysdeps/unix/dirstream.h (struct __dirstream): Move lock member - to fill a hole on 64-bit platforms. + * sysdeps/unix/opendir.c (__alloc_dir): Don't initialize ->data. + Avoid memset, add explicit initialization. + * sysdeps/unix/dirstream.h (struct __dirstream): Move data elemtn + to the end and change into zero-sized array. + Move lock member to fill a hole on 64-bit platforms. * stdlib/stdlib.h: Remove __strto*_internal prototypes and strto* inline functions. diff --git a/sysdeps/unix/dirstream.h b/sysdeps/unix/dirstream.h index b1d80f0017..8303f07fab 100644 --- a/sysdeps/unix/dirstream.h +++ b/sysdeps/unix/dirstream.h @@ -17,7 +17,6 @@ 02111-1307 USA. */ #ifndef _DIRSTREAM_H - #define _DIRSTREAM_H 1 #include @@ -35,12 +34,14 @@ struct __dirstream __libc_lock_define (, lock) /* Mutex lock for this structure. */ - char *data; /* Directory block. */ size_t allocation; /* Space allocated for the block. */ size_t size; /* Total valid data in the block. */ size_t offset; /* Current offset into the block. */ off_t filepos; /* Position of next entry to read. */ + + /* Directory block. */ + char data[0] __attribute__ ((aligned (__alignof__ (void*)))); }; #define _DIR_dirfd(dirp) ((dirp)->fd) diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c index 59772cda75..36fb6f458d 100644 --- a/sysdeps/unix/opendir.c +++ b/sysdeps/unix/opendir.c @@ -155,9 +155,7 @@ __alloc_dir (int fd, bool close_fd, const struct stat64 *statp) allocation = (BUFSIZ < sizeof (struct dirent64) ? sizeof (struct dirent64) : BUFSIZ); - const int pad = -sizeof (DIR) % __alignof__ (struct dirent64); - - DIR *dirp = (DIR *) malloc (sizeof (DIR) + allocation + pad); + DIR *dirp = (DIR *) malloc (sizeof (DIR) + allocation); if (dirp == NULL) lose: { @@ -169,14 +167,15 @@ __alloc_dir (int fd, bool close_fd, const struct stat64 *statp) } return NULL; } - memset (dirp, '\0', sizeof (DIR)); - dirp->data = (char *) (dirp + 1) + pad; - dirp->allocation = allocation; - dirp->fd = fd; + dirp->allocation = allocation; #ifndef NOT_IN_libc __libc_lock_init (dirp->lock); #endif + dirp->fd = fd; + dirp->size = 0; + dirp->offset = 0; + dirp->filepos = 0; return dirp; }