Bug 325853: Use Data::Dumper instead of internal code for GenerateCode, to futureproof it and guard against escaping errors.

r=timeless


git-svn-id: svn://10.0.0.236/trunk@265319 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
justdave%bugzilla.org 2014-04-15 02:22:01 +00:00
parent 2284dbd2b6
commit 9adb5fc940
2 changed files with 10 additions and 65 deletions

View File

@ -42,7 +42,7 @@ sub WriteParams {
my $v = $::param{'version'};
delete $::param{'version'}; # Don't write the version number out to
# the params file.
print PARAM_FID GenerateCode('%::param');
print PARAM_FID Data::Dumper->Dump([\%::param], ['*::param']);
$::param{'version'} = $v;
print PARAM_FID "1;\n";
close PARAM_FID;

View File

@ -36,6 +36,8 @@ use Mail::Mailer;
use Mail::Internet;
use Mail::Header;
use Data::Dumper;
$ENV{'MAILADDRESS'} = Param('maintainer');
# use Carp; # for confess
@ -261,63 +263,6 @@ sub SplitEnumType {
}
##
## Routines to generate perl code that will reinitialize variables
## correctly when eval'ed
##
# Generate a string which, when later interpreted by the Perl compiler, will
# be the same as the given string.
sub PerlQuote {
my ($str) = (@_);
$str =~ s/([\\\'])/\\$1/g;
$str =~ s/\0/\\0/g;
return "'$str'";
}
sub GenerateArrayCode {
my ($ref) = (@_);
my @list;
foreach my $i (@$ref) {
push @list, PerlQuote($i);
}
return join(',', @list);
}
# Given the name of a global variable, generate Perl code that, if later
# executed, would restore the variable to its current value.
sub GenerateCode {
my ($name) = (@_);
my $result = $name . " = ";
if ($name =~ /^\$/) {
my $value = eval($name);
if (ref($value) eq "ARRAY") {
$result .= "[" . GenerateArrayCode($value) . "]";
} else {
$result .= PerlQuote(eval($name));
}
} elsif ($name =~ /^@/) {
my @value = eval($name);
$result .= "(" . GenerateArrayCode(\@value) . ")";
} elsif ($name =~ '%') {
$result = "";
foreach my $k (sort { uc($a) cmp uc($b)} eval("keys $name")) {
$result .= GenerateCode("\$" . substr($name, 1) .
"{'" . $k . "'}");
}
return $result;
} else {
die "Can't do $name -- unacceptable variable type.";
}
$result .= ";\n";
return $result;
}
##
## Locking and Logging routines
##
@ -650,7 +595,7 @@ sub PickNewBatchID {
$batchfile = DataDir() . "/batchid.pl";
LockOpen(\*BATCH, "> $batchfile", "Couldn't write $batchfile");
print BATCH GenerateCode('$::BatchID');
print BATCH Data::Dumper->Dump([\$::BatchID],['*::BatchID']);
close(BATCH);
Unlock();
}
@ -709,14 +654,14 @@ sub WriteCheckins {
undef(%person);
foreach $i ('TreeOpen', 'LastGoodTimeStamp', 'CloseTimeStamp') {
print TEMP GenerateCode("\$::$i");
}
print TEMP GenerateCode('@::CheckInList');
print TEMP Data::Dumper->Dump([\$::TreeOpen, \$::LastGoodTimeStamp,
\$::CloseTimeStamp, \@::CheckInList],
['*::TreeOpen','*::LastGoodTimeStamp',
'*::CloseTimeStamp','*::CheckInList']);
foreach $checkin (@::CheckInList) {
my $info = eval("\\\%$checkin");
print TEMP GenerateCode("\%$checkin");
print TEMP Data::Dumper->Dump([\%$checkin],['*'.$checkin]);
$person{$$info{'person'}} = 1;
}
print TEMP "1;\n";
@ -791,7 +736,7 @@ sub WriteMOTD {
LockOpen(\*MOTD, "> $motd_file", "Couldn't create $motd_file");
chmod(0666, $motd_file);
print MOTD GenerateCode('$::MOTD');
print MOTD Data::Dumper->Dump([\$::MOTD],['*::MOTD']);
close(MOTD);
Unlock();
}