2022-05-14 20:16:20 +00:00
|
|
|
#!/usr/bin/env perl
|
|
|
|
require 5.008;
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
unshift(@INC, '.');
|
|
|
|
require qpdf_test_helpers;
|
|
|
|
|
|
|
|
chdir("qpdf") or die "chdir testdir failed: $!\n";
|
|
|
|
|
|
|
|
require TestDriver;
|
|
|
|
|
|
|
|
cleanup();
|
|
|
|
|
2022-05-19 21:27:41 +00:00
|
|
|
my $td = new TestDriver('specific-bugs');
|
2022-05-14 20:16:20 +00:00
|
|
|
|
|
|
|
# The number is the github issue number in which the bug was reported.
|
|
|
|
my @bug_tests = (
|
|
|
|
["51", "resolve loop", 3],
|
|
|
|
["99", "object 0", 2],
|
|
|
|
["99b", "object 0", 2],
|
|
|
|
["100", "xref reconstruction loop", 2],
|
|
|
|
["101", "resolve for exception text", 2],
|
|
|
|
["117", "other infinite loop", 3],
|
|
|
|
["118", "other infinite loop", 2],
|
|
|
|
["119", "other infinite loop", 3],
|
|
|
|
["120", "other infinite loop", 3],
|
|
|
|
["106", "zlib data error", 3],
|
|
|
|
["141a", "/W entry size 0", 2],
|
|
|
|
["141b", "/W entry size 0", 2],
|
|
|
|
["143", "self-referential ostream", 3, "--preserve-unreferenced"],
|
|
|
|
["146", "very deeply nested array", 2],
|
|
|
|
["147", "previously caused memory error", 2],
|
|
|
|
["148", "free memory on bad flate", 2],
|
|
|
|
["149", "xref prev pointer loop", 3],
|
|
|
|
["150", "integer overflow", 2],
|
|
|
|
["202", "even more deeply nested dictionary", 2],
|
|
|
|
["263", "empty xref stream", 2],
|
|
|
|
["335a", "ozz-fuzz-12152", 2],
|
|
|
|
["335b", "ozz-fuzz-14845", 2],
|
|
|
|
["fuzz-16214", "stream in object stream", 3, "--preserve-unreferenced"],
|
|
|
|
# When adding to this list, consider adding to CORPUS_FROM_TEST in
|
|
|
|
# fuzz/CMakeLists.txt and updating the count in
|
|
|
|
# fuzz/qtest/fuzz.test.
|
|
|
|
);
|
|
|
|
my $n_tests = scalar(@bug_tests);
|
|
|
|
foreach my $d (@bug_tests)
|
|
|
|
{
|
|
|
|
my ($n, $description, $exit_status, $xargs) = @$d;
|
|
|
|
if (! defined $xargs)
|
|
|
|
{
|
|
|
|
$xargs = "";
|
|
|
|
}
|
|
|
|
if (-f "issue-$n.obfuscated")
|
|
|
|
{
|
|
|
|
# Some of the PDF files in the test suite trigger anti-virus
|
|
|
|
# warnings (MAL/PDFEx-H) and are quarantined or deleted by
|
|
|
|
# some antivirus software. These files are not actually
|
|
|
|
# infected files with malicious intent. They are present in
|
|
|
|
# the test suite to ensure that qpdf does not crash when
|
|
|
|
# process those files. Base64-encode them and pass them to
|
|
|
|
# stdin to prevent anti-virus programs from messing up the
|
|
|
|
# extracted sources. Search for "obfuscated" in test_driver.cc
|
|
|
|
# for instructions on how to obfuscate input files.
|
|
|
|
$td->runtest($description,
|
|
|
|
{$td->COMMAND => "test_driver 45 issue-$n"},
|
|
|
|
{$td->FILE => "issue-$n.out",
|
|
|
|
$td->EXIT_STATUS => $exit_status},
|
|
|
|
$td->NORMALIZE_NEWLINES);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
my $base = (-f "issue-$n.pdf") ? "issue-$n" : "$n";
|
|
|
|
$td->runtest($description,
|
|
|
|
{$td->COMMAND => "qpdf $xargs $base.pdf a.pdf"},
|
|
|
|
{$td->FILE => "$base.out",
|
|
|
|
$td->EXIT_STATUS => $exit_status},
|
|
|
|
$td->NORMALIZE_NEWLINES);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
cleanup();
|
|
|
|
$td->report($n_tests);
|