]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 27 Aug 2003 16:54:04 +0000 (16:54 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 27 Aug 2003 16:54:04 +0000 (16:54 +0000)
2003-08-27  Jakub Jelinek  <jakub@redhat.com>

* 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.

ChangeLog
sysdeps/unix/opendir.c

index 43cf653f40eae766f0cca6a29f80c9cde3604f3a..00ec632130f6cc0b3e228f08d776efd6fcee03be 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2003-08-27  Jakub Jelinek  <jakub@redhat.com>
+
+       * 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  <drepper@redhat.com>
 
        * nss/nsswitch.c: Add libc_hidden_def for __nss_lookup_function.
index 5e7c6e54a6f3c2601c6b1e494a62546341048175..2938c67e4a12e8ee77c4a2cab1b94084b490bc3c 100644 (file)
@@ -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;