1
0
mirror of https://git.savannah.gnu.org/git/gnulib.git synced 2025-08-17 12:41:05 +03:00

getcwd: fix mingw bugs

On mingw, getcwd(NULL,1) succeeds, even though glibc documents that
with a non-zero size, the allocation will not exceed that many bytes.

On mingw, getcwd has the wrong signature.  However, we don't have
to check for this if anything else triggers the replacement.

Also, fix a type bug that crept into the original getcwd-lgpl commit.

* m4/getcwd.m4 (gl_FUNC_GETCWD_NULL): Detect one mingw bug.
* doc/posix-functions/getcwd.texi (getcwd): Document the problems.
* lib/getcwd-lgpl.c (rpl_getcwd): Fix return type.

Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Eric Blake
2011-04-27 20:40:21 -06:00
parent 2cd4d6d902
commit 8585ce2ff5
4 changed files with 20 additions and 6 deletions

View File

@@ -1,3 +1,10 @@
2011-04-27 Eric Blake <eblake@redhat.com>
getcwd: fix mingw bugs
* m4/getcwd.m4 (gl_FUNC_GETCWD_NULL): Detect one mingw bug.
* doc/posix-functions/getcwd.texi (getcwd): Document the problems.
* lib/getcwd-lgpl.c (rpl_getcwd): Fix return type.
2011-04-27 Bruno Haible <bruno@clisp.org> 2011-04-27 Bruno Haible <bruno@clisp.org>
mkstemps: Ensure declaration on MacOS X 10.5. mkstemps: Ensure declaration on MacOS X 10.5.

View File

@@ -11,7 +11,12 @@ Portability problems fixed by either Gnulib module @code{getcwd} or
@itemize @itemize
@item @item
On glibc platforms, @code{getcwd (NULL, n)} allocates memory for the result. On glibc platforms, @code{getcwd (NULL, n)} allocates memory for the result.
On other platforms, this call is not allowed. On some other platforms, this call is not allowed. Conversely, mingw fails
to honor non-zero @code{n}.
@item
On some platforms, the prototype for @code{getcwd} uses @code{int}
instead of @code{size_t} for the size argument:
mingw.
@end itemize @end itemize
Portability problems fixed by Gnulib module @code{getcwd}: Portability problems fixed by Gnulib module @code{getcwd}:

View File

@@ -53,7 +53,7 @@ rpl_getcwd (char *buf, size_t size)
if (!buf) if (!buf)
{ {
errno = ENOMEM; errno = ENOMEM;
return -1; return NULL;
} }
result = getcwd (buf, size); result = getcwd (buf, size);
if (!result) if (!result)

View File

@@ -6,7 +6,7 @@
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# Written by Paul Eggert. # Written by Paul Eggert.
# serial 5 # serial 6
AC_DEFUN([gl_FUNC_GETCWD_NULL], AC_DEFUN([gl_FUNC_GETCWD_NULL],
[ [
@@ -20,7 +20,8 @@ AC_DEFUN([gl_FUNC_GETCWD_NULL],
# endif # endif
]], [[ ]], [[
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
/* mingw cwd does not start with '/', but getcwd does allocate. */ /* mingw cwd does not start with '/', but getcwd does allocate.
However, mingw fails to honor non-zero size. */
#else #else
if (chdir ("/") != 0) if (chdir ("/") != 0)
return 1; return 1;
@@ -36,6 +37,9 @@ AC_DEFUN([gl_FUNC_GETCWD_NULL],
return 0; return 0;
} }
#endif #endif
/* If size is non-zero, allocation must fail if size is too small */
if (getcwd (NULL, 1))
return 5;
]])], ]])],
[gl_cv_func_getcwd_null=yes], [gl_cv_func_getcwd_null=yes],
[gl_cv_func_getcwd_null=no], [gl_cv_func_getcwd_null=no],
@@ -45,8 +49,6 @@ AC_DEFUN([gl_FUNC_GETCWD_NULL],
*-gnu*) gl_cv_func_getcwd_null="guessing yes";; *-gnu*) gl_cv_func_getcwd_null="guessing yes";;
# Guess yes on Cygwin. # Guess yes on Cygwin.
cygwin*) gl_cv_func_getcwd_null="guessing yes";; cygwin*) gl_cv_func_getcwd_null="guessing yes";;
# Guess yes on mingw.
mingw*) gl_cv_func_getcwd_null="guessing yes";;
# If we don't know, assume the worst. # If we don't know, assume the worst.
*) gl_cv_func_getcwd_null="guessing no";; *) gl_cv_func_getcwd_null="guessing no";;
esac esac