X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fxgetcwd.c;h=85ac368738950bfd7183c944ca2eedc8871ae8ee;hb=e6995fc57b107d86e2601d1c3f3538d42ba1bade;hp=55e12afcd1d79d7d5854aa0e8e4f3ccadf13a38e;hpb=904dc8bf73cb93f620eb1d159c2124f801d790fd;p=gnulib.git diff --git a/lib/xgetcwd.c b/lib/xgetcwd.c index 55e12afcd..85ac36873 100644 --- a/lib/xgetcwd.c +++ b/lib/xgetcwd.c @@ -39,41 +39,50 @@ 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. */ char * xgetcwd () { -#if defined __GLIBC__ && __GLIBC__ >= 2 +#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 *ret; - buf = (char *) xrealloc (buf, buf_size); - + char *cwd; + 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 }