7 # We don't actually need these, but fuzzxml does.
16 my $LOG = "zzufit.log";
17 my $DIR = "zzufit.tmp";
20 &GetOptions
("rate=f" => \
$rate,
22 'valgrind' => \
$valgrind,
26 die &usage
(1) unless @ARGV;
30 mkdir ($DIR, 0777) or die "$0: Cannot create $DIR: $!\n";
35 print STDERR
"Test $n\n";
36 &append_log
("-------------------------------------------------------\n");
38 my $file = $corpus[$n % @corpus];
39 my $type = &determine_file_type
($file);
40 die "$0: unable to determine type of $file\n" unless defined $type;
42 my ($filepath,$filebase,$fileext) =
43 ($file =~ m
:^(|.*/)([^/]+)(\
.[^./]+)$:);
44 if (!defined $filepath) {
45 ($filepath,$filebase) = ($file =~ m
:^(|.*/)([^/]+)$:);
49 my $zzuffile = "$DIR/${filebase}-${n}${fileext}";
53 $fuzzcmd = "./fuzzxml -s$n -r$rate '$file' '$zzuffile'";
54 } elsif ($type eq 'xml.gz') {
55 $fuzzcmd = "gzip -dc '$file' | ./fuzzxml -s$n -r$rate - '$zzuffile'";
56 } elsif ($type eq 'raw') {
57 $fuzzcmd = "zzuf -s$n -r$rate <'$file' >'$zzuffile'";
58 } elsif ($type eq 'ods') {
59 $fuzzcmd = "./fuzzzip --subfuzzer='./fuzzxml -s$n -r$rate %i %o' --subfile content.xml --subfile styles.xml '$file' '$zzuffile'";
60 } elsif ($type eq 'xlsx') {
61 $fuzzcmd = "./fuzzzip --subfuzzer='./fuzzxml -s$n -r$rate %i %o' --subfile xl/styles.xml --subfile xl/worksheets/sheet1.xml '$file' '$zzuffile'";
63 die "$0: Internal error.\n";
66 &append_log
("Fuzz command $fuzzcmd\n");
70 my $sig = $code & 0x7f;
74 my $outfile = "$DIR/${filebase}-${n}.gnumeric";
75 my $logfile = "$DIR/${filebase}-${n}.log";
77 my $cmd = "../src/ssconvert '$zzuffile' '$outfile' 2>&1 | tee '$logfile' >>'$LOG'";
79 $cmd = "../tools/gnmvalgrind --leak-check=full $cmd";
83 my $sig = $code & 0x7f;
86 &append_log
("CORE\n");
87 print STDERR
"CORE\n";
93 my $txt = "Exit code $code\n";
101 my $log_fh = new IO
::File
($logfile, "r")
102 or die "$0: cannot read $logfile: $!\n";
105 my $prevline = $prev;
108 if (/^==\d+==\s+definitely lost: (\d+) bytes in \d+ blocks/ && $1 > 0) {
127 unlink $logfile, $zzuffile, $outfile;
135 open (FIL
, ">>$LOG") or die "$0: Cannot append to $LOG: $!\n";
143 print STDERR
"$0 [options]\n\n";
144 print STDERR
" --rate=frac Fraction of bits to flip.\n";
145 print STDERR
" --seed=int Initial seed.\n";
146 print STDERR
" --valgrind Run under Valgrind.\n";
151 sub determine_file_type
{
154 return $file_type{$file} if exists $file_type{$file};
156 return undef unless -r
$file && -f _
;
158 if ($file =~ /\.(xls|wb[23])$/) {
159 return $file_type{$file} = 'raw';
162 if ($file =~ /\.ods$/) {
163 return $file_type{$file} = 'ods';
166 if ($file =~ /\.xlsx$/) {
167 return $file_type{$file} = 'xlsx';
170 if ($file =~ /\.xml$/) {
171 return $file_type{$file} = 'xml';
174 if ($file =~ /\.gnumeric$/) {
175 my $f = new IO
::File
($file, "r");
177 my $nread = read $f,$data,10;
178 return undef unless $nread == 10;
180 if ($data =~ /^<\?xml/) {
181 return $file_type{$file} = 'xml';
184 if (ord (substr ($data, 0, 1)) == 0x1f &&
185 ord (substr ($data, 1, 1)) == 0x8b) {
186 return $file_type{$file} = 'xml.gz';
190 return $file_type{$file} = undef;