[tor-commits] [tor/master] compat.c coverage: simplify under-tested alloc_getcwd.

nickm at torproject.org nickm at torproject.org
Mon Jun 20 15:03:18 UTC 2016


commit ba28da8de55a4df8b958c06e5a589062171bb437
Author: Nick Mathewson <nickm at torproject.org>
Date:   Mon Jun 20 10:46:53 2016 -0400

    compat.c coverage: simplify under-tested alloc_getcwd.
    
    Yes, HURD lacks PATH_MAX.  But we already limited the maximum buffer
    to 4096, so why not just use that?
---
 src/common/compat.c | 33 +++++++++++----------------------
 1 file changed, 11 insertions(+), 22 deletions(-)

diff --git a/src/common/compat.c b/src/common/compat.c
index 72dffe2..24543cd 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -2341,28 +2341,15 @@ get_parent_directory(char *fname)
 static char *
 alloc_getcwd(void)
 {
-    int saved_errno = errno;
-/* We use this as a starting path length. Not too large seems sane. */
-#define START_PATH_LENGTH 128
-/* Nobody has a maxpath longer than this, as far as I know.  And if they
- * do, they shouldn't. */
-#define MAX_SANE_PATH_LENGTH 4096
-    size_t path_length = START_PATH_LENGTH;
-    char *path = tor_malloc(path_length);
-
-    errno = 0;
-    while (getcwd(path, path_length) == NULL) {
-      if (errno == ERANGE && path_length < MAX_SANE_PATH_LENGTH) {
-        path_length*=2;
-        path = tor_realloc(path, path_length);
-      } else {
-        tor_free(path);
-        path = NULL;
-        break;
-      }
-    }
-    errno = saved_errno;
-    return path;
+#ifdef PATH_MAX
+#define MAX_CWD PATH_MAX
+#else
+#define MAX_CWD 4096
+#endif
+
+  char path_buf[MAX_CWD];
+  char *path = getcwd(path_buf, sizeof(path_buf));
+  return path ? tor_strdup(path) : NULL;
 }
 #endif
 
@@ -2393,11 +2380,13 @@ make_path_absolute(char *fname)
       tor_asprintf(&absfname, "%s/%s", path, fname);
       tor_free(path);
     } else {
+      /* LCOV_EXCL_START Can't make getcwd fail. */
       /* If getcwd failed, the best we can do here is keep using the
        * relative path.  (Perhaps / isn't readable by this UID/GID.) */
       log_warn(LD_GENERAL, "Unable to find current working directory: %s",
                strerror(errno));
       absfname = tor_strdup(fname);
+      /* LCOV_EXCL_STOP */
     }
   }
   return absfname;





More information about the tor-commits mailing list