bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] stat: be robust to PATH_MAX definition


From: Eric Blake
Subject: [PATCH] stat: be robust to PATH_MAX definition
Date: Mon, 20 Jun 2011 16:56:38 -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 <address@hidden>
---

I'm pushing this.

 ChangeLog    |    4 ++++
 lib/stat.c   |    8 ++++++++
 modules/stat |    1 +
 3 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1758d67..07be32f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2011-06-20  Eric Blake  <address@hidden>

+       stat: be robust to PATH_MAX definition
+       * lib/stat.c (rpl_stat): Require reasonable PATH_MAX.
+       * modules/stat (Depends-on): Add verify.
+
        test-stat: don't allocate PATH_MAX bytes
        * tests/test-stat.h (test_stat_func): Don't stack-allocate a
        PATH_MAX-sized buffer.
diff --git a/lib/stat.c b/lib/stat.c
index cbc9100..f07370d 100644
--- a/lib/stat.c
+++ b/lib/stat.c
@@ -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)
diff --git a/modules/stat b/modules/stat
index 6bc27ce..8a349a7 100644
--- a/modules/stat
+++ b/modules/stat
@@ -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
-- 
1.7.4.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]