Mercurial > hg > octave-lyh > gnulib-hg
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); } }