# Martijn Koster <m.koster@webcrawler.com>
# Richard Yeh <rcyeh@cco.caltech.edu>
#
+# Raise perl's stack size again; cut down reg_infty; document
+# -- Dominic Dunlop <domo@computer.org> 980619
# Use of semctl() can crash system: disable -- Dominic Dunlop 980506
# Raise stack size further; slight tweaks to accomodate MT 4.1
# -- Dominic Dunlop <domo@computer.org> 980211
# Make symbol table listings les voluminous
nmopts=-gp
-# Increase perl's stack size. Without this, lib/complex.t crashes out.
-# Particularly perverse programs may require that perl has an even larger
-# stack allocation than that specified here. (See man setstackspace )
-ldflags='-Xlstack=0x018000'
+# Set reg_infty -- the maximum allowable number of repeats in regular
+# expressions such as /a{1,$max_repeats}/, and the maximum number of
+# times /a*/ will match. Setting this too high without having a stack
+# large enough to accommodate deep recursion in the regular expression
+# engine allows perl to crash your Mac due to stack overrun if it
+# encounters a pathological regular expression. The default is a
+# compromise between capability and required stack size (see below).
+# You may override the default value from the Configure command-line
+# like this:
+#
+# Configure -Dreg_infty=16368 ...
+
+reg_infty=${reg_infty:-2047}
+
+# If you want to have many perl processes active simultaneously --
+# processing CGI forms -- for example, you should opt for a small stack.
+# For safety, you should set reg_infty no larger than the corresponding
+# value given in this table:
+#
+# Stack size reg_infty value supported
+# ---------- -------------------------
+# 128k 2**8-1 (256)
+# 256k 2**9-1 (511)
+# 512k 2**10-1 (1023)
+# 1M 2**11-1 (2047)
+# ...
+# 16M 2**15-1 (32767) (perl's default value)
+
+# This script selects a safe stack size based on the value of reg_infty
+# specified above. However, you may choose to take a risk and set
+# stack size lower: pathological regular expressions are rare in real-world
+# programs. But be aware that, if perl does encounter one, it WILL
+# crash your system. Do not set stack size lower than 96k unless
+# you want perl's installation tests ( make test ) to crash your system.
+#
+# You may override the default value from the Configure command-line
+# by specifying the required size in kilobytes like this:
+#
+# Configure -Dstack_size=96
+
+if [ "X$stack_size" = 'X' ]
+then
+ stack_size=128
+ X=`expr $reg_infty / 256`
+
+ while [ $X -gt 0 ]
+ do
+ X=`expr $X / 2`
+ stack_size=`expr $stack_size \* 2`
+ done
+fi
+
+X=`expr $stack_size \* 1024`
+ldflags="$ldflags -Xlstack=$X"
+ccflags="$ccflags -DREG_INFTY=$reg_infty"
# Install in /usr/local by default
prefix='/usr/local'
# Propagating recommended variable dont_use_nlink
dont_use_nlink=define
-cat <<'EOM' >&4
+cat <<EOM >&4
During Configure, you may see the message
*** WHOA THERE!!! ***
- The recommended value for $d_semctl on this machine was "undef"!
+ The recommended value for \$d_semctl on this machine was "undef"!
Keep the recommended value? [y]
Select the default answer: semctl() is buggy, and perl should be built
Hmm...You had some extra variables I don't know about...I'll try to keep 'em.
Propagating recommended variable dont_use_nlink
Propagating recommended variable nmopts
+ Propagating recommended variable reg_infty
Read the File::Find documentation for more information about dont_use_nlink
+Your perl will be built with a stack size of ${stack_size}k and a regular
+expression repeat count limit of $reg_infty. If you want alternative
+values, see the file hints/machten.sh for advice on how to change them.
+
Tests
io/fs test 4 and
op/stat test 3
EOM
expr "$osvers" \< "4.1" >/dev/null && test -r ./broken-db.msg && \
. ./broken-db.msg
+
+unset stack_size X
'(ab)\d\1'i Ab4ab y $1 Ab
'(ab)\d\1'i ab4Ab y $1 ab
foo\w*\d{4}baz foobar1234baz y $& foobar1234baz
-a{1,32766} aaa y $& aaa
-a{1,32767} - c - /a{1,32767}/: Quantifier in {,} bigger than
-a{1,32768} - c - /a{1,32768}/: Quantifier in {,} bigger than
+a{1,$reg_infty_m} aaa y $& aaa
+a{1,$reg_infty} - c - /a{1,$reg_infty}/: Quantifier in {,} bigger than
+a{1,$reg_infty_p} - c - /a{1,$reg_infty_p}/: Quantifier in {,} bigger than
a(?{})b cabd y $& ab
a(?{)b - c - /a(?{)b/: Sequence (?{...}) not terminated or not {}-balanced
a(?{{})b - c - /a(?{{})b/: Sequence (?{...}) not terminated or not {}-balanced
# interpolating that string after the match, or start of error message.
#
# Columns 1, 2 and 5 are \n-interpolated.
+#
+# The variables $reg_infty, $reg_infty_m and $reg_infty_m in columns 1
+# and 5 are replaced respectively with the configuration value reg_infty,
+# reg_infty-1 and reg_infty+1, or if reg_infty is not defined in the
+# configuration, default values. No other variables are substituted.
+
$iters = shift || 1; # Poor man performance suite, 10000 is OK.
-open(TESTS,'op/re_tests') || open(TESTS,'t/op/re_tests')
- || die "Can't open re_tests";
+chdir 't' if -d 't';
+@INC = "../lib";
+eval 'use Config'; # Defaults assumed if this fails
+$reg_infty = defined $Config{reg_infty} ? $Config{reg_infty} : 32767;
+$reg_infty_m = $reg_infty - 1; $reg_infty_p = $reg_infty + 1;
+
+open(TESTS,'op/re_tests') || die "Can't open re_tests";
while (<TESTS>) { }
$numtests = $.;
while (<TESTS>) {
($pat, $subject, $result, $repl, $expect) = split(/[\t\n]/,$_);
$input = join(':',$pat,$subject,$result,$repl,$expect);
+ infty_subst(\$pat);
+ infty_subst(\$expect);
$pat = "'$pat'" unless $pat =~ /^[:']/;
$pat =~ s/\\n/\n/g;
$subject =~ s/\\n/\n/g;
}
close(TESTS);
+
+sub infty_subst # Special-case substitution
+{ # of $reg_infty and friends
+ my $tp = shift;
+ $$tp =~ s/,\$reg_infty_m}/,$reg_infty_m}/o;
+ $$tp =~ s/,\$reg_infty_p}/,$reg_infty_p}/o;
+ $$tp =~ s/,\$reg_infty}/,$reg_infty}/o;
+}