summaryrefslogtreecommitdiff
path: root/lib/xgetcwd.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2001-09-03 18:21:53 +0000
committerJim Meyering <jim@meyering.net>2001-09-03 18:21:53 +0000
commitcb2a0f5e50b56213986ec1f8116773465b0b8fdb (patch)
tree5565ea3867ea66f1db08988afa893f16cac17253 /lib/xgetcwd.c
parent9525a77c983f74745e1cacacf5a99130ca4c7be0 (diff)
downloadcoreutils-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.
Diffstat (limited to 'lib/xgetcwd.c')
-rw-r--r--lib/xgetcwd.c35
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
}