mirror of
https://github.com/qpdf/qpdf.git
synced 2024-05-31 17:30:54 +00:00
Warn rather than segv on access after closing input source (fixes #495)
This commit is contained in:
parent
2c078337fa
commit
6fe7b704c7
|
@ -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>
|
2021-01-05 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
* 10.1.0: release
|
* 10.1.0: release
|
||||||
|
|
|
@ -45,6 +45,51 @@ static char const* EMPTY_PDF =
|
||||||
"110\n"
|
"110\n"
|
||||||
"%%EOF\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(
|
QPDF::ForeignStreamData::ForeignStreamData(
|
||||||
PointerHolder<EncryptionParameters> encp,
|
PointerHolder<EncryptionParameters> encp,
|
||||||
PointerHolder<InputSource> file,
|
PointerHolder<InputSource> file,
|
||||||
|
@ -254,7 +299,7 @@ QPDF::processInputSource(PointerHolder<InputSource> source,
|
||||||
void
|
void
|
||||||
QPDF::closeInputSource()
|
QPDF::closeInputSource()
|
||||||
{
|
{
|
||||||
this->m->file = 0;
|
this->m->file = new InvalidInputSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -1215,7 +1215,13 @@ $td->runtest("check output",
|
||||||
show_ntests();
|
show_ntests();
|
||||||
# ----------
|
# ----------
|
||||||
$td->notify("--- Invalid objects ---");
|
$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->runtest("empty object",
|
||||||
{$td->COMMAND => "qpdf -show-object=7,0 empty-object.pdf"},
|
{$td->COMMAND => "qpdf -show-object=7,0 empty-object.pdf"},
|
||||||
|
|
2
qpdf/qtest/qpdf/test73.out
Normal file
2
qpdf/qtest/qpdf/test73.out
Normal 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
|
|
@ -2300,6 +2300,11 @@ void runtest(int n, char const* filename1, char const* arg2)
|
||||||
buf->getSize());
|
buf->getSize());
|
||||||
assert(s.find("/bye") != std::string::npos);
|
assert(s.find("/bye") != std::string::npos);
|
||||||
}
|
}
|
||||||
|
else if (n == 73)
|
||||||
|
{
|
||||||
|
pdf.closeInputSource();
|
||||||
|
pdf.getRoot().getKey("/Pages").unparseResolved();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw std::runtime_error(std::string("invalid test ") +
|
throw std::runtime_error(std::string("invalid test ") +
|
||||||
|
|
Loading…
Reference in New Issue
Block a user