Mercurial > hg > octave-nkf > gnulib-hg
changeset 3452:baf8d5fe777a
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.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Mon, 03 Sep 2001 18:21:53 +0000 |
parents | c613b4d20a05 |
children | f584fe45f97f |
files | lib/xgetcwd.c |
diffstat | 1 files changed, 22 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/xgetcwd.c +++ b/lib/xgetcwd.c @@ -39,12 +39,12 @@ #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 @@ #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 }