tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit bfe740f0658dc05e9cc624a46ae21bb098117197
parent 0265ced02b7a652c5941cb2c14ee1e0de0b1d90e
Author: cypherpunks <cypherpunks@torproject.org>
Date:   Thu,  3 Aug 2017 19:45:46 +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

Diffstat:
Mconfigure.ac | 1+
Msrc/common/compat.c | 25++++++++++++++++++-------
2 files changed, 19 insertions(+), 7 deletions(-)

diff --git 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 @@ -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