[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12]
From: |
Eric Blake |
Subject: |
Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12] |
Date: |
Mon, 25 Aug 2008 06:50:48 -0600 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.16) Gecko/20080708 Thunderbird/2.0.0.16 Mnenhy/0.7.5.666 |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
According to Elbert Pol on 8/13/2008 12:17 PM:
> Hello Eric,
[please don't top-post]
> > However, I'm still interested in seeing what this does when libsigsegv is
> > not present (you can use './configure --without-libsigsegv-prefix' to
> > rebuild m4 without it, rather than having to uninstall the library).
>
> I build now with --without-libsigsegv-prefix
>
> I attach resulst
Hmm. According to that most recent log, using an explicit
./configure --without-libsigsegv-prefix
did not do what I expected; configure still detected the library located
in --prefix, and still linked with it. I'm not sure why libsigsegv.m4 is
not honoring an explicit --without. Bruno, might this be a bug in
lib-prefix.m4?
At any rate, I'm installing this patch to gnulib, since it appears (from
your first log), that even though your platform supports SA_ONSTACK, it
does not handle stack overflow as a SIGSEGV that can be handled by the
alternate stack. It basically splits stack overflow detection into two
tests, so that c-stack doesn't even try installing a handler if it appears
that stack overflow SIGSEGV can't really be handled.
I'm planning on building a new m4 snapshot with all the recent gnulib
fixes later today.
- --
Don't work too hard, make some time for fun as well!
Eric Blake address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iEYEARECAAYFAkiyqqgACgkQ84KuGfSFAYBAzgCcDgMD27hIUCmDdaoCN5yPVLeJ
ANEAoLfNewan63+BTfMc5eEVqiKXaJ6M
=FQhV
-----END PGP SIGNATURE-----
From e3ea810706b94a625eadc27dda079d74cdd68440 Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Mon, 25 Aug 2008 06:26:56 -0600
Subject: [PATCH] c-stack: test that stack overflow can be caught
* m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Also check
that platform allows handling stack overflow; at least OS/2 EMX
has sigaltstack, but crashes before transferring control to
handler on stack overflow.
* lib/c-stack.c [HAVE_SIGALTSTACK]: Adjust conditions to also
check for HAVE_STACK_OVERFLOW_HANDLING.
Reported by Elbert Pol.
Signed-off-by: Eric Blake <address@hidden>
---
ChangeLog | 11 +++++++
lib/c-stack.c | 8 +++--
m4/c-stack.m4 | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 106 insertions(+), 5 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 708cefd..92dd185 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-08-25 Eric Blake <address@hidden>
+
+ c-stack: test that stack overflow can be caught
+ * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Also check
+ that platform allows handling stack overflow; at least OS/2 EMX
+ has sigaltstack, but crashes before transferring control to
+ handler on stack overflow.
+ * lib/c-stack.c [HAVE_SIGALTSTACK]: Adjust conditions to also
+ check for HAVE_STACK_OVERFLOW_HANDLING.
+ Reported by Elbert Pol.
+
2008-08-25 Bruno Haible <address@hidden>
* doc/posix-functions/strftime.texi: Fix description of strftime
diff --git a/lib/c-stack.c b/lib/c-stack.c
index c46c231..6802665 100644
--- a/lib/c-stack.c
+++ b/lib/c-stack.c
@@ -117,7 +117,8 @@ die (int signo)
abort ();
}
-#if (HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK) || HAVE_LIBSIGSEGV
+#if (HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK \
+ && HAVE_STACK_OVERFLOW_HANDLING) || HAVE_LIBSIGSEGV
/* Storage for the alternate signal stack. */
static union
@@ -210,7 +211,7 @@ c_stack_action (void (*action) (int))
return 0;
}
-#elif HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK
+#elif HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK && HAVE_STACK_OVERFLOW_HANDLING
/* Direction of the C runtime stack. This function is
async-signal-safe. */
@@ -316,7 +317,8 @@ c_stack_action (void (*action) (int))
return sigaction (SIGSEGV, &act, NULL);
}
-#else /* ! ((HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK) || HAVE_LIBSIGSEGV) */
+#else /* ! ((HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK
+ && HAVE_STACK_OVERFLOW_HANDLING) || HAVE_LIBSIGSEGV) */
int
c_stack_action (void (*action) (int) __attribute__ ((unused)))
diff --git a/m4/c-stack.m4 b/m4/c-stack.m4
index 1db2a50..885b662 100644
--- a/m4/c-stack.m4
+++ b/m4/c-stack.m4
@@ -7,7 +7,7 @@
# Written by Paul Eggert.
-# serial 4
+# serial 5
AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
[# for STACK_DIRECTION
@@ -16,6 +16,90 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
AC_CHECK_HEADERS_ONCE([ucontext.h])
AC_CACHE_CHECK([for working C stack overflow detection],
+ [ac_cv_sys_stack_overflow_works],
+ [AC_TRY_RUN(
+ [
+ #include <unistd.h>
+ #include <signal.h>
+ #if HAVE_SETRLIMIT
+ # include <sys/types.h>
+ # include <sys/time.h>
+ # include <sys/resource.h>
+ #endif
+ #ifndef SIGSTKSZ
+ # define SIGSTKSZ 16384
+ #endif
+
+ static union
+ {
+ char buffer[SIGSTKSZ];
+ long double ld;
+ long u;
+ void *p;
+ } alternate_signal_stack;
+
+ static void
+ segv_handler (int signo)
+ {
+ _exit (0);
+ }
+
+ static int
+ c_stack_action ()
+ {
+ stack_t st;
+ struct sigaction act;
+ int r;
+
+ st.ss_flags = 0;
+ st.ss_sp = alternate_signal_stack.buffer;
+ st.ss_size = sizeof alternate_signal_stack.buffer;
+ r = sigaltstack (&st, 0);
+ if (r != 0)
+ return r;
+
+ sigemptyset (&act.sa_mask);
+ act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
+ act.sa_handler = segv_handler;
+ return sigaction (SIGSEGV, &act, 0);
+ }
+
+ static int
+ recurse (char *p)
+ {
+ char array[500];
+ array[0] = 1;
+ return *p + recurse (array);
+ }
+
+ int
+ main ()
+ {
+ #if HAVE_SETRLIMIT && defined RLIMIT_STACK
+ /* Before starting the endless recursion, try to be friendly
+ to the user's machine. On some Linux 2.2.x systems, there
+ is no stack limit for user processes at all. We don't want
+ to kill such systems. */
+ struct rlimit rl;
+ rl.rlim_cur = rl.rlim_max = 0x100000; /* 1 MB */
+ setrlimit (RLIMIT_STACK, &rl);
+ #endif
+
+ c_stack_action ();
+ return recurse ("\1");
+ }
+ ],
+ [ac_cv_sys_stack_overflow_works=yes],
+ [ac_cv_sys_stack_overflow_works=no],
+ [ac_cv_sys_stack_overflow_works=cross-compiling])])
+
+ if test $ac_cv_sys_stack_overflow_works = yes; then
+ AC_DEFINE([HAVE_STACK_OVERFLOW_HANDLING], [1],
+ [Define to 1 if extending the stack slightly past the limit causes
+ a SIGSEGV which can be handled on an alternate stack established
+ with sigaltstack.])
+
+ AC_CACHE_CHECK([for precise C stack overflow detection],
ac_cv_sys_xsi_stack_overflow_heuristic,
[AC_TRY_RUN(
[
@@ -29,6 +113,9 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
# include <sys/time.h>
# include <sys/resource.h>
#endif
+ #ifndef SIGSTKSZ
+ # define SIGSTKSZ 16384
+ #endif
static union
{
@@ -131,7 +218,8 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC],
with the X/Open System Interface (XSI) option
and is a standardized way to implement a SEGV-based stack
overflow detection heuristic.])
- fi])
+ fi
+ fi])
AC_DEFUN([gl_PREREQ_C_STACK],
--
1.6.0
- snapshot in preparation for m4 1.4.12, Eric Blake, 2008/08/07
- Re: snapshot in preparation for m4 1.4.12, Elbert Pol, 2008/08/07
- os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Eric Blake, 2008/08/11
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Elbert Pol, 2008/08/11
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Elbert Pol, 2008/08/11
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Eric Blake, 2008/08/11
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Elbert Pol, 2008/08/11
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Eric Blake, 2008/08/11
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Elbert Pol, 2008/08/12
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Elbert Pol, 2008/08/13
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12],
Eric Blake <=
- m4-1.4.11.42-864d, Elbert Pol, 2008/08/30
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Elbert Pol, 2008/08/11
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Bruno Haible, 2008/08/11
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Elbert Pol, 2008/08/11
- Re: os/2 c-stack [was: snapshot in preparation for m4 1.4.12], Elbert Pol, 2008/08/11
os/2 frexp [was: snapshot in preparation for m4 1.4.12], Eric Blake, 2008/08/11
os/2 child process status [was: snapshot in preparation for m4 1.4.12], Eric Blake, 2008/08/11
Re: snapshot in preparation for m4 1.4.12, Ralf Wildenhues, 2008/08/07
Re: snapshot in preparation for m4 1.4.12, Alain Guibert, 2008/08/08