bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 4 test failures on freebsd8-rc2


From: Eric Blake
Subject: Re: 4 test failures on freebsd8-rc2
Date: Mon, 09 Nov 2009 06:31:44 -0700
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.23) Gecko/20090812 Thunderbird/2.0.0.23 Mnenhy/0.7.6.666

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Eric Blake on 11/2/2009 8:37 PM:
>> test-rename.h:141: assertion failed
> 
> Looks like a case of BSD returning a non-standard errno, but where it is
> easier to teach the test one more errno to allow than to wrap the BSD bug.
>  Now, if only I knew which errno to ignore...

ENOTEMPTY.  Which is weird, since both directories were indeed empty (per
POSIX, the error should have been EINVAL).  But fixing that proved that
(you guessed it) FreeBSD mishandles trailing slash on
symlink-to-non-directory.  So here's the next in a series (I'm betting
that unlink will also need fixing, and probably a few others...)

- --
Don't work too hard, make some time for fun as well!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkr4GcAACgkQ84KuGfSFAYBurwCcCGPFmuLZ1AOsyZc2mi0zlGZI
hW8AnR7rII6AvAEYXqvspx2aHveRCptV
=WEpS
-----END PGP SIGNATURE-----
>From 41a57f9c61c2f78d8ca6712d71d3e2a319c80800 Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Sun, 8 Nov 2009 18:11:50 -0700
Subject: [PATCH] rename: detect FreeBSD bug

rename("link-to-file/","new") mistakenly succeeded.

* m4/rename.m4 (gl_FUNC_RENAME): Also detect FreeBSD bug with
slash on symlink.
* modules/renameat-tests (Depends-on): Add filenamecat.
* tests/test-rename.h (test_rename): Allow one more errno.
* doc/posix-functions/rename.texi (rename): Document the bug.

Signed-off-by: Eric Blake <address@hidden>
---
 ChangeLog                       |    7 +++++++
 doc/posix-functions/rename.texi |    9 +++++++--
 m4/rename.m4                    |   33 ++++++++++++++++++++++++++-------
 modules/renameat-tests          |    1 +
 tests/test-rename.h             |    6 ++++--
 5 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 57848e4..bd4c064 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2009-11-09  Eric Blake  <address@hidden>

+       rename: detect FreeBSD bug
+       * m4/rename.m4 (gl_FUNC_RENAME): Also detect FreeBSD bug with
+       slash on symlink.
+       * modules/renameat-tests (Depends-on): Add filenamecat.
+       * tests/test-rename.h (test_rename): Allow one more errno.
+       * doc/posix-functions/rename.texi (rename): Document the bug.
+
        open: detect FreeBSD bug
        * m4/open.m4 (gl_FUNC_OPEN): Also detect FreeBSD bug with slash on
        symlink.
diff --git a/doc/posix-functions/rename.texi b/doc/posix-functions/rename.texi
index be997aa..cd11a6d 100644
--- a/doc/posix-functions/rename.texi
+++ b/doc/posix-functions/rename.texi
@@ -13,10 +13,15 @@ rename
 destination directory, as in @code{rename("dir","new/")}:
 NetBSD 1.6.
 @item
-This function does not reject trailing slashes on non-directories on
-some platforms, as in @code{rename("file","new/")}:
+This function does not reject trailing slashes on the destination for
+non-directories on some platforms, as in @code{rename("file","new/")}:
 Solaris 10, Cygwin 1.5.x, mingw.
 @item
+This function does not reject trailing slashes on symlinks to
+non-directories on some platforms, as in
address@hidden("link-to-file/","f")}:
+FreeBSD 7.2.
address@hidden
 This function ignores trailing slashes on symlinks on some platforms,
 such that @code{rename("link/","new")} corrupts @file{link}:
 Solaris 9.
diff --git a/m4/rename.m4 b/m4/rename.m4
index 27c9944..2654d2a 100644
--- a/m4/rename.m4
+++ b/m4/rename.m4
@@ -1,4 +1,4 @@
-# serial 20
+# serial 21

 # Copyright (C) 2001, 2003, 2005, 2006, 2009 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
@@ -17,28 +17,38 @@ AC_DEFUN([gl_FUNC_RENAME],
 [
   AC_REQUIRE([AC_CANONICAL_HOST])
   AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+  AC_CHECK_FUNCS_ONCE([lstat])

   dnl Solaris 10 mistakenly allows rename("file","name/").
   dnl NetBSD 1.6 mistakenly forbids rename("dir","name/").
+  dnl FreeBSD 7.2 mistakenly allows rename("file","link-to-file/").
   dnl The Solaris bug can be worked around without stripping
   dnl trailing slash, while the NetBSD bug requires stripping;
   dnl the two conditions can be distinguished by whether hard
   dnl links are also broken.
   AC_CACHE_CHECK([whether rename honors trailing slash on destination],
     [gl_cv_func_rename_slash_dst_works],
-    [rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2
+    [rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.lnk
     touch conftest.f && mkdir conftest.d1 ||
       AC_MSG_ERROR([cannot create temporary files])
+    # Assume that if we have lstat, we can also check symlinks.
+    if test $ac_cv_func_lstat = yes; then
+      ln -s conftest.f conftest.lnk
+    fi
     AC_RUN_IFELSE([AC_LANG_PROGRAM([[
 #       include <stdio.h>
 #       include <stdlib.h>
 ]], [if (rename ("conftest.f", "conftest.f1/") == 0) return 1;
-     if (rename ("conftest.d1", "conftest.d2/") != 0) return 2;])],
+     if (rename ("conftest.d1", "conftest.d2/") != 0) return 2;
+#if HAVE_LSTAT
+     if (rename ("conftest.f", "conftest.lnk/") == 0) return 3;
+#endif
+    ])],
       [gl_cv_func_rename_slash_dst_works=yes],
       [gl_cv_func_rename_slash_dst_works=no],
       dnl When crosscompiling, assume rename is broken.
       [gl_cv_func_rename_slash_dst_works="guessing no"])
-    rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2
+    rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.lnk
   ])
   if test "x$gl_cv_func_rename_slash_dst_works" != xyes; then
     AC_LIBOBJ([rename])
@@ -50,23 +60,32 @@ AC_DEFUN([gl_FUNC_RENAME],

   dnl SunOS 4.1.1_U1 mistakenly forbids rename("dir/","name").
   dnl Solaris 9 mistakenly allows rename("file/","name").
+  dnl FreeBSD 7.2 mistakenly allows rename("link-to-file/","name").
   dnl These bugs require stripping trailing slash to avoid corrupting
   dnl symlinks with a trailing slash.
   AC_CACHE_CHECK([whether rename honors trailing slash on source],
     [gl_cv_func_rename_slash_src_works],
-    [rm -rf conftest.f conftest.d1 conftest.d2
+    [rm -rf conftest.f conftest.d1 conftest.d2 conftest.lnk
     touch conftest.f && mkdir conftest.d1 ||
       AC_MSG_ERROR([cannot create temporary files])
+    # Assume that if we have lstat, we can also check symlinks.
+    if test $ac_cv_func_lstat = yes; then
+      ln -s conftest.f conftest.lnk
+    fi
     AC_RUN_IFELSE([AC_LANG_PROGRAM([[
 #       include <stdio.h>
 #       include <stdlib.h>
 ]], [if (rename ("conftest.f/", "conftest.d2") == 0) return 1;
-     if (rename ("conftest.d1/", "conftest.d2") != 0) return 2;])],
+     if (rename ("conftest.d1/", "conftest.d2") != 0) return 2;
+#if HAVE_LSTAT
+     if (rename ("conftest.lnk/", "conftest.f") == 0) return 3;
+#endif
+    ])],
       [gl_cv_func_rename_slash_src_works=yes],
       [gl_cv_func_rename_slash_src_works=no],
       dnl When crosscompiling, assume rename is broken.
       [gl_cv_func_rename_slash_src_works="guessing no"])
-    rm -rf conftest.f conftest.d1 conftest.d2
+    rm -rf conftest.f conftest.d1 conftest.d2 conftest.lnk
   ])
   if test "x$gl_cv_func_rename_slash_src_works" != xyes; then
     AC_LIBOBJ([rename])
diff --git a/modules/renameat-tests b/modules/renameat-tests
index 20122da..399ff08 100644
--- a/modules/renameat-tests
+++ b/modules/renameat-tests
@@ -3,6 +3,7 @@ tests/test-rename.h
 tests/test-renameat.c

 Depends-on:
+filenamecat
 progname
 xgetcwd

diff --git a/tests/test-rename.h b/tests/test-rename.h
index b4f8c12..63ec8ca 100644
--- a/tests/test-rename.h
+++ b/tests/test-rename.h
@@ -138,7 +138,8 @@ test_rename (int (*func) (char const *, char const *), bool 
print)
   ASSERT (mkdir (BASE "dir", 0700) == 0);
   errno = 0;
   ASSERT (func (BASE "dir2", BASE "dir/.") == -1);
-  ASSERT (errno == EINVAL || errno == EBUSY || errno == EISDIR);
+  ASSERT (errno == EINVAL || errno == EBUSY || errno == EISDIR
+          || errno == ENOTEMPTY);
   errno = 0;
   ASSERT (func (BASE "dir2/.", BASE "dir") == -1);
   ASSERT (errno == EINVAL || errno == EBUSY);
@@ -149,7 +150,8 @@ test_rename (int (*func) (char const *, char const *), bool 
print)
   ASSERT (mkdir (BASE "dir", 0700) == 0);
   errno = 0;
   ASSERT (func (BASE "dir2", BASE "dir/.//") == -1);
-  ASSERT (errno == EINVAL || errno == EBUSY || errno == EISDIR);
+  ASSERT (errno == EINVAL || errno == EBUSY || errno == EISDIR
+          || errno == ENOTEMPTY);
   errno = 0;
   ASSERT (func (BASE "dir2/.//", BASE "dir") == -1);
   ASSERT (errno == EINVAL || errno == EBUSY);
-- 
1.6.5.rc1


reply via email to

[Prev in Thread] Current Thread [Next in Thread]