From 6fe7b704c7dfb517e4de20fb25536fab1de83d56 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Wed, 6 Jan 2021 09:49:10 -0500 Subject: Warn rather than segv on access after closing input source (fixes #495) --- libqpdf/QPDF.cc | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 29508a40..34f15706 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -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 encp, PointerHolder file, @@ -254,7 +299,7 @@ QPDF::processInputSource(PointerHolder source, void QPDF::closeInputSource() { - this->m->file = 0; + this->m->file = new InvalidInputSource(); } void -- cgit v1.2.3-70-g09d2