--- loncom/xml/Safe.pm 2003/08/30 02:26:37 1.6 +++ loncom/xml/Safe.pm 2009/02/13 17:20:38 1.9 @@ -1,3 +1,5 @@ +# $Id: Safe.pm,v 1.9 2009/02/13 17:20:38 bisitz Exp $ + package Safe; use 5.003_11; @@ -208,19 +210,20 @@ sub varglob { sub reval { - my ($obj, $expr, $strict) = @_; - my $root = $obj->{Root}; - - # Create anon sub ref in root of compartment. - # Uses a closure (on $expr) to pass in the code to be executed. - # (eval on one line to keep line numbers as expected by caller) - my $evalcode = sprintf('package %s; sub { @_ = (); eval $expr; }', $root); - my $evalsub; - - if ($strict) { use strict; $evalsub = eval $evalcode; } - else { no strict; $evalsub = eval $evalcode; } - - return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); + undef($Safe::evalsub); + { + my ($obj, $expr, $strict) = @_; + my $root = $obj->{Root}; + + # Create anon sub ref in root of compartment. + # Uses a closure (on $expr) to pass in the code to be executed. + # (eval on one line to keep line numbers as expected by caller) + my $evalcode = sprintf('package %s; sub { @_ = (\'\'); eval $expr; }', $obj->{Root}); + + if ($strict) { use strict; $Safe::evalsub = eval $evalcode; } + else { no strict; $Safe::evalsub = eval $evalcode; } + } + return Opcode::_safe_call_sv($_[0]->{Root}, $_[0]->{Mask}, $Safe::evalsub); } sub rdo { @@ -228,7 +231,7 @@ sub rdo { my $root = $obj->{Root}; my $evalsub = eval - sprintf('package %s; sub { @_ = (); do $file }', $root); + sprintf('package %s; sub { @_ = (\'\'); do $file }', $root); return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); }