Module::CoreList::TieHashDelta stop massive recursion
authorDaniel Dragan <bulk88@hotmail.com>
Wed, 28 May 2014 12:17:25 +0000 (08:17 -0400)
committerTony Cook <tony@develop-help.com>
Wed, 2 Jul 2014 01:17:20 +0000 (11:17 +1000)
On machines with very limited memory, EXISTS calling EXISTS caused a very
high number of C stack frames, magic stack swaps, and Perl call stack
frames leading to memory exhaustion. Turn the recursion into a loop. See
[perl #121974].

dist/Module-CoreList/lib/Module/CoreList/TieHashDelta.pm

index ae9947e..a9fd403 100644 (file)
@@ -32,12 +32,14 @@ sub FETCH {
 sub EXISTS {
     my ($self, $key) = @_;
 
+    restart:
     if (exists $self->{changed}{$key}) {
         return 1;
     } elsif (exists $self->{removed}{$key}) {
         return '';
     } elsif (defined $self->{parent}) {
-        return exists $self->{parent}{$key};
+        $self = tied %{$self->{parent}}; #avoid extreme magic/tie recursion
+        goto restart;
     }
     return '';
 }