From 8685a1be32d2d900ee599dc3102f334b93314512 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Tue, 4 Dec 2018 15:11:17 +1100
Subject: (perl #133708) remove build-time probing for stack limits for
 Storable

Backported for Debian 5.28 by Niko Tyni

Origin: backport, https://perl5.git.perl.org/perl.git/commit/2a0bbd31bbcc94c7c511f9575df619c5fdf3164c
Bug: https://rt.perl.org/Public/Bug/Display.html?id=133708
Bug-Debian: https://bugs.debian.org/914133
Patch-Name: fixes/storable-probing/disable-probing.diff
---
 Makefile.SH                   | 25 ------------
 dist/Storable/Makefile.PL     | 40 ------------------
 dist/Storable/__Storable__.pm | 12 +++---
 dist/Storable/stacksize       | 77 ++++++++---------------------------
 dist/Storable/t/recurse.t     |  4 +-
 win32/GNUmakefile             | 12 +-----
 win32/Makefile                | 10 +----
 win32/makefile.mk             | 15 +------
 8 files changed, 31 insertions(+), 164 deletions(-)

diff --git a/Makefile.SH b/Makefile.SH
index 48151bce6..084924dab 100755
--- a/Makefile.SH
+++ b/Makefile.SH
@@ -173,15 +173,11 @@ esac
 
 : is Cwd static or dynamic
 static_cwd='define'
-storable_limit_dep=''
-storable_type=''
 list_util_dep='$(PERL_EXE)'
 for f in $dynamic_ext; do
    case $f in
        Cwd) static_cwd='undef' ;;
        List/Util) list_util_dep=lib/auto/List/Util/Util.$dlext ;;
-       Storable) storable_limit_dep=lib/auto/Storable/Storable.$dlext
-                 storable_type='dynamic' ;;
    esac
 done
 
@@ -218,7 +214,6 @@ for f in $static_ext; do
 $this_target: lib/auto/List/Util/Util\$(LIB_EXT)" ;;
 	Unicode/Normalize) extra_dep="$extra_dep
 $this_target: uni.data" ;;
-        Storable) storable_type='static' ;;
     esac
 done
 
@@ -1155,26 +1150,6 @@ no_install no-install: install-notify
 install: install-all
 !NO!SUBS!
 
-if test "$storable_type" != "" ; then
-
-case "$static_cwd" in
-undef) storable_limit_dep="$storable_limit_dep lib/auto/Cwd/Cwd.$dlext" ;;
-esac
-
-$spitshell >>$Makefile <<EOT
-
-dist/Storable/lib/Storable/Limit.pm : \$(PERL_EXE) dist/Storable/stacksize $storable_limit_dep
-	cd dist/Storable ; \$(LDLIBPTH) \$(MAKE) lib/Storable/Limit.pm
-
-lib/Storable/Limit.pm : dist/Storable/lib/Storable/Limit.pm
-	test -d lib/Storable || mkdir lib/Storable
-	cp dist/Storable/lib/Storable/Limit.pm lib/Storable/Limit.pm
-EOT
-
-common_build_deps="$common_build_deps lib/Storable/Limit.pm"
-
-fi
-
 for name in all notify silent strip verbose; do
     flags="--$name";
     flags=`echo $flags | sed -e 's/--all//'`
diff --git a/dist/Storable/Makefile.PL b/dist/Storable/Makefile.PL
index 69efc8294..60af5d256 100644
--- a/dist/Storable/Makefile.PL
+++ b/dist/Storable/Makefile.PL
@@ -12,15 +12,7 @@ use Config;
 use File::Copy qw(move copy);
 use File::Spec;
 
-unlink "lib/Storable/Limit.pm";
-
-my $limit_pm = File::Spec->catfile('lib', 'Storable', 'Limit.pm');
-
 my $pm = { 'Storable.pm' => '$(INST_ARCHLIB)/Storable.pm' };
