diff options
author | Jim Meyering <jim@meyering.net> | 2001-09-03 18:21:53 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2001-09-03 18:21:53 +0000 |
commit | cb2a0f5e50b56213986ec1f8116773465b0b8fdb (patch) | |
tree | 5565ea3867ea66f1db08988afa893f16cac17253 | |
parent | 9525a77c983f74745e1cacacf5a99130ca4c7be0 (diff) | |
download | coreutils-cb2a0f5e50b56213986ec1f8116773465b0b8fdb.tar.xz |
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.
-rw-r--r-- | lib/xgetcwd.c | 35 |
1 files changed, 22 insertions, 13 deletions
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 } |