From ac159491da0f837f7a4b23591c15c1b1d78eb616 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Sun, 19 Feb 2023 17:43:12 -0500 Subject: * gl/modules/make-glob: Avoid glibc glob if bug #866 is present --- gl/modules/make-glob | 68 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 15 deletions(-) (limited to 'gl') diff --git a/gl/modules/make-glob b/gl/modules/make-glob index 3b6cdee2..1193ed97 100644 --- a/gl/modules/make-glob +++ b/gl/modules/make-glob @@ -10,21 +10,59 @@ lib/glob.in.h configure.ac: # Check the system to see if it provides GNU glob. If not, use our -# local version. -AC_CACHE_CHECK([if system libc has GNU glob], [make_cv_sys_gnu_glob], -[ AC_EGREP_CPP([gnu glob],[ -#include -#include -#include - -#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 -# include -# if _GNU_GLOB_INTERFACE_VERSION == 1 || _GNU_GLOB_INTERFACE_VERSION == 2 - gnu glob -# endif -#endif], - [make_cv_sys_gnu_glob=yes], - [make_cv_sys_gnu_glob=no])]) +# local version. Also avoid versions of glibc which have symlink bug +# https://sourceware.org/bugzilla/show_bug.cgi?id=866 (test from gnulib) +AC_CACHE_CHECK([if system libc has working GNU glob], [make_cv_sys_gnu_glob],[ + if ln -s conf-doesntexist conf$$-globtest 2>/dev/null; then + make_check_symlink=yes + else + make_check_symlink=no + fi + if test $cross_compiling = yes || test $make_check_symlink = no; then + # When cross-compiling or without symlink support, check the version + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + #include + #include + #include + ]], + [[ + #if _GNU_GLOB_INTERFACE_VERSION == 0 + GNU glob not available in libc + #elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 27) + GNU glob in libc has dangling symlink bug + #endif + ]])], + [make_cv_sys_gnu_glob=yes], + [make_cv_sys_gnu_glob=no]) + else + # Check for GNU glob, and that it handles dangling symlinks properly + AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[#include + #include + #include + #include + ]], + [[ + #if _GNU_GLOB_INTERFACE_VERSION == 0 + return 1; + #else + glob_t found; + if (glob ("conf*-globtest", 0, 0, &found) == GLOB_NOMATCH) + return 1; + globfree (&found); + #endif + ]])], + [make_cv_sys_gnu_glob=yes], + [make_cv_sys_gnu_glob=no], + [dnl We don't get here. + : + ]) + fi + test $make_check_symlink = no || rm -f conf$$-globtest +]) # Tell automake about this, so it can build the right .c files. AM_CONDITIONAL([USE_SYSTEM_GLOB], [test "$make_cv_sys_gnu_glob" = yes]) -- cgit v1.2.1