In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/7d926cfad45d0fd1b9546391623278b92d3e4757?hp=340458b54f884968f1f78789d57137d34f239152>
- Log ----------------------------------------------------------------- commit 7d926cfad45d0fd1b9546391623278b92d3e4757 Author: Rafael Garcia-Suarez <r...@consttype.org> Date: Mon Sep 13 15:15:40 2010 +0200 Bump Safe's VERSION to 2.28 M dist/Safe/Changes M dist/Safe/META.yml M dist/Safe/Safe.pm commit 7650682f4377a73dc7c46a6c3b8113a5f987c902 Author: Rafael Garcia-Suarez <r...@consttype.org> Date: Mon Sep 13 15:11:27 2010 +0200 Avoid infinite loop in _find_code_refs. Patch by Yasushi Nakajima (rt.cpan.org #61262) M dist/Safe/Safe.pm M dist/Safe/t/safewrap.t ----------------------------------------------------------------------- Summary of changes: dist/Safe/Changes | 4 ++++ dist/Safe/META.yml | 4 ++-- dist/Safe/Safe.pm | 10 ++++++++-- dist/Safe/t/safewrap.t | 11 ++++++++++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/dist/Safe/Changes b/dist/Safe/Changes index a00878b..7dc1c1d 100644 --- a/dist/Safe/Changes +++ b/dist/Safe/Changes @@ -1,3 +1,7 @@ +2.28 Mon Sep 13 2010 + - Avoid infinite loop in _find_code_refs. + Patch by Yasushi Nakajima (rt.cpan.org #61262) + 2.27 Thu Apr 29 2010 - Wrap coderefs returned by reval() and rdo() - Add even more version::vxs routines to the default share diff --git a/dist/Safe/META.yml b/dist/Safe/META.yml index 6718a37..8938397 100644 --- a/dist/Safe/META.yml +++ b/dist/Safe/META.yml @@ -1,6 +1,6 @@ --- #YAML:1.0 name: Safe -version: 2.27 +version: 2.28 abstract: ~ author: [] license: unknown @@ -14,7 +14,7 @@ no_index: directory: - t - inc -generated_by: ExtUtils::MakeMaker version 6.56 +generated_by: ExtUtils::MakeMaker version 6.57_05 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 diff --git a/dist/Safe/Safe.pm b/dist/Safe/Safe.pm index bca4dfe..5d40528 100644 --- a/dist/Safe/Safe.pm +++ b/dist/Safe/Safe.pm @@ -2,9 +2,9 @@ package Safe; use 5.003_11; use strict; -use Scalar::Util qw(reftype); +use Scalar::Util qw(reftype refaddr); -$Safe::VERSION = "2.27"; +$Safe::VERSION = "2.28"; # *** Don't declare any lexicals above this point *** # @@ -362,10 +362,12 @@ sub reval { return (wantarray) ? @subret : $subret[0]; } +my %OID; sub wrap_code_refs_within { my $obj = shift; + %OID = (); $obj->_find_code_refs('wrap_code_ref', @_); } @@ -377,6 +379,10 @@ sub _find_code_refs { for my $item (@_) { my $reftype = $item && reftype $item or next; + + # skip references already seen + next if ++$OID{refaddr $item} > 1; + if ($reftype eq 'ARRAY') { $obj->_find_code_refs($visitor, @$item); } diff --git a/dist/Safe/t/safewrap.t b/dist/Safe/t/safewrap.t index 27166f8..b99f416 100644 --- a/dist/Safe/t/safewrap.t +++ b/dist/Safe/t/safewrap.t @@ -11,7 +11,7 @@ BEGIN { use strict; use Safe 1.00; -use Test::More tests => 9; +use Test::More tests => 10; my $safe = Safe->new('PLPerl'); $safe->permit_only(qw(:default sort)); @@ -37,3 +37,12 @@ my $sub1w2 = $args[1][0][1]{sub}; isnt $sub1w2, $sub1; is eval { $sub1w2->() }, undef; like $@, qr/eval .* trapped by operation mask/; + +# Avoid infinite recursion when looking for coderefs +my $r = $safe->reval(<<'END'); +%a = (); +%b = (a => \%a); +$a{b} = \%b; +42; +END +is($r, 42); -- Perl5 Master Repository