[tor-commits] [tor/master] Stop using MAX_PATH, it might not be defined

nickm at torproject.org nickm at torproject.org
Thu May 31 16:38:21 UTC 2012


commit d916fc38b6386c59f3e405e2f3b35e1d505fd806
Author: Sebastian Hahn <sebastian at torproject.org>
Date:   Sat Mar 10 16:53:01 2012 +0100

    Stop using MAX_PATH, it might not be defined
    
    This broke compilation on Hurd
---
 changes/bug5355     |    4 ++++
 src/common/compat.c |   27 ++++++++++++++++++++-------
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/changes/bug5355 b/changes/bug5355
new file mode 100644
index 0000000..f850fe1
--- /dev/null
+++ b/changes/bug5355
@@ -0,0 +1,4 @@
+  o Major bugfixes:
+    - Fix a compilation issue on GNU Hurd, which doesn't have PATH_MAX. Fixes
+      bug 5355; bugfix on 0.2.3.11-alpha.
+
diff --git a/src/common/compat.c b/src/common/compat.c
index 30bde3d..ec365c3 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -1645,7 +1645,10 @@ make_path_absolute(char *fname)
 
   return absfname;
 #else
-  char path[PATH_MAX+1];
+/* We use this as a starting path length. Not too large seems sane. */
+#define START_PATH_LENGTH 100
+  size_t path_length = START_PATH_LENGTH;
+  char *path = tor_malloc(path_length);
   char *absfname = NULL;
 
   tor_assert(fname);
@@ -1653,13 +1656,23 @@ make_path_absolute(char *fname)
   if (fname[0] == '/') {
     absfname = tor_strdup(fname);
   } else {
-    if (getcwd(path, PATH_MAX) != NULL) {
-      tor_asprintf(&absfname, "%s/%s", path, fname);
-    } else {
-      /* If getcwd failed, the best we can do here is keep using the
-       * relative path.  (Perhaps / isn't readable by this UID/GID.) */
-      absfname = tor_strdup(fname);
+    int save_errno = errno;
+    errno = 0;
+    while (getcwd(path, path_length) == NULL) {
+      if (errno == ERANGE) {
+        path_length*=2;
+        path = tor_realloc(path, path_length);
+      } else {
+        /* If getcwd failed with an error other than ERANGE, the best we can
+         * do here is keep using the relative path.  (Perhaps / isn't readable
+         * by this UID/GID.) */
+        absfname = tor_strdup(fname);
+        break;
+      }
     }
+    errno = save_errno;
+    tor_asprintf(&absfname, "%s/%s", path, fname);
+    tor_free(path);
   }
 
   return absfname;





More information about the tor-commits mailing list