2002-07-06 Bruno Haible <bruno@clisp.org>
authorroland <roland>
Mon, 26 Aug 2002 11:37:17 +0000 (11:37 +0000)
committerroland <roland>
Mon, 26 Aug 2002 11:37:17 +0000 (11:37 +0000)
* sysdeps/generic/glob.c: Include <limits.h>.
(NAME_MAX): Define a fallback.
(glob_in_dir): Allocate enough room for a 'struct dirent64' on the
stack.
* posix/tst-dir.c: Include <stddef.h>, for offsetof.
(main): Allocate enough room for a 'struct dirent64' on the stack.
* posix/tst-gnuglob.c (my_DIR): Allocate enough room for a
'struct dirent'.

posix/tst-dir.c
posix/tst-gnuglob.c
sysdeps/generic/glob.c

index 5946ea9..400849a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2000-2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -21,6 +21,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <mcheck.h>
+#include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -48,7 +49,12 @@ main (int argc, char *argv[])
   DIR *dir2;
   int result = 0;
   struct dirent64 *d;
-  struct dirent64 direntbuf;
+  union
+    {
+      struct dirent64 d;
+      char room [offsetof (struct dirent64, d_name[0]) + NAME_MAX + 1];
+    }
+    direntbuf;
   char *objdir_copy1;
   char *objdir_copy2;
   char *buf;
@@ -316,7 +322,7 @@ main (int argc, char *argv[])
 
   /* Try to find the new directory.  */
   rewinddir (dir1);
-  while (readdir64_r (dir1, &direntbuf, &d) == 0 && d != NULL)
+  while (readdir64_r (dir1, &direntbuf.d, &d) == 0 && d != NULL)
     {
 #ifdef _DIRENT_HAVE_D_TYPE
       if (d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
@@ -436,7 +442,7 @@ main (int argc, char *argv[])
 
   /* We now should have a directory and a file in the new directory.  */
   rewinddir (dir2);
-  while (readdir64_r (dir2, &direntbuf, &d) == 0 && d != NULL)
+  while (readdir64_r (dir2, &direntbuf.d, &d) == 0 && d != NULL)
     {
       if (strcmp (d->d_name, ".") == 0
          || strcmp (d->d_name, "..") == 0
index 5ca6e42..b15dad1 100644 (file)
@@ -1,6 +1,6 @@
 /* Test the GNU extensions in glob which allow the user to provide callbacks
    for the filesystem access functions.
-   Copyright (C) 2001 Free Software Foundation, Inc.
+   Copyright (C) 2001-2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
 
@@ -93,6 +93,7 @@ typedef struct
   int level;
   int idx;
   struct dirent d;
+  char room_for_dirent[NAME_MAX];
 } my_DIR;
 
 
index ce9c3d8..5e56629 100644 (file)
@@ -191,6 +191,14 @@ extern void abort (), exit ();
 
 #endif /* Standard headers.  */
 
+/* NAME_MAX is usually defined in <dirent.h> or <limits.h>.  */
+#if defined HAVE_LIMITS_H || defined __GNU_LIBRARY__
+# include <limits.h>
+#endif
+#ifndef NAME_MAX
+# define NAME_MAX (sizeof (((struct dirent *) 0)->d_name))
+#endif
+
 #ifndef        ANSI_STRING
 
 # ifndef bzero
@@ -1330,15 +1338,21 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
                  size_t len;
 #if defined HAVE_DIRENT64 && !defined COMPILE_GLOB64
                  struct dirent64 *d;
-                 struct dirent64 d64;
+                 union
+                   {
+                     struct dirent64 d64;
+                     char room [offsetof (struct dirent64, d_name[0])
+                                + NAME_MAX + 1];
+                   }
+                 d64buf;
 
                  if (flags & GLOB_ALTDIRFUNC)
                    {
                      struct dirent *d32 = (*pglob->gl_readdir) (stream);
                      if (d32 != NULL)
                        {
-                         CONVERT_DIRENT_DIRENT64 (&d64, d32);
-                         d = &d64;
+                         CONVERT_DIRENT_DIRENT64 (&d64buf.d64, d32);
+                         d = &d64buf.d64;
                        }
                      else
                        d = NULL;