getcwd: fix mingw bugs
authorEric Blake <eblake@redhat.com>
Thu, 28 Apr 2011 02:40:21 +0000 (20:40 -0600)
committerEric Blake <eblake@redhat.com>
Thu, 28 Apr 2011 02:51:13 +0000 (20:51 -0600)
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>
ChangeLog
doc/posix-functions/getcwd.texi
lib/getcwd-lgpl.c
m4/getcwd.m4

index f20299f0f7a1a75f30705ae3ce7e0fd2404b7579..8dae3ab1f4e9c05e3c2e717a17c67f5055ae6918 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
        mkstemps: Ensure declaration on MacOS X 10.5.
index a8dba967ec21a941aae1fc6f9e4397761bb06590..1f6dd187d239d63aca1b60617e983a9c7214f299 100644 (file)
@@ -11,7 +11,12 @@ Portability problems fixed by either Gnulib module @code{getcwd} or
 @itemize
 @item
 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
 
 Portability problems fixed by Gnulib module @code{getcwd}:
index a5596f8869c04735fa1c2e48b41655b314ce7ddc..53c5562357ca2138c5648e0e52c5abe5758b0330 100644 (file)
@@ -53,7 +53,7 @@ rpl_getcwd (char *buf, size_t size)
       if (!buf)
         {
           errno = ENOMEM;
-          return -1;
+          return NULL;
         }
       result = getcwd (buf, size);
       if (!result)
index 55f937222bc2549da5491ff556c53bd1e7564f16..eb2c9d937587e46e24bde43ff45422f5a178139f 100644 (file)
@@ -6,7 +6,7 @@
 # with or without modifications, as long as this notice is preserved.
 
 # Written by Paul Eggert.
-# serial 5
+# serial 6
 
 AC_DEFUN([gl_FUNC_GETCWD_NULL],
   [
@@ -20,7 +20,8 @@ AC_DEFUN([gl_FUNC_GETCWD_NULL],
 #        endif
 ]], [[
 #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
            if (chdir ("/") != 0)
              return 1;
@@ -36,6 +37,9 @@ AC_DEFUN([gl_FUNC_GETCWD_NULL],
                return 0;
              }
 #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=no],
@@ -45,8 +49,6 @@ AC_DEFUN([gl_FUNC_GETCWD_NULL],
          *-gnu*)               gl_cv_func_getcwd_null="guessing yes";;
                                # Guess yes on Cygwin.
          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.
          *)                    gl_cv_func_getcwd_null="guessing no";;
        esac