From cb2a0f5e50b56213986ec1f8116773465b0b8fdb Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Mon, 3 Sep 2001 18:21:53 +0000 Subject: Fix the !HAVE_GETCWD_NULL code to behave more like the HAVE_GETCWD_NULL code. Include pathmax.h if not HAVE_GETCWD. Do not include xalloc.h. (INITIAL_BUFFER_SIZE): New symbol. Do not use xmalloc / xrealloc, since the caller is responsible for handling errors. Preserve errno around `free' during failure. Do not overrun buffer when using getwd. --- lib/xgetcwd.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) (limited to 'lib/xgetcwd.c') diff --git a/lib/xgetcwd.c b/lib/xgetcwd.c index 578a01771..85ac36873 100644 --- a/lib/xgetcwd.c +++ b/lib/xgetcwd.c @@ -39,12 +39,12 @@ extern int errno; #if HAVE_GETCWD char *getcwd (); #else +# include "pathmax.h" +# define INITIAL_BUFFER_SIZE (PATH_MAX + 1) char *getwd (); # define getcwd(Buf, Max) getwd (Buf) #endif -#include "xalloc.h" - /* Return the current directory, newly allocated, arbitrarily long. Return NULL and set errno on error. */ @@ -54,26 +54,35 @@ xgetcwd () #if HAVE_GETCWD_NULL return getcwd (NULL, 0); #else - size_t buf_size = 128; /* must be a power of 2 */ - char *buf = NULL; + + /* The initial buffer size for the working directory. A power of 2 + detects arithmetic overflow earlier, but is not required. */ +# ifndef INITIAL_BUFFER_SIZE +# define INITIAL_BUFFER_SIZE 128 +# endif + + size_t buf_size = INITIAL_BUFFER_SIZE; while (1) { char *cwd; - buf = (char *) xrealloc (buf, buf_size); - + int saved_errno; + char *buf = malloc (buf_size); + if (! buf) + return NULL; cwd = getcwd (buf, buf_size); - if (cwd != NULL) + if (cwd) return cwd; - if (errno != ERANGE) + saved_errno = errno; + free (buf); + if (saved_errno != ERANGE) + return NULL; + buf_size *= 2; + if (buf_size == 0) { - free (buf); + errno = ENOMEM; return NULL; } - - buf_size *= 2; - if (buf_size == 0) - xalloc_die (); } #endif } -- cgit v1.2.3-54-g00ecf