84 lines
1.8 KiB
Bash
84 lines
1.8 KiB
Bash
#!/bin/sh
|
|
|
|
# Script to verify that stack overflow is diagnosed properly when
|
|
# there is infinite macro call nesting.
|
|
# (causes coredump in m4-1.0.3)
|
|
|
|
# On some systems the ulimit command is available in ksh or bash but not sh
|
|
(exec 2>/dev/null; ulimit -HSs 300) || {
|
|
for altshell in bash bsh ksh ; do
|
|
if (exec >/dev/null 2>&1; $altshell -c 'ulimit -HSs 300') &&
|
|
test -z "$1"
|
|
then
|
|
echo "Using $altshell because it supports ulimit"
|
|
exec $altshell $0 running-with-$altshell
|
|
exit 9
|
|
fi
|
|
done
|
|
}
|
|
|
|
PATH=.:..:$PATH; export PATH;
|
|
M4=m4
|
|
type $M4
|
|
|
|
tmpfile=/tmp/t.$$
|
|
trap 'rm -f $tmpfile; exit 1' 1 2 3 15
|
|
|
|
rm -f core
|
|
perl -e '
|
|
# Generate nested define sequence
|
|
$max=1000000;
|
|
for ($i=0; $i<$max; $i++) {
|
|
print "define(X$i,\n";
|
|
}
|
|
for ($i=$max-1; $i>=0; $i--) {
|
|
print "body with substance no. $i)dnl\n"
|
|
}
|
|
' | \
|
|
(
|
|
# Limit the stack size if the shell we are running permits it
|
|
if (exec 2>/dev/null; ulimit -HSs 50)
|
|
then
|
|
(exec >/dev/null 2>&1; ulimit -v) && ulimitdashv=ok
|
|
ulimit -HSs 50
|
|
#ulimit -HSd 8000
|
|
#test -n "$ulimitdashv" && ulimit -HSv 8000
|
|
echo "Stack limit is `ulimit -s`K";
|
|
echo "Heap limit is `ulimit -d`K";
|
|
test -n "$ulimitdashv" &&
|
|
echo "VMem limit is `ulimit -v`K";
|
|
else
|
|
echo "Can't reset stack limit - this may take a while..."
|
|
fi
|
|
$M4 -L999999999 > $tmpfile 2>&1
|
|
)
|
|
result=$?
|
|
|
|
exitcode=1
|
|
if test $result -eq 0 ; then
|
|
echo "TEST DID NOT WORK - m4 did not abort. Output:"
|
|
else
|
|
# See if stack overflow was diagnosed
|
|
case "`cat $tmpfile`" in
|
|
*overflow*)
|
|
echo "Test succeeded.";
|
|
exitcode=0
|
|
;;
|
|
*ut*of*emory*)
|
|
echo "*** Test is INCONCLUSIVE (ran out of heap before stack overflow)";
|
|
;;
|
|
*) echo "*** Test FAILED. $M4 aborted unexpectedly. Output:";
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
if test -f core ; then
|
|
ls -l core
|
|
exitcode=1
|
|
fi
|
|
|
|
#(test $exitcode -ne 0) &&
|
|
{ echo "Output from $M4:"; cat $tmpfile; }
|
|
|
|
exit $exitcode
|