-unless ($ENV{PERL_CORE}) {
-    # the core Makefile takes care of this for core builds
-    $pm->{$limit_pm} = '$(INST_ARCHLIB)/Storable/Limit.pm';
-}
 
 WriteMakefile(
     NAME                => 'Storable',
@@ -83,27 +75,7 @@ sub xlinkext {
 }
 
 sub depend {
-    my $extra_deps = "";
-    my $options = "";
-    if ($ENV{PERL_CORE}) {
-        $options = "--core";
-    }
-    else {
-        # blib.pm needs arch/lib
-        $extra_deps = ' Storable.pm';
-    }
-    my $whichperl;
-    if ($Config::Config{usecrosscompile}) {
-        $whichperl = '$(PERLRUN)';
-    }
-    else {
-        $whichperl = '$(FULLPERLRUNINST)';
-    }
-    my $linktype = uc($_[0]->{LINKTYPE});
     "
-$limit_pm : stacksize \$(INST_$linktype)$extra_deps
-	\$(MKPATH) \$(INST_LIB)
-	$whichperl stacksize $options
 
 release : dist
 	git tag \$(VERSION)
@@ -113,18 +85,6 @@ release : dist
 "
 }
 
-sub test {
-    my ($self, %attr) = @_;
-
-    my $out = $self->SUPER::test(%attr);
-
-    if ($ENV{PERL_CORE}) {
-        $out =~ s!^(test(?:db)?_(?:static|dynamic)\b.*)!$1 $limit_pm!gm;
-    }
-
-    $out;
-}
-
 sub postamble {
 '
 all :: Storable.pm
diff --git a/dist/Storable/__Storable__.pm b/dist/Storable/__Storable__.pm
index 71c669daa..e5a655ecd 100644
--- a/dist/Storable/__Storable__.pm
+++ b/dist/Storable/__Storable__.pm
@@ -32,8 +32,6 @@ our $VERSION = '3.08';
 our $recursion_limit;
 our $recursion_limit_hash;
 
-do "Storable/Limit.pm";
-
 $recursion_limit = 512
   unless defined $recursion_limit;
 $recursion_limit_hash = 256
@@ -941,13 +939,13 @@ There are a few things you need to know, however:
 
 =item *
 
-Since Storable 3.05 we probe for the stack recursion limit for references,
+From Storable 3.05 to 3.13 we probed for the stack recursion limit for references,
 arrays and hashes to a maximal depth of ~1200-35000, otherwise we might
 fall into a stack-overflow.  On JSON::XS this limit is 512 btw.  With
 references not immediately referencing each other there's no such
 limit yet, so you might fall into such a stack-overflow segfault.
 
-This probing and the checks performed have some limitations:
+This probing and the checks we performed have some limitations:
 
 =over
 
@@ -955,7 +953,9 @@ This probing and the checks performed have some limitations:
 
 the stack size at build time might be different at run time, eg. the
 stack size may have been modified with ulimit(1).  If it's larger at
-run time Storable may fail the freeze() or thaw() unnecessarily.
+run time Storable may fail the freeze() or thaw() unnecessarily.  If
+it's larger at build time Storable may segmentation fault when
+processing a deep structure at run time.
 
 =item *
 
@@ -970,6 +970,8 @@ stack without triggering Storable's recursion protection.
 
 =back
 
+So these now have simple defaults rather than probing at build-time.
+
 You can control the maximum array and hash recursion depths by
 modifying C<$Storable::recursion_limit> and
 C<$Storable::recursion_limit_hash> respectively.  Either can be set to
diff --git a/dist/Storable/stacksize b/dist/Storable/stacksize
index 14e073973..f93eccce1 100644
--- a/dist/Storable/stacksize
+++ b/dist/Storable/stacksize
@@ -1,21 +1,17 @@
 #!/usr/bin/perl
 # binary search maximum stack depth for arrays and hashes
-# and store it in lib/Storable/Limit.pm
+# and report it to stdout as code to set the limits
 
 use Config;
 use Cwd;
 use File::Spec;
 use strict;
 
--d "lib" or mkdir "lib";
--d "lib/Storable" or mkdir "lib/Storable";
-
-my $fn = "lib/Storable/Limit.pm";
 my $ptrsize = $Config{ptrsize};
 my ($bad1, $bad2) = (65001, 25000);
 sub QUIET () {
     (defined $ENV{MAKEFLAGS} and $ENV{MAKEFLAGS} =~ /\b(s|silent|quiet)\b/
-     and !defined($ENV{TRAVIS}))
+     and !defined($ENV{TRAVIS})) || @ARGV && $ARGV[0] eq "-q"
       ? 1 : 0
 }
 sub PARALLEL () {
@@ -32,11 +28,7 @@ sub is_miniperl {
 }
 
 if (is_miniperl()) {
-    if ($Config{usecrosscompile}) {
-        write_limits(500, 265);
-        exit;
-    }
-    die "Should not run during miniperl\n";
+    die "Should not run using miniperl\n";
 }
 my $prefix = "";
 if ($^O eq "MSWin32") {
@@ -51,58 +43,28 @@ elsif (system("ulimit -c 0 ;") == 0) {
     # try to prevent core dumps
     $prefix = "ulimit -c 0 ; ";
 }
-if (@ARGV and $ARGV[0] eq '--core') {
-    $ENV{PERL_CORE} = 1;
-}
 my $PERL = $^X;
-if ($ENV{PERL_CORE}) {
-    my $path;
-    my $ldlib = $Config{ldlibpthname};
-    if (-d 'dist/Storable') {
-        chdir 'dist/Storable';
-        $PERL = "../../$PERL" unless $PERL =~ m|^/|;
-    }
-    if ($ldlib) {
-        $path = getcwd()."/../..";
-    }
-    if ($^O eq 'MSWin32' and -d '../dist/Storable') {
-        chdir '..\dist\Storable';
-        $PERL = "..\\..\\$PERL" unless $PERL =~ /^[A-Za-z]:\\/;
-    }
-    $PERL = "\"$PERL\"" if $PERL =~ / /;
-    if ($ldlib and $ldlib ne 'PATH') {
-        $PERL = "$ldlib=$path $PERL";
-    }
-}
-
 if ($^O eq "MSWin32") {
     require Win32;
     my ($str, $major, $minor) = Win32::GetOSVersion();
     if ($major < 6 || $major == 6 && $minor < 1) {
-	print "Using defaults for older Win32\n";
+	print "# Using defaults for older Win32\n";
 	write_limits(500, 256);
 	exit;
     }
 }
 my ($n, $good, $bad, $found) =
     (65000, 100, $bad1, undef);
-print "probe for max. stack sizes...\n" unless QUIET;
+print "# probe for max. stack sizes...\n" unless QUIET;
 # -I. since we're run before pm_to_blib (which is going to copy the
 # file we create) and need to load our Storable.pm, not the already
 # installed Storable.pm
-my $mblib = '-Mblib -I.';
-if ($ENV{PERL_CORE}) {
-    if ($^O eq 'MSWin32') {
-        $mblib = '-I..\..\lib\auto -I..\..\lib';
-    } else {
-        $mblib = '-I../../lib/auto -I../../lib';
-    }
+my $mblib = '';
+if (-d 'blib') {
+    $mblib = '-Mblib -I.';
 }
-if (PARALLEL) {
-    # problem with parallel builds. wait for INST_DYNAMIC linking to be done.
-    # the problem is the RM_F INST_DYNAMIC race.
-    print "parallel build race - wait for linker ...\n" unless QUIET;
-    sleep(2.0);
+elsif (-f "Configure") {
+    $mblib = '-Ilib';
 }
 
 sub cmd {
@@ -117,7 +79,7 @@ sub cmd {
 sub good {
     my $i = shift; # this passed
     my $j = $i + abs(int(($bad - $i) / 2));
-    print "Storable: determining recursion limit: $i passed, try more $j ...\n" unless QUIET;
+    print "# Storable: determining recursion limit: $i passed, try more $j ...\n" unless QUIET;
     $good = $i;
     if ($j <= $i) {
         $found++;
@@ -128,7 +90,7 @@ sub good {
 sub bad {
     my $i = shift; # this failed
     my $j = $i - abs(int(($i - $good) / 2));
-    print "Storable: determining recursion limit: $i too big, try less $j ...\n" unless QUIET;
+    print "# Storable: determining recursion limit: $i too big, try less $j ...\n" unless QUIET;
     $bad = $i;
     if ($j >= $i) {
         $j = $good;
@@ -162,7 +124,7 @@ while (!$found) {
         $n = bad($n);
     }
 }
-print "MAX_DEPTH = $n\n" unless QUIET;
+print "# MAX_DEPTH = $n\n" unless QUIET;
 my $max_depth = $n;
 
 ($n, $good, $bad, $found) =
@@ -186,13 +148,13 @@ if ($max_depth == $bad1-1
     and $n == $bad2-1)
 {
     # more likely the shell. travis docker ubuntu, mingw e.g.
-    print "Error: Apparently your system(SHELLSTRING) cannot catch stack overflows\n"
+    print "# Apparently your system(SHELLSTRING) cannot catch stack overflows\n"
       unless QUIET;
     $max_depth = 512;
     $n = 256;
     print "MAX_DEPTH = $max_depth\n" unless QUIET;
 }
-print "MAX_DEPTH_HASH = $n\n" unless QUIET;
+print "# MAX_DEPTH_HASH = $n\n" unless QUIET;
 my $max_depth_hash = $n;
 
 # Previously this calculation was done in the macro, calculate it here
@@ -203,7 +165,7 @@ my $max_depth_hash = $n;
 # several apparently random failures here, eg. working in one
 # configuration, but not in a very similar configuration.
 $max_depth = int(0.6 * $max_depth);
-$max_depth_hash = int(0.6 * $max_depth);
+$max_depth_hash = int(0.6 * $max_depth_hash);
 
 my $stack_reserve = $^O eq "MSWin32" ? 32 : 16;
 if ($] ge "5.016" && !($^O eq "cygwin" && $ptrsize == 8)) {
@@ -221,16 +183,11 @@ write_limits($max_depth, $max_depth_hash);
 
 sub write_limits {
     my ($max_depth, $max_depth_hash) = @_;
-    my $f;
-    open $f, ">", $fn or die "$fn $!";
-    print $f <<EOS;
+    print <<EOS;
 # bisected by stacksize
 \$Storable::recursion_limit = $max_depth
   unless defined \$Storable::recursion_limit;
 \$Storable::recursion_limit_hash = $max_depth_hash
   unless defined \$Storable::recursion_limit_hash;
-1;
 EOS
-    close $f
-      or die "Failed to close $fn: $!\n";
 }
diff --git a/dist/Storable/t/recurse.t b/dist/Storable/t/recurse.t
index 63fde90fd..b5967a072 100644
--- a/dist/Storable/t/recurse.t
+++ b/dist/Storable/t/recurse.t
@@ -318,9 +318,11 @@ is($refcount_ok, 1, "check refcount");
 # Small 64bit systems fail with 1200 (c++ debugging), with gcc 3000.
 # Optimized 64bit allows up to 33.000 recursion depth.
 # with asan the limit is 255 though.
+
+local $Storable::recursion_limit = 30;
+local $Storable::recursion_limit_hash = 20;
 sub MAX_DEPTH () { Storable::stack_depth() }
 sub MAX_DEPTH_HASH () { Storable::stack_depth_hash() }
-sub OVERFLOW () { 35000 }
 {
     my $t;
     print "# max depth ", MAX_DEPTH, "\n";
diff --git a/win32/GNUmakefile b/win32/GNUmakefile
index 05193a1f2..afc18ec8a 100644
--- a/win32/GNUmakefile
+++ b/win32/GNUmakefile
@@ -1168,7 +1168,7 @@ CFG_VARS	=					\
 
 .PHONY: all info
 
-all : info rebasePE Extensions_nonxs $(PERLSTATIC) PostExt
+all : info rebasePE Extensions_nonxs $(PERLSTATIC)
 
 info :
 	@echo # CCTYPE=$(CCTYPE)
@@ -1612,16 +1612,6 @@ Extensions_clean :
 Extensions_realclean :
 	-if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(PLMAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
 
-PostExt : ..\lib\Storable\Limit.pm
-
-# we need the exe, perl(ver).dll, and the Exporter, Storable, Win32 extensions
-# rebasePE most of that, including adjustment for static builds, so we
-# just need non-xs extensions
-..\lib\Storable\Limit.pm : rebasePE Extensions_nonxs
-	$(PLMAKE) -C ..\dist\Storable lib\Storable\Limit.pm
-	if not exist ..\lib\Storable mkdir ..\lib\Storable
-	copy ..\dist\Storable\lib\Storable\Limit.pm ..\lib\Storable\Limit.pm
-
 # all PE files need to be built by the time this target runs, PP files can still
 # be running in parallel like UNIDATAFILES, this target a placeholder for the
 # future
diff --git a/win32/Makefile b/win32/Makefile
index 1e245f712..a4776dd22 100644
--- a/win32/Makefile
+++ b/win32/Makefile
@@ -939,7 +939,7 @@ CFG_VARS	=					\
 #
 
 all : .\config.h ..\git_version.h $(GLOBEXE) $(CONFIGPM) \
-	$(UNIDATAFILES) MakePPPort $(PERLEXE) Extensions_nonxs Extensions PostExt \
+	$(UNIDATAFILES) MakePPPort $(PERLEXE) Extensions_nonxs Extensions \
 	$(PERLSTATIC)
 	@echo	Everything is up to date. '$(MAKE_BARE) test' to run test suite.
 
@@ -1225,13 +1225,6 @@ Extensions_clean:
 Extensions_realclean: 
 	-if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=realclean
 
-PostExt: ..\lib\Storable\Limit.pm
-
-..\lib\Storable\Limit.pm: $(PERLEXE) Extensions
-	cd ..\dist\Storable && $(MAKE) lib\Storable\Limit.pm
-	if not exist ..\lib\Storable mkdir ..\lib\Storable
-	copy ..\dist\Storable\lib\Storable\Limit.pm ..\lib\Storable\Limit.pm
-
 #-------------------------------------------------------------------------------
 
 doc: $(PERLEXE) ..\pod\perltoc.pod
@@ -1310,7 +1303,6 @@ distclean: realclean
 	-del /f $(LIBDIR)\Time\HiRes.pm
 	-del /f $(LIBDIR)\Unicode\Normalize.pm
 	-del /f $(LIBDIR)\Math\BigInt\FastCalc.pm
-	-del /f $(LIBDIR)\Storable.pm $(LIBDIR)\Storable\Limit.pm
 	-del /f $(LIBDIR)\Win32.pm
 	-del /f $(LIBDIR)\Win32CORE.pm
 	-del /f $(LIBDIR)\Win32API\File.pm
diff --git a/win32/makefile.mk b/win32/makefile.mk
index a6072a95a..15b148d15 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -1139,7 +1139,7 @@ CFG_VARS	=					\
 # Top targets
 #
 
-all : CHECKDMAKE rebasePE Extensions_nonxs $(PERLSTATIC) PostExt
+all : CHECKDMAKE rebasePE Extensions_nonxs $(PERLSTATIC)
 
 ..\regcomp$(o) : ..\regnodes.h ..\regcharclass.h
 
@@ -1563,17 +1563,6 @@ rebasePE : Extensions $(PERLDLL) $(NORMALIZE_DYN) $(PERLEXE)
 .ENDIF
 	$(NOOP)
 
-PostExt : ..\lib\Storable\Limit.pm
-	$(NOOP)
-
-# we need the exe, perl(ver).dll, and the Exporter, Storable, Win32 extensions
-# rebasePE most of that, including adjustment for static builds, so we
-# just need non-xs extensions
-..\lib\Storable\Limit.pm : rebasePE Extensions_nonxs
-	cd ..\dist\Storable && $(MAKE) lib\Storable\Limit.pm
-	if not exist ..\lib\Storable mkdir ..\lib\Storable
-	copy ..\dist\Storable\lib\Storable\Limit.pm ..\lib\Storable\Limit.pm
-
 #-------------------------------------------------------------------------------
 
 
@@ -1648,7 +1637,7 @@ distclean: realclean
 	-del /f $(LIBDIR)\Time\HiRes.pm
 	-del /f $(LIBDIR)\Unicode\Normalize.pm
 	-del /f $(LIBDIR)\Math\BigInt\FastCalc.pm
-	-del /f $(LIBDIR)\Storable.pm $(LIBDIR)\Storable\Limit.pm
+	-del /f $(LIBDIR)\Storable.pm
 	-del /f $(LIBDIR)\Win32.pm
 	-del /f $(LIBDIR)\Win32CORE.pm
 	-del /f $(LIBDIR)\Win32API\File.pm
