changeset 12402:af3596b94c7a

fchdir: fix logic bugs 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>
author Eric Blake <ebb9@byu.net>
date Tue, 08 Dec 2009 06:13:05 -0700
parents 4e193de62444
children 085e83b725e1
files ChangeLog lib/fchdir.c m4/fchdir.m4 tests/test-fchdir.c
diffstat 4 files changed, 18 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- a/lib/fchdir.c
+++ b/lib/fchdir.c
@@ -216,16 +216,15 @@
 /* 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().  */
--- a/m4/fchdir.m4
+++ b/m4/fchdir.m4
@@ -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_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"])])
--- a/tests/test-fchdir.c
+++ b/tests/test-fchdir.c
@@ -26,6 +26,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "cloexec.h"
+
 #define ASSERT(expr) \
   do									     \
     {									     \
@@ -82,7 +84,11 @@
 	  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);
 	}
     }