stat: be robust to PATH_MAX definition
authorEric Blake <eblake@redhat.com>
Mon, 20 Jun 2011 22:55:24 +0000 (16:55 -0600)
committerEric Blake <eblake@redhat.com>
Wed, 22 Jun 2011 20:55:57 +0000 (14:55 -0600)
Make this stack-allocation of PATH_MAX bytes more robust.

* lib/stat.c (rpl_stat): Require reasonable PATH_MAX.
* modules/stat (Depends-on): Add verify.

Signed-off-by: Eric Blake <eblake@redhat.com>
ChangeLog
lib/stat.c
modules/stat

index 440a244..b4b82fa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2011-06-22  Eric Blake  <eblake@redhat.com>
 
+       stat: be robust to PATH_MAX definition
+       * lib/stat.c (rpl_stat): Require reasonable PATH_MAX.
+       * modules/stat (Depends-on): Add verify.
+
        link: work around IRIX bug
        * m4/link.m4 (gl_FUNC_LINK): Expose the bug.
        * lib/link.c (rpl_link): Work around it.
index cbc9100..f07370d 100644 (file)
@@ -38,6 +38,7 @@ orig_stat (const char *filename, struct stat *buf)
 #include <stdbool.h>
 #include <string.h>
 #include "dosname.h"
+#include "verify.h"
 
 /* Store information about NAME into ST.  Work around bugs with
    trailing slashes.  Mingw has other bugs (such as st_ino always
@@ -63,6 +64,12 @@ rpl_stat (char const *name, struct stat *st)
     }
 #endif /* REPLACE_FUNC_STAT_FILE */
 #if REPLACE_FUNC_STAT_DIR
+  /* The only known systems where REPLACE_FUNC_STAT_DIR is needed also
+     have a constant PATH_MAX.  */
+# ifndef PATH_MAX
+#  error "Please port this replacement to your platform"
+# endif
+
   if (result == -1 && errno == ENOENT)
     {
       /* Due to mingw's oddities, there are some directories (like
@@ -77,6 +84,7 @@ rpl_stat (char const *name, struct stat *st)
       char fixed_name[PATH_MAX + 1] = {0};
       size_t len = strlen (name);
       bool check_dir = false;
+      verify (PATH_MAX <= 4096);
       if (PATH_MAX <= len)
         errno = ENAMETOOLONG;
       else if (len)
index 6bc27ce..8a349a7 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 sys_stat
 dosname         [test $REPLACE_STAT = 1]
 stdbool         [test $REPLACE_STAT = 1]
+verify          [test $REPLACE_STAT = 1]
 
 configure.ac:
 gl_FUNC_STAT