On 11/28/2013 07:34 AM, Eric Blake wrote: [back from holidays, so reviving this thread]
>> Michal, since you have the environment to test this, can you rerun: >> >> ./configure MALLOC_CHECK_=2 >> >> and see if the hang goes away? If so, then I know how to patch gnulib >> to ensure that this particular environment variable is always set for >> each conftest that tries to tickle a known glibc memory corruption bug. Michal complained that setting MALLOC_CHECK_ for the entire configure slowed things down. > > On IRC, Michal confirmed that this hack patch helped avoid a conftest hang: > > diff --git i/m4/regex.m4 w/m4/regex.m4 > index 424ae33..b0eed19 100644 > --- i/m4/regex.m4 > +++ w/m4/regex.m4 > -41,6 +41,15 @@ AC_DEFUN([gl_REGEX], > # include <unistd.h> > # include <signal.h> > #endif > +#ifdef __linux__ > +#include <execinfo.h> > +static void __attribute__ ((constructor)) > +init_backtrace() > +{ > + void *bt[10]; > + backtrace (bt, 10); > +} > +#endif > ]], > [[int result = 0; > static struct re_pattern_buffer regex; He also said this approach worked: diff --git i/m4/regex.m4 w/m4/regex.m4 index 424ae33..0089c08 100644 --- i/m4/regex.m4 +++ w/m4/regex.m4 @@ -1,4 +1,4 @@ -# serial 64 +# serial 65 # Copyright (C) 1996-2001, 2003-2013 Free Software Foundation, Inc. # @@ -28,6 +28,7 @@ AC_DEFUN([gl_REGEX], # If cross compiling, assume the test would fail and use the included # regex.c. AC_CHECK_DECLS_ONCE([alarm]) + AC_CHECK_HEADERS_ONCE([malloc.h]) AC_CACHE_CHECK([for working re_compile_pattern], [gl_cv_func_re_compile_pattern_working], [AC_RUN_IFELSE( @@ -41,6 +42,9 @@ AC_DEFUN([gl_REGEX], # include <unistd.h> # include <signal.h> #endif + #if HAVE_MALLOC_H + # include <malloc.h> + #endif ]], [[int result = 0; static struct re_pattern_buffer regex; @@ -49,11 +53,17 @@ AC_DEFUN([gl_REGEX], const char *s; struct re_registers regs; + /* Some builds of glibc go into an infinite loop on this + test. Use alarm to force death, and mallopt to avoid + malloc recursion in diagnosing the corrupted heap. */ #if HAVE_DECL_ALARM - /* Some builds of glibc go into an infinite loop on this test. */ signal (SIGALRM, SIG_DFL); alarm (2); #endif +#ifdef M_CHECK_ACTION + mallopt(M_CHECK_ACTION, 2); +#endif + if (setlocale (LC_ALL, "en_US.UTF-8")) { { Any preferences on which one I should use in gnulib? > > But then he reported that the check for a working sleep() hung, which > makes me wonder if SIGALRM/alarm() semantics are broken on his system. No idea what was happening here, but it's a separate issue to debug if it is still happening. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature