[tor-commits] [tor/master] Refactor retrieving the current working directory

nickm at torproject.org nickm at torproject.org
Fri Aug 4 16:27:45 UTC 2017


commit bfe740f0658dc05e9cc624a46ae21bb098117197
Author: cypherpunks <cypherpunks at torproject.org>
Date:   Thu Aug 3 19:45:46 2017 +0000

    Refactor retrieving the current working directory
    
    The GNU C Library (glibc) offers an function which allocates the
    necessary memory automatically [0]. When it is available, we use that.
    
    Otherwise we depend upon the `getcwd` function which requires a
    preallocated buffer (and its size). This function was used incorrectly
    by depending on the initial buffer size being big enough and otherwise
    failing to return the current working directory. The proper way of
    getting the current working directory requires a loop which doubles the
    buffer size if `getcwd` requires it. This code was copied from [1] with
    modifications to fit the context.
    
    [0] https://www.gnu.org/software/hurd/hurd/porting/guidelines.html
    [1] http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html
---
 configure.ac        |  1 +
 src/common/compat.c | 25 ++++++++++++++++++-------
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/configure.ac b/configure.ac
index 4092d10af..345e499ff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -481,6 +481,7 @@ AC_CHECK_FUNCS(
 	timingsafe_memcmp \
         flock \
         ftime \
+        get_current_dir_name \
         getaddrinfo \
         getifaddrs \
         getpass \
diff --git a/src/common/compat.c b/src/common/compat.c
index 4d110aba3..8e3d97420 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -2349,15 +2349,26 @@ get_parent_directory(char *fname)
 static char *
 alloc_getcwd(void)
 {
-#ifdef PATH_MAX
-#define MAX_CWD PATH_MAX
+#ifdef HAVE_GET_CURRENT_DIR_NAME
+  return get_current_dir_name();
 #else
-#define MAX_CWD 4096
-#endif
+  size_t size = 1024;
+  char *buf = NULL;
+  char *ptr = NULL;
+
+  while (ptr == NULL) {
+    buf = tor_realloc(buf, size);
+    ptr = getcwd(buf, size);
 
-  char path_buf[MAX_CWD];
-  char *path = getcwd(path_buf, sizeof(path_buf));
-  return path ? tor_strdup(path) : NULL;
+    if (ptr == NULL && errno != ERANGE) {
+      tor_free(buf);
+      return NULL;
+    }
+
+    size *= 2;
+  }
+  return buf;
+#endif
 }
 #endif
 





More information about the tor-commits mailing list