fchdir: fix logic bugs
authorEric Blake <ebb9@byu.net>
Tue, 8 Dec 2009 13:13:05 +0000 (06:13 -0700)
committerEric Blake <ebb9@byu.net>
Tue, 8 Dec 2009 13:32:18 +0000 (06:32 -0700)
Configuring with ac_cv_func_fchdir=no on a system that has fchdir
and where open handles directories, just to test out the replacement
capabilities, uncovered an m4 test bug and a link failure on rpl_fstat.

* m4/fchdir.m4 (gl_FUNC_FCHDIR): Fix logic bug.
* tests/test-fchdir.c (main): Enhance test.
* lib/fchdir.c (rpl_fstat): Always provide if fchdir replacement
is in use.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
lib/fchdir.c
m4/fchdir.m4
tests/test-fchdir.c

index 40d2dac..24d7e20 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2009-12-08  Eric Blake  <ebb9@byu.net>
 
+       fchdir: fix logic bugs
+       * m4/fchdir.m4 (gl_FUNC_FCHDIR): Fix logic bug.
+       * tests/test-fchdir.c (main): Enhance test.
+       * lib/fchdir.c (rpl_fstat): Always provide if fchdir replacement
+       is in use.
+
        dup2: fix logic bugs
        * lib/dup2.c (dup2): Fix logic bugs.  Use HAVE_DUP2 rather than
        REPLACE_DUP2 to decide when rpl_dup2 is needed.
index 16b17b4..4cc0f33 100644 (file)
@@ -216,16 +216,15 @@ _gl_directory_name (int fd)
 /* Return stat information about FD in STATBUF.  Needed when
    rpl_open() used a dummy file to work around an open() that can't
    normally visit directories.  */
-#if REPLACE_OPEN_DIRECTORY
-# undef fstat
+#undef fstat
 int
 rpl_fstat (int fd, struct stat *statbuf)
 {
-  if (0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL)
+  if (REPLACE_OPEN_DIRECTORY
+      && 0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL)
     return stat (dirs[fd].name, statbuf);
   return fstat (fd, statbuf);
 }
-#endif
 
 /* Override opendir() and closedir(), to keep track of the open file
    descriptors.  Needed because there is a function dirfd().  */
index f0e4dc0..6243cc2 100644 (file)
@@ -1,4 +1,4 @@
-# fchdir.m4 serial 10
+# fchdir.m4 serial 11
 dnl Copyright (C) 2006-2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -31,7 +31,7 @@ AC_DEFUN([gl_FUNC_FCHDIR],
     AC_CACHE_CHECK([whether open can visit directories],
       [gl_cv_func_open_directory_works],
       [AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <fcntl.h>
-]], [return open(".", O_RDONLY);])],
+]], [return open(".", O_RDONLY) < 0;])],
         [gl_cv_func_open_directory_works=yes],
         [gl_cv_func_open_directory_works=no],
         [gl_cv_func_open_directory_works="guessing no"])])
index 53d6631..0419f43 100644 (file)
@@ -26,6 +26,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "cloexec.h"
+
 #define ASSERT(expr) \
   do                                                                        \
     {                                                                       \
@@ -82,7 +84,11 @@ main (void)
          int new_fd = dup (fd);
          ASSERT (0 <= new_fd);
          ASSERT (close (fd) == 0);
-         fd = new_fd;
+         ASSERT (dup2 (new_fd, fd) == fd);
+         ASSERT (close (new_fd) == 0);
+         ASSERT (dup_cloexec (fd) == new_fd);
+         ASSERT (dup2 (new_fd, fd) == fd);
+         ASSERT (close (new_fd) == 0);
        }
     }