From 497bb5fc57d14e07115482157ed318d078a83083 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Mon, 29 Mar 2010 15:08:59 -0600 Subject: [PATCH] fdopendir: work around FreeBSD bug Without a declaration, at least tar would core dump on 64-bit FreeBSD because gcc only used 32 bits of the resulting pointer. * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): New witness. * m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Set it. * modules/dirent (Makefile.am): Substitute it. * lib/dirent.in.h (fdopendir): Supply missing FreeBSD declaration. * doc/posix-functions/fdopendir.texi (fdopendir): Document the fix. Reported by Christian Weisgerber . Signed-off-by: Eric Blake --- ChangeLog | 12 ++++++++++++ doc/posix-functions/fdopendir.texi | 3 +++ lib/dirent.in.h | 2 +- m4/dirent_h.m4 | 3 ++- m4/fdopendir.m4 | 9 ++++++++- modules/dirent | 1 + 6 files changed, 27 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index b8c880be3..2d652c6a6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2010-03-30 Eric Blake + + fdopendir: work around FreeBSD bug + * m4/dirent_h.m4 (gl_DIRENT_H_DEFAULTS): New witness. + * m4/fdopendir.m4 (gl_FUNC_FDOPENDIR): Set it. + * modules/dirent (Makefile.am): Substitute it. + * lib/dirent.in.h (fdopendir): Supply missing FreeBSD + declaration. + * doc/posix-functions/fdopendir.texi (fdopendir): Document the + fix. + Reported by Christian Weisgerber . + 2010-03-29 Bruno Haible Emit #pragma system_header after the inclusion guard, not before. diff --git a/doc/posix-functions/fdopendir.texi b/doc/posix-functions/fdopendir.texi index fae7bb751..89b1a6a21 100644 --- a/doc/posix-functions/fdopendir.texi +++ b/doc/posix-functions/fdopendir.texi @@ -17,6 +17,9 @@ is not multithread-safe. Also, the replacement does not guarantee that @samp{dirfd(fdopendir(n))==n} (dirfd might fail, or return a different file descriptor than n). @item +This function exists but is not declared on some platforms: +FreeBSD 7.3. +@item This function does not reject non-directory file descriptors on some platforms: GNU/Hurd. diff --git a/lib/dirent.in.h b/lib/dirent.in.h index 3989a2546..e6849286b 100644 --- a/lib/dirent.in.h +++ b/lib/dirent.in.h @@ -77,7 +77,7 @@ _GL_WARN_ON_USE (dirfd, "dirfd is unportable - " _GL_FUNCDECL_RPL (fdopendir, DIR *, (int fd)); _GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd)); # else -# if !@HAVE_FDOPENDIR@ +# if !@HAVE_FDOPENDIR@ || !@HAVE_DECL_FDOPENDIR@ _GL_FUNCDECL_SYS (fdopendir, DIR *, (int fd)); # endif _GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd)); diff --git a/m4/dirent_h.m4 b/m4/dirent_h.m4 index 5f88a27b1..361296a6c 100644 --- a/m4/dirent_h.m4 +++ b/m4/dirent_h.m4 @@ -1,4 +1,4 @@ -# dirent_h.m4 serial 11 +# dirent_h.m4 serial 12 dnl Copyright (C) 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -46,6 +46,7 @@ AC_DEFUN([gl_DIRENT_H_DEFAULTS], GNULIB_ALPHASORT=0; AC_SUBST([GNULIB_ALPHASORT]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_DIRFD=1; AC_SUBST([HAVE_DECL_DIRFD]) + HAVE_DECL_FDOPENDIR=1;AC_SUBST([HAVE_DECL_FDOPENDIR]) HAVE_FDOPENDIR=1; AC_SUBST([HAVE_FDOPENDIR]) HAVE_SCANDIR=1; AC_SUBST([HAVE_SCANDIR]) HAVE_ALPHASORT=1; AC_SUBST([HAVE_ALPHASORT]) diff --git a/m4/fdopendir.m4 b/m4/fdopendir.m4 index 7282d4b06..0908e1f8c 100644 --- a/m4/fdopendir.m4 +++ b/m4/fdopendir.m4 @@ -1,4 +1,4 @@ -# serial 3 +# serial 4 # See if we need to provide fdopendir. dnl Copyright (C) 2009-2010 Free Software Foundation, Inc. @@ -11,6 +11,10 @@ dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FDOPENDIR], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + dnl FreeBSD 7.3 has the function, but failed to declare it. + AC_CHECK_DECLS([fdopendir], [], [HAVE_DECL_FDOPENDIR=0], [[ +#include + ]]) AC_CHECK_FUNCS_ONCE([fdopendir]) if test $ac_cv_func_fdopendir = no; then AC_LIBOBJ([openat-proc]) @@ -23,6 +27,9 @@ AC_DEFUN([gl_FUNC_FDOPENDIR], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include +#if !HAVE_DECL_FDOPENDIR +extern DIR *fdopendir (int); +#endif ]], [int fd = open ("conftest.c", O_RDONLY); if (fd < 0) return 2; return !!fdopendir (fd);])], diff --git a/modules/dirent b/modules/dirent index 9b99dbcec..8783d83a6 100644 --- a/modules/dirent +++ b/modules/dirent @@ -31,6 +31,7 @@ dirent.h: dirent.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) -e 's|@''GNULIB_SCANDIR''@|$(GNULIB_SCANDIR)|g' \ -e 's|@''GNULIB_ALPHASORT''@|$(GNULIB_ALPHASORT)|g' \ -e 's|@''HAVE_DECL_DIRFD''@|$(HAVE_DECL_DIRFD)|g' \ + -e 's|@''HAVE_DECL_FDOPENDIR''@|$(HAVE_DECL_FDOPENDIR)|g' \ -e 's|@''HAVE_FDOPENDIR''@|$(HAVE_FDOPENDIR)|g' \ -e 's|@''HAVE_SCANDIR''@|$(HAVE_SCANDIR)|g' \ -e 's|@''HAVE_ALPHASORT''@|$(HAVE_ALPHASORT)|g' \ -- 2.11.0