--- loncom/xml/run.pm 2004/07/13 19:12:46 1.47 +++ loncom/xml/run.pm 2008/11/24 18:55:01 1.60 @@ -1,6 +1,6 @@ package Apache::run; # -# $Id: run.pm,v 1.47 2004/07/13 19:12:46 albertel Exp $ +# $Id: run.pm,v 1.60 2008/11/24 18:55:01 jms Exp $ # # Copyright Michigan State University Board of Trustees # @@ -48,23 +48,24 @@ while (!$_LONCAPA_INTERNAL_oldexpression (?=[^\[\{\(]|$)/ my ($__LC__a,$__LC__b,$__LC__c)=($1,$2,$3); my $__LC__prefix; - my $result; + my $__LC__result; while (1) { + if ($__LC__a =~ m-^&(theta|pi|rho)$-) { last; } { use strict; no strict "vars"; if (eval(defined(eval($__LC__a.$__LC__b)))) { - $result= $__LC__prefix.eval($__LC__a.$__LC__b.$__LC__c); + $__LC__result= $__LC__prefix.eval($__LC__a.$__LC__b.$__LC__c); last; } } $__LC__prefix.=substr($__LC__a,0,1,""); if ($__LC__a!~m-^(\$|&|\#)-) { last; } } - if (!defined($result)) { - $result=$__LC__prefix.$__LC__a.$__LC__b.$__LC__c; + if (!defined($__LC__result)) { + $__LC__result=$__LC__prefix.$__LC__a.$__LC__b.$__LC__c; } - $result; + $__LC__result; /sexg; if (scalar(values(%_LONCAPA_INTERNAL_oldexpressions))>10) {last;} } @@ -77,21 +78,19 @@ sub evaluate { my $result = ''; $@=''; $Apache::run::timeout=0; - $main::SIG{'ALRM'} = sub { + local $main::SIG{'ALRM'} = sub { $Apache::run::timeout=1; die("timeout"); }; my $innererror; - $safeeval->permit("require"); eval { - alarm($Apache::lonnet::perlvar{'lonScriptTimeout'}); + &Apache::lonxml::start_alarm(); $safeeval->reval('{'.$decls.';$_=<<\'EXPRESSION\';'."\n".$expression. "\n".'EXPRESSION'."\n".$EVALUATE_STRING.'}'); $innererror=$@; - alarm(0); + &Apache::lonxml::end_alarm(); }; - $safeeval->deny("require"); - my $error=$@; + my $error=$@; if ($error eq '' && $innererror eq '' && !$Apache::run::timeout) { $result = $safeeval->reval('return $_;'); chomp $result; @@ -117,16 +116,16 @@ sub run { my @result; $@=''; $Apache::run::timeout=0; - $main::SIG{'ALRM'} = sub { + local $main::SIG{'ALRM'} = sub { $Apache::run::timeout=1; die("timeout"); }; my $innererror; eval { - alarm($Apache::lonnet::perlvar{'lonScriptTimeout'}); + &Apache::lonxml::start_alarm(); @result=$safeeval->reval($code); $innererror=$@; - alarm(0); + &Apache::lonxml::end_alarm(); }; my $error=$@; if (($Apache::run::timeout || $error ne '' || $innererror ne '') && !$hideerrors) { @@ -136,13 +135,15 @@ sub run { } my $errormsg='
'.&HTML::Entities::encode($error,'<>&"').' '.
 	    &HTML::Entities::encode($innererror,'<>&"').
-	    '
occured while running
';
+	    '
occurred while running
';
 	$code=&HTML::Entities::encode($code,'<>&"');
 	if ($innererror=~/line (\d+)/) {
 	    my $linenumber=$1;
 	    my @code=split("\n",$code);
-	    $code[$linenumber-1]=''.
-		$code[$linenumber-1].'';
+	    if ($linenumber < scalar(@code)) {
+		$code[$linenumber-1]=''.
+		    $code[$linenumber-1].'';
+	    }
 	    $code=join("\n",@code);
 	}
 	&Apache::lonxml::error($errormsg.$code.'
'); @@ -159,22 +160,29 @@ sub dump { my ($target,$safeeval)=@_; my $dump=''; foreach my $symname (sort keys %{$safeeval->varglob('main::')}) { - if (($symname!~/^\_/) && ($symname!~/\:$/)) { + if (($symname!~ /^(INC|SIG)/) && ($symname!~/\027/) && + ($symname!~/^\_/) && ($symname!~/\:$/)) { my $line; if ($safeeval->reval('defined($'.$symname.')')) { - $line='$'.$symname.'='.$safeeval->reval('$'.$symname); + if ($symname =~ /^\w/) { + $line.='$'.$symname.'='.$safeeval->reval('$'.$symname)."\n"; + } } if ($safeeval->reval('defined(@'.$symname.')')) { - $line='@'.$symname.'=('. - $safeeval->reval('join(",",@'.$symname.')').")"; + $line.='@'.$symname.'=('. + $safeeval->reval('join(",",@'.$symname.')').")"."\n"; } if ($safeeval->reval('defined(%'.$symname.')')) { - $line='%'.$symname.'=('; + $line.='%'.$symname.'=('; $line.=$safeeval->reval('join(",",map { $_."=>".$'. $symname.'{$_} } sort keys %'. - $symname.')').")" - } - if ($line ne '') {$dump.=&HTML::Entities::encode($line,'<>&"')."
";} + $symname.')').")"."\n"; + } + if ($line ne '') { + $line=&HTML::Entities::encode($line,'<>&"'); + $line=~s|\n|
|g; + $dump.=$line; + } } } $dump.=''; @@ -183,3 +191,29 @@ sub dump { 1; __END__; + +=pod + +=head1 NAME + +Apache::run.pm + +=head1 SYNOPSIS + +Used to prevent poorly written problems from +causing lingering after effects + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + + +=head1 NOTABLE SUBROUTINES + +=over + +=item run(), dump(), evaluate() + +=back + +=cut +