Warn rather than segv on access after closing input source (fixes #495)

This commit is contained in:
Jay Berkenbilt 2021-01-06 09:49:10 -05:00
parent 2c078337fa
commit 6fe7b704c7
5 changed files with 65 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2021-01-06 Jay Berkenbilt <ejb@ql.org>
* Give warnings instead of segfaulting if a QPDF operation is
attempted after calling closeInputSource(). Fixes #495.
2021-01-05 Jay Berkenbilt <ejb@ql.org>
* 10.1.0: release

View File

@ -45,6 +45,51 @@ static char const* EMPTY_PDF =
"110\n"
"%%EOF\n";
class InvalidInputSource: public InputSource
{
public:
virtual ~InvalidInputSource() = default;
virtual qpdf_offset_t findAndSkipNextEOL() override
{
throwException();
return 0;
}
virtual std::string const& getName() const override
{
static std::string name("closed input source");
return name;
}
virtual qpdf_offset_t tell() override
{
throwException();
return 0;
}
virtual void seek(qpdf_offset_t offset, int whence) override
{
throwException();
}
virtual void rewind() override
{
throwException();
}
virtual size_t read(char* buffer, size_t length) override
{
throwException();
return 0;
}
virtual void unreadCh(char ch) override
{
throwException();
}
private:
void throwException()
{
throw std::runtime_error(
"QPDF operation attempted after closing input source");
}
};
QPDF::ForeignStreamData::ForeignStreamData(
PointerHolder<EncryptionParameters> encp,
PointerHolder<InputSource> file,
@ -254,7 +299,7 @@ QPDF::processInputSource(PointerHolder<InputSource> source,
void
QPDF::closeInputSource()
{
this->m->file = 0;
this->m->file = new InvalidInputSource();
}
void

View File

@ -1215,7 +1215,13 @@ $td->runtest("check output",
show_ntests();
# ----------
$td->notify("--- Invalid objects ---");
$n_tests += 2;
$n_tests += 3;
$td->runtest("closed input source",
{$td->COMMAND => "test_driver 73 minimal.pdf"},
{$td->FILE => "test73.out",
$td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
$td->runtest("empty object",
{$td->COMMAND => "qpdf -show-object=7,0 empty-object.pdf"},

View File

@ -0,0 +1,2 @@
WARNING: closed input source: object 2/0: error reading object: QPDF operation attempted after closing input source
test 73 done

View File

@ -2300,6 +2300,11 @@ void runtest(int n, char const* filename1, char const* arg2)
buf->getSize());
assert(s.find("/bye") != std::string::npos);
}
else if (n == 73)
{
pdf.closeInputSource();
pdf.getRoot().getKey("/Pages").unparseResolved();
}
else
{
throw std::runtime_error(std::string("invalid test ") +