qpdf/qpdf/qtest/specific-bugs.test

83 lines
2.8 KiB
Perl

#!/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();
my $td = new TestDriver('specific-bugs');
# 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);