m4-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU M4 source repository branch, stackovf, updated. v1.5.89a-33-g8


From: Eric Blake
Subject: [SCM] GNU M4 source repository branch, stackovf, updated. v1.5.89a-33-g8b9feab
Date: Thu, 17 Jul 2008 22:18:14 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU M4 source repository".

http://git.sv.gnu.org/gitweb/?p=m4.git;a=commitdiff;h=8b9feabcec95d380184f3d2feee771ec8f88144a

The branch, stackovf has been updated
       via  8b9feabcec95d380184f3d2feee771ec8f88144a (commit)
      from  f0aed09967039400798ae3fbca584dc7ffff7e40 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 8b9feabcec95d380184f3d2feee771ec8f88144a
Author: Eric Blake <address@hidden>
Date:   Thu Jul 17 12:00:49 2008 -0600

    Adjust to c-stack changes in gnulib.
    
    * src/Makefile.am (m4_LDADD): Use libsigsegv when available and
    necessary, via LIBCSTACK.
    * src/m4.c (main) [DEBUG_STACKOVF]: Make it easier to test fault
    handlers.
    * checks/stackovf.test: New file.
    * checks/Makefile.in (CHECKS): Add stackovf.test, and factor...
    (DOC_CHECKS): ...generated documentation tests into new macro.
    (DISTFILES): Distribute stackovf.test.
    * checks/check-them: Special-case stackovf.test.
    * NEWS: Enhance the NEWS item for -L improvements.
    * README: Mention the optional dependency.
    * HACKING: Mention maintenance burden added by libsigsegv.
    
    Signed-off-by: Eric Blake <address@hidden>

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog            |   16 ++++++++
 HACKING              |    7 ++++
 NEWS                 |    7 +++-
 README               |    9 +++++
 checks/Makefile.in   |   12 ++++---
 checks/check-them    |   12 ++++++
 checks/stackovf.test |   99 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Makefile.am      |    2 +-
 src/m4.c             |   16 ++++++++
 9 files changed, 173 insertions(+), 7 deletions(-)
 create mode 100755 checks/stackovf.test

diff --git a/ChangeLog b/ChangeLog
index c51d171..e182a2b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2008-07-17  Eric Blake  <address@hidden>
+
+       Adjust to c-stack changes in gnulib.
+       * src/Makefile.am (m4_LDADD): Use libsigsegv when available and
+       necessary, via LIBCSTACK.
+       * src/m4.c (main) [DEBUG_STACKOVF]: Make it easier to test fault
+       handlers.
+       * checks/stackovf.test: New file.
+       * checks/Makefile.in (CHECKS): Add stackovf.test, and factor...
+       (DOC_CHECKS): ...generated documentation tests into new macro.
+       (DISTFILES): Distribute stackovf.test.
+       * checks/check-them: Special-case stackovf.test.
+       * NEWS: Enhance the NEWS item for -L improvements.
+       * README: Mention the optional dependency.
+       * HACKING: Mention maintenance burden added by libsigsegv.
+
 2008-06-23  Eric Blake  <address@hidden>
 
        Adjust to new gnulib-tool layout.
diff --git a/HACKING b/HACKING
index fd8cd1e..e127494 100644
--- a/HACKING
+++ b/HACKING
@@ -62,6 +62,13 @@ and is not part of a release distribution.
   Note that none of these bootstrapping dependencies should be required
   by a distributed release.
 
+* M4 has an optional build dependency.  In order to ensure that the
+  dependency remains optional, you can avoid the library by using
+  `./configure --without-libsigsegv-prefix'.  In order to ensure that
+  the dependency is still viable with the current code base, you should
+  install:
+  - Libsigsegv 2.5 or later
+
 * Either add the gnulib directory to your PATH, or run
     GNULIB_TOOL=path/to/gnulib/gnulib-tool ./bootstrap
 
diff --git a/NEWS b/NEWS
index 5aae856..bfda4d4 100644
--- a/NEWS
+++ b/NEWS
@@ -38,7 +38,12 @@ Foundation, Inc.
      http://git.sv.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=56d42fa71
 
 ** The `-L'/`--nesting-limit' command-line option now defaults to 0 for
-   unlimited on platforms that can detect and deal with stack overflow.
+   unlimited on platforms that can detect and deal with stack overflow.  On
+   systems that lack alternate stack support, such as Cygwin, and on
+   systems that do not obey the POSIX semantics for distinguishing stack
+   overflow from other exceptions, such as Linux, you can optionally
+   install the libsigsegv library to enhance m4's ability to accurately
+   report stack overflow: http://www.gnu.org/software/libsigsegv/
 
 ** The `defn' builtin now warns when operating on an undefined macro name.
    To simulate 1.4.x behavior, use:
diff --git a/README b/README
index 548ffb9..ea5061f 100644
--- a/README
+++ b/README
@@ -19,6 +19,15 @@ ahead and start with `./configure'.  If you are trying to 
build `m4'
 from git or CVS, more information can be found in the file HACKING,
 only found in a version control checkout.
 
+M4 has an optional dependency on the libsigsegv library:
+  http://www.gnu.org/software/libsigsegv/
+If the library has not been installed in the standard location, you
+can use `./configure --with-libsigsegv-prefix=/path/to/dir', to make
+the build of `m4' use /path/to/dir/include/sigsegv.h as appropriate.
+The use of this library is optional; the only difference in having it
+available is that it increases the number of platforms where `m4' can
+correctly distinguish stack overflow from an internal bug.
+
 In the subdirectory `examples' you will find various m4 files, ranging
 from trivial test files to rather advanced macros.  If you intend to
 use m4 seriously, you might find useful material down there.
diff --git a/checks/Makefile.in b/checks/Makefile.in
index 0e1091e..c43c2cc 100644
--- a/checks/Makefile.in
+++ b/checks/Makefile.in
@@ -36,14 +36,16 @@ program_transform_name = @program_transform_name@
 AWK = @AWK@
 
 # Vern says that the first star is required around an Alpha make bug.
-CHECKS = $(srcdir)/*[0-9][0-9][0-9].*
+DOC_CHECKS = $(srcdir)/*[0-9][0-9][0-9].*
+CHECKS = $(DOC_CHECKS) $(srcdir)/stackovf.test
 # Makefile.in is automatically distributed by automake.
-DISTFILES = $(srcdir)/get-them $(srcdir)/check-them $(srcdir)/stamp-checks
+DISTFILES = $(srcdir)/get-them $(srcdir)/check-them $(srcdir)/stamp-checks \
+       $(srcdir)/stackovf.test
 
 all: $(srcdir)/stamp-checks
 
 $(srcdir)/stamp-checks: $(srcdir)/get-them $(srcdir)/../doc/m4.texinfo
-       rm -f $(CHECKS)
+       rm -f $(DOC_CHECKS)
        cd $(srcdir) && AWK=$(AWK) ./get-them ../doc/m4.texinfo
        touch $(srcdir)/stamp-checks
 
@@ -73,13 +75,13 @@ distclean: clean
        rm -f Makefile
 
 maintainer-clean realclean: distclean
-       rm -f $(CHECKS) $(srcdir)/stamp-checks
+       rm -f $(DOC_CHECKS) $(srcdir)/stamp-checks
 
 distdir: dist
 
 dist: $(DISTFILES)
        @echo "Copying distribution files"
-       @for file in $(DISTFILES) $(CHECKS); do \
+       @for file in $(DISTFILES) $(DOC_CHECKS); do \
          ln $$file ../$(PACKAGE)-$(VERSION)/checks 2> /dev/null \
            || cp -p $$file ../$(PACKAGE)-$(VERSION)/checks; \
        done
diff --git a/checks/check-them b/checks/check-them
index 7fba1d6..f66322b 100755
--- a/checks/check-them
+++ b/checks/check-them
@@ -70,6 +70,18 @@ do
     continue
   }
   echo "Checking $file"
+
+  case $file in
+    *stackovf.test)
+      "$file" "$m4"
+      case $? in
+       77) skipped="$skipped $file";;
+       0) ;;
+       *) failed="$failed $file"
+      esac
+      continue ;;
+  esac
+
   options=`sed -ne '3s/^dnl @ extra options: //p;3q' "$file"`
   sed -e '/^dnl @/d' -e '/^\^D$/q' "$file" \
     | LC_MESSAGES=C M4PATH=$examples "$m4" -d $options - >$out 2>$err
diff --git a/checks/stackovf.test b/checks/stackovf.test
new file mode 100755
index 0000000..4b938e7
--- /dev/null
+++ b/checks/stackovf.test
@@ -0,0 +1,99 @@
+#!/bin/sh
+# This file is part of the GNU m4 testsuite
+# Copyright (C) 2000, 2003, 2007, 2008 Free Software Foundation, Inc.
+#
+# This file is part of GNU M4.
+#
+# GNU M4 is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GNU M4 is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Script to verify that stack overflow is diagnosed properly when
+# there is infinite macro call nesting, provided the OS supports it.
+
+m4="$1"
+
+# Skip this test if -L defaults to 1024 instead of 0, as that is our
+# indicator that the OS does not support stack overflow detection.
+("$m4" --help | grep 'nesting.*\[0\]') >/dev/null 2>&1 \
+  || {
+       echo "$0: skipping test, no stack overflow support detected in $m4"
+       exit 77
+     }
+
+# On some systems the ulimit command is available in ksh or bash but not sh
+(exec 2>/dev/null; ulimit -Ss 300) || {
+  for altshell in bash bsh ksh zsh ; do
+    if (exec >/dev/null 2>&1; $altshell -c 'ulimit -Ss 300') && test -z "$2"
+    then
+      echo "Using $altshell because it supports ulimit"
+      exec $altshell "$0" "$@" running-with-$altshell
+      exit 1
+    fi
+  done
+}
+
+tmpdir=
+trap 'st=$?; rm -rf "$tmpdir" && exit $st' 0
+trap '(exit $?); exit $?' 1 2 3 15
+
+# Create a temporary subdirectory $tmpdir in $TMPDIR (default /tmp).
+# Use mktemp if possible; otherwise fall back on mkdir,
+# with $RANDOM to make collisions less likely.
+: ${TMPDIR=/tmp}
+{
+  tmpdir=`
+    (umask 077 && mktemp -d "$TMPDIR/m4stk-XXXXXX") 2>/dev/null
+  ` &&
+  test -n "$tmpdir" && test -d "$tmpdir"
+} || {
+  tmpdir=$TMPDIR/m4stk-$$-$RANDOM
+  (umask 077 && mkdir "$tmpdir")
+} || exit $?
+tmpfile="$tmpdir"/m4.out
+
+# Limit the stack size if the shell we are running permits it
+if (exec 2>/dev/null; ulimit -Ss 50)
+then
+  ulimit -Ss 50
+  echo "Stack soft limit set to `ulimit -s`K";
+else
+  echo "Can't reset stack limit - this may take a while..."
+fi
+
+# Induce stack overflow.
+echo 'define(a,a(a))a' | "$m4" > "$tmpfile" 2>&1
+result=$?
+
+exitcode=1
+if test $result -eq 0 ; then
+  echo "Failure - $m4 did not abort"
+else
+  # See if stack overflow was diagnosed.
+  case `cat "$tmpfile"` in
+    *stack\ overflow*)
+      case `echo "$tmpdir"/*` in
+       $tmpfile)
+          echo "Pass"
+          exitcode=0 ;;
+       *) echo "Failure - $m4 created unexpected core dump"
+          ls -l "$tmpdir" ;;
+      esac ;;
+    *) echo "Failure - $m4 aborted unexpectedly";
+       ;;
+    esac
+fi
+
+test $exitcode = 0 ||
+    { echo "Output from $m4:"; cat $tmpfile; }
+
+exit $exitcode
diff --git a/src/Makefile.am b/src/Makefile.am
index 900f8ea..80b9acf 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -24,4 +24,4 @@ AM_CPPFLAGS = -I$(top_srcdir)/lib -I../lib
 bin_PROGRAMS = m4
 m4_SOURCES = m4.h m4.c builtin.c debug.c eval.c format.c freeze.c input.c \
 macro.c output.c path.c symtab.c
-m4_LDADD = ../lib/libm4.a $(LIBM4_LIBDEPS) $(POW_LIB)
+m4_LDADD = ../lib/libm4.a $(LIBM4_LIBDEPS) $(POW_LIB) $(LIBCSTACK)
diff --git a/src/m4.c b/src/m4.c
index 970aa8b..a24f82d 100644
--- a/src/m4.c
+++ b/src/m4.c
@@ -488,6 +488,22 @@ main (int argc, char *const *argv, char *const *envp)
   sigaction (SIGFPE, &act, NULL);
   sigaction (SIGBUS, &act, NULL);
 
+#ifdef DEBUG_STKOVF
+  /* Make it easier to test our fault handlers.  Exporting M4_CRASH=0
+     attempts a SIGSEGV, exporting it as 1 attempts an assertion
+     failure with a fallback to abort.  */
+  {
+    char *crash = getenv ("M4_CRASH");
+    if (crash)
+      {
+        if (!atoi (crash))
+          ++*(int *) 8;
+        assert (false);
+        abort ();
+      }
+  }
+#endif /* DEBUG_STKOVF */
+
   /* First, we decode the arguments, to size up tables and stuff.  */
   head = tail = NULL;
 


hooks/post-receive
--
GNU M4 source repository




reply via email to

[Prev in Thread] Current Thread [Next in Thread]