summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNelson Benítez León <nbenitezl@gmail.com>2025-01-05 21:33:23 +0000
committerAlbert Astals Cid <aacid@kde.org>2025-01-05 21:33:23 +0000
commit5d71c95d08aa0e097f711254e1c69ee0cf275328 (patch)
tree4ea7e98f321250a09afe863369eca7d5cf721c03
parent3ead1238555ce14dd0c619f1097d552307e6e40a (diff)
Detect malformed Streams in Annot Appearances
-rw-r--r--poppler/Annot.cc5
-rw-r--r--poppler/DCTStream.cc6
-rw-r--r--poppler/DCTStream.h2
-rw-r--r--poppler/Decrypt.cc12
-rw-r--r--poppler/Decrypt.h6
-rw-r--r--poppler/FlateEncoder.cc5
-rw-r--r--poppler/FlateEncoder.h2
-rw-r--r--poppler/FlateStream.cc4
-rw-r--r--poppler/FlateStream.h2
-rw-r--r--poppler/JBIG2Stream.cc4
-rw-r--r--poppler/JBIG2Stream.h2
-rw-r--r--poppler/JPEG2000Stream.cc4
-rw-r--r--poppler/JPEG2000Stream.h2
-rw-r--r--poppler/JPXStream.cc6
-rw-r--r--poppler/JPXStream.h2
-rw-r--r--poppler/PSOutputDev.cc6
-rw-r--r--poppler/Stream.cc98
-rw-r--r--poppler/Stream.h54
18 files changed, 145 insertions, 77 deletions
diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 0b2733b9..126b7427 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -1401,6 +1401,11 @@ void Annot::initialize(PDFDoc *docA, Dict *dict)
//----- get the annotation appearance
if (appearStreams) {
appearance = appearStreams->getAppearanceStream(AnnotAppearance::appearNormal, appearState->c_str());
+ Object obj = appearance.fetch(doc->getXRef());
+ if (obj.isStream() && !obj.getStream()->reset()) {
+ // appearance stream is invalid as reset() returned false - Issue #1557
+ appearance.setToNull();
+ }
}
//----- parse the border style
diff --git a/poppler/DCTStream.cc b/poppler/DCTStream.cc
index cff9101d..c176d586 100644
--- a/poppler/DCTStream.cc
+++ b/poppler/DCTStream.cc
@@ -114,7 +114,7 @@ void DCTStream::init()
row_buffer = nullptr;
}
-void DCTStream::reset()
+bool DCTStream::reset()
{
int row_stride;
@@ -137,7 +137,7 @@ void DCTStream::reset()
c = str->getChar();
if (c == -1) {
error(errSyntaxError, -1, "Could not find start of jpeg data");
- return;
+ return false;
}
if (c != 0xFF) {
c = 0;
@@ -187,6 +187,8 @@ void DCTStream::reset()
row_buffer = cinfo.mem->alloc_sarray((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);
}
}
+
+ return true;
}
bool DCTStream::readLine()
diff --git a/poppler/DCTStream.h b/poppler/DCTStream.h
index 2aaee12c..efe37b7c 100644
--- a/poppler/DCTStream.h
+++ b/poppler/DCTStream.h
@@ -61,7 +61,7 @@ public:
DCTStream(Stream *strA, int colorXformA, Dict *dict, int recursion);
~DCTStream() override;
StreamKind getKind() const override { return strDCT; }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override;
GooString *getPSFilter(int psLevel, const char *indent) override;
diff --git a/poppler/Decrypt.cc b/poppler/Decrypt.cc
index 6daf3715..b95c9b94 100644
--- a/poppler/Decrypt.cc
+++ b/poppler/Decrypt.cc
@@ -347,11 +347,11 @@ BaseCryptStream::~BaseCryptStream()
}
}
-void BaseCryptStream::reset()
+bool BaseCryptStream::reset()
{
charactersRead = 0;
nextCharBuff = EOF;
- str->reset();
+ return str->reset();
}
Goffset BaseCryptStream::getPos()
@@ -402,7 +402,7 @@ EncryptStream::EncryptStream(Stream *strA, const unsigned char *fileKey, CryptAl
EncryptStream::~EncryptStream() = default;
-void EncryptStream::reset()
+bool EncryptStream::reset()
{
BaseCryptStream::reset();
@@ -426,6 +426,8 @@ void EncryptStream::reset()
case cryptNone:
break;
}
+
+ return true;
}
int EncryptStream::lookChar()
@@ -481,7 +483,7 @@ DecryptStream::DecryptStream(Stream *strA, const unsigned char *fileKey, CryptAl
DecryptStream::~DecryptStream() = default;
-void DecryptStream::reset()
+bool DecryptStream::reset()
{
int i;
BaseCryptStream::reset();
@@ -508,6 +510,8 @@ void DecryptStream::reset()
case cryptNone:
break;
}
+
+ return true;
}
int DecryptStream::lookChar()
diff --git a/poppler/Decrypt.h b/poppler/Decrypt.h
index 4f0c6d28..09dafced 100644
--- a/poppler/Decrypt.h
+++ b/poppler/Decrypt.h
@@ -95,7 +95,7 @@ public:
BaseCryptStream(Stream *strA, const unsigned char *fileKey, CryptAlgorithm algoA, int keyLength, Ref ref);
~BaseCryptStream() override;
StreamKind getKind() const override { return strCrypt; }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override = 0;
Goffset getPos() override;
@@ -127,7 +127,7 @@ class EncryptStream : public BaseCryptStream
public:
EncryptStream(Stream *strA, const unsigned char *fileKey, CryptAlgorithm algoA, int keyLength, Ref ref);
~EncryptStream() override;
- void reset() override;
+ bool reset() override;
int lookChar() override;
};
@@ -136,7 +136,7 @@ class DecryptStream : public BaseCryptStream
public:
DecryptStream(Stream *strA, const unsigned char *fileKey, CryptAlgorithm algoA, int keyLength, Ref ref);
~DecryptStream() override;
- void reset() override;
+ bool reset() override;
int lookChar() override;
};
diff --git a/poppler/FlateEncoder.cc b/poppler/FlateEncoder.cc
index 0ae1d528..ed3e5ec8 100644
--- a/poppler/FlateEncoder.cc
+++ b/poppler/FlateEncoder.cc
@@ -55,7 +55,7 @@ FlateEncoder::~FlateEncoder()
}
}
-void FlateEncoder::reset()
+bool FlateEncoder::reset()
{
int zlib_status;
@@ -71,10 +71,13 @@ void FlateEncoder::reset()
if (zlib_status != Z_OK) {
inBufEof = outBufEof = true;
error(errInternal, -1, "Internal: deflateInit() failed in FlateEncoder::reset()");
+ return false;
}
zlib_stream.next_out = outBufEnd;
zlib_stream.avail_out = 1; /* anything but 0 to trigger a read */
+
+ return true;
}
bool FlateEncoder::fillBuf()
diff --git a/poppler/FlateEncoder.h b/poppler/FlateEncoder.h
index e42dc4e2..bf1e2c31 100644
--- a/poppler/FlateEncoder.h
+++ b/poppler/FlateEncoder.h
@@ -43,7 +43,7 @@ public:
explicit FlateEncoder(Stream *strA);
~FlateEncoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override { return (outBufPtr >= outBufEnd && !fillBuf()) ? EOF : (*outBufPtr++ & 0xff); }
int lookChar() override { return (outBufPtr >= outBufEnd && !fillBuf()) ? EOF : (*outBufPtr & 0xff); }
GooString *getPSFilter(int psLevel, const char *indent) override { return nullptr; }
diff --git a/poppler/FlateStream.cc b/poppler/FlateStream.cc
index a97b687b..8df27fc7 100644
--- a/poppler/FlateStream.cc
+++ b/poppler/FlateStream.cc
@@ -42,7 +42,7 @@ FlateStream::~FlateStream()
delete str;
}
-void FlateStream::reset()
+bool FlateStream::reset()
{
// FIXME: what are the semantics of reset?
// i.e. how much initialization has to happen in the constructor?
@@ -57,6 +57,8 @@ void FlateStream::reset()
status = Z_OK;
out_pos = 0;
out_buf_len = 0;
+
+ return true;
}
int FlateStream::getRawChar()
diff --git a/poppler/FlateStream.h b/poppler/FlateStream.h
index 88f69bea..9a388ad7 100644
--- a/poppler/FlateStream.h
+++ b/poppler/FlateStream.h
@@ -38,7 +38,7 @@ public:
FlateStream(Stream *strA, int predictor, int columns, int colors, int bits);
virtual ~FlateStream();
StreamKind getKind() const override { return strFlate; }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override;
int getRawChar() override;
diff --git a/poppler/JBIG2Stream.cc b/poppler/JBIG2Stream.cc
index 0dffc111..47e9489b 100644
--- a/poppler/JBIG2Stream.cc
+++ b/poppler/JBIG2Stream.cc
@@ -1153,7 +1153,7 @@ JBIG2Stream::~JBIG2Stream()
delete str;
}
-void JBIG2Stream::reset()
+bool JBIG2Stream::reset()
{
segments.resize(0);
globalSegments.resize(0);
@@ -1185,6 +1185,8 @@ void JBIG2Stream::reset()
} else {
dataPtr = dataEnd = nullptr;
}
+
+ return true;
}
void JBIG2Stream::close()
diff --git a/poppler/JBIG2Stream.h b/poppler/JBIG2Stream.h
index af63a673..74f29534 100644
--- a/poppler/JBIG2Stream.h
+++ b/poppler/JBIG2Stream.h
@@ -48,7 +48,7 @@ public:
JBIG2Stream(Stream *strA, Object &&globalsStreamA, Object *globalsStreamRefA);
~JBIG2Stream() override;
StreamKind getKind() const override { return strJBIG2; }
- void reset() override;
+ bool reset() override;
void close() override;
Goffset getPos() override;
int getChar() override;
diff --git a/poppler/JPEG2000Stream.cc b/poppler/JPEG2000Stream.cc
index 67d28a8c..24b995e6 100644
--- a/poppler/JPEG2000Stream.cc
+++ b/poppler/JPEG2000Stream.cc
@@ -80,10 +80,12 @@ JPXStream::~JPXStream()
delete priv;
}
-void JPXStream::reset()
+bool JPXStream::reset()
{
priv->counter = 0;
priv->ccounter = 0;
+
+ return true;
}
void JPXStream::close()
diff --git a/poppler/JPEG2000Stream.h b/poppler/JPEG2000Stream.h
index 4aca117b..1ca6a48f 100644
--- a/poppler/JPEG2000Stream.h
+++ b/poppler/JPEG2000Stream.h
@@ -33,7 +33,7 @@ public:
JPXStream &operator=(const JPXStream &other) = delete;
StreamKind getKind() const override { return strJPX; }
- void reset() override;
+ bool reset() override;
void close() override;
Goffset getPos() override;
int getChar() override;
diff --git a/poppler/JPXStream.cc b/poppler/JPXStream.cc
index 51e24278..12b3e883 100644
--- a/poppler/JPXStream.cc
+++ b/poppler/JPXStream.cc
@@ -271,18 +271,22 @@ JPXStream::~JPXStream()
delete bufStr;
}
-void JPXStream::reset()
+bool JPXStream::reset()
{
+ bool ret = true;
bufStr->reset();
if (readBoxes()) {
curY = img.yOffset;
} else {
// readBoxes reported an error, so we go immediately to EOF
curY = img.ySize;
+ ret = false;
}
curX = img.xOffset;
curComp = 0;
readBufLen = 0;
+
+ return ret;
}
void JPXStream::close()
diff --git a/poppler/JPXStream.h b/poppler/JPXStream.h
index ed2d942e..f25fd82b 100644
--- a/poppler/JPXStream.h
+++ b/poppler/JPXStream.h
@@ -288,7 +288,7 @@ public:
JPXStream(Stream *strA);
virtual ~JPXStream();
StreamKind getKind() const override { return strJPX; }
- void reset() override;
+ bool reset() override;
void close() override;
int getChar() override;
int lookChar() override;
diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
index 3a06102f..1927395c 100644
--- a/poppler/PSOutputDev.cc
+++ b/poppler/PSOutputDev.cc
@@ -982,7 +982,7 @@ public:
DeviceNRecoder(Stream *strA, int widthA, int heightA, GfxImageColorMap *colorMapA);
~DeviceNRecoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override { return (bufIdx >= bufSize && !fillBuf()) ? EOF : buf[bufIdx++]; }
int lookChar() override { return (bufIdx >= bufSize && !fillBuf()) ? EOF : buf[bufIdx]; }
GooString *getPSFilter(int psLevel, const char *indent) override { return nullptr; }
@@ -1022,10 +1022,10 @@ DeviceNRecoder::~DeviceNRecoder()
}
}
-void DeviceNRecoder::reset()
+bool DeviceNRecoder::reset()
{
imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), colorMap->getBits());
- imgStr->reset();
+ return imgStr->reset();
}
bool DeviceNRecoder::fillBuf()
diff --git a/poppler/Stream.cc b/poppler/Stream.cc
index 8aee314d..4e3fd34d 100644
--- a/poppler/Stream.cc
+++ b/poppler/Stream.cc
@@ -238,7 +238,7 @@ public:
~BaseStreamStream() override;
StreamKind getKind() const override { return str->getBaseStream()->getKind(); }
- void reset() override { str->getBaseStream()->reset(); }
+ bool reset() override { return str->getBaseStream()->reset(); }
int getChar() override { return str->getBaseStream()->getChar(); }
int lookChar() override { return str->getBaseStream()->lookChar(); }
bool isBinary(bool last = true) const override { return str->getBaseStream()->isBinary(); }
@@ -482,13 +482,15 @@ BaseSeekInputStream::BaseSeekInputStream(Goffset startA, bool limitedA, Goffset
BaseSeekInputStream::~BaseSeekInputStream() = default;
-void BaseSeekInputStream::reset()
+bool BaseSeekInputStream::reset()
{
savePos = currentPos();
setCurrentPos(start);
saved = true;
bufPtr = bufEnd = buf;
bufPos = start;
+
+ return true;
}
void BaseSeekInputStream::close()
@@ -634,9 +636,9 @@ ImageStream::~ImageStream()
gfree(inputLine);
}
-void ImageStream::reset()
+bool ImageStream::reset()
{
- str->reset();
+ return str->reset();
}
void ImageStream::close()
@@ -957,13 +959,15 @@ Stream *FileStream::makeSubStream(Goffset startA, bool limitedA, Goffset lengthA
return new FileStream(file, startA, limitedA, lengthA, std::move(dictA));
}
-void FileStream::reset()
+bool FileStream::reset()
{
savePos = offset;
offset = start;
saved = true;
bufPtr = bufEnd = buf;
bufPos = start;
+
+ return true;
}
void FileStream::close()
@@ -1058,7 +1062,7 @@ Stream *CachedFileStream::makeSubStream(Goffset startA, bool limitedA, Goffset l
return new CachedFileStream(cc, startA, limitedA, lengthA, std::move(dictA));
}
-void CachedFileStream::reset()
+bool CachedFileStream::reset()
{
savePos = (unsigned int)cc->tell();
cc->seek(start, SEEK_SET);
@@ -1066,6 +1070,8 @@ void CachedFileStream::reset()
saved = true;
bufPtr = bufEnd = buf;
bufPos = start;
+
+ return true;
}
void CachedFileStream::close()
@@ -1172,7 +1178,7 @@ EmbedStream::~EmbedStream()
}
}
-void EmbedStream::reset()
+bool EmbedStream::reset()
{
if (str->getPos() != start) {
str->reset();
@@ -1189,6 +1195,8 @@ void EmbedStream::reset()
record = false;
replay = false;
bufPos = 0;
+
+ return true;
}
BaseStream *EmbedStream::copy()
@@ -1333,11 +1341,13 @@ ASCIIHexStream::~ASCIIHexStream()
delete str;
}
-void ASCIIHexStream::reset()
+bool ASCIIHexStream::reset()
{
str->reset();
buf = EOF;
eof = false;
+
+ return true;
}
int ASCIIHexStream::lookChar()
@@ -1429,11 +1439,13 @@ ASCII85Stream::~ASCII85Stream()
delete str;
}
-void ASCII85Stream::reset()
+bool ASCII85Stream::reset()
{
str->reset();
index = n = 0;
eof = false;
+
+ return true;
}
int ASCII85Stream::lookChar()
@@ -1603,12 +1615,14 @@ int LZWStream::getChars(int nChars, unsigned char *buffer)
return n;
}
-void LZWStream::reset()
+bool LZWStream::reset()
{
str->reset();
eof = false;
inputBits = 0;
clearTable();
+
+ return true;
}
bool LZWStream::processNextCode()
@@ -1744,11 +1758,13 @@ RunLengthStream::~RunLengthStream()
delete str;
}
-void RunLengthStream::reset()
+bool RunLengthStream::reset()
{
str->reset();
bufPtr = bufEnd = buf;
eof = false;
+
+ return true;
}
int RunLengthStream::getChars(int nChars, unsigned char *buffer)
@@ -1891,7 +1907,7 @@ void CCITTFaxStream::unfilteredReset()
ccittReset(true);
}
-void CCITTFaxStream::reset()
+bool CCITTFaxStream::reset()
{
int code1;
@@ -1917,6 +1933,8 @@ void CCITTFaxStream::reset()
nextLine2D = !lookBits(1);
eatBits(1);
}
+
+ return true;
}
inline void CCITTFaxStream::addPixels(int a1, int blackPixels)
@@ -2710,7 +2728,7 @@ void DCTStream::unfilteredReset()
dctReset(true);
}
-void DCTStream::reset()
+bool DCTStream::reset()
{
int i, j;
@@ -2718,7 +2736,7 @@ void DCTStream::reset()
if (!readHeader()) {
y = height;
- return;
+ return false;
}
// compute MCU size
@@ -2761,7 +2779,7 @@ void DCTStream::reset()
if (bufWidth <= 0 || bufHeight <= 0 || bufWidth > INT_MAX / bufWidth / (int)sizeof(int)) {
error(errSyntaxError, getPos(), "Invalid image size in DCT stream");
y = height;
- return;
+ return false;
}
for (i = 0; i < numComps; ++i) {
frameBuf[i] = (int *)gmallocn(bufWidth * bufHeight, sizeof(int));
@@ -2802,6 +2820,8 @@ void DCTStream::reset()
restartMarker = 0xd0;
restart();
}
+
+ return true;
}
void DCTStream::close()
@@ -4201,7 +4221,7 @@ void FlateStream::unfilteredReset()
flateReset(true);
}
-void FlateStream::reset()
+bool FlateStream::reset()
{
int cmf, flg;
@@ -4213,22 +4233,24 @@ void FlateStream::reset()
cmf = str->getChar();
flg = str->getChar();
if (cmf == EOF || flg == EOF) {
- return;
+ return false;
}
if ((cmf & 0x0f) != 0x08) {
error(errSyntaxError, getPos(), "Unknown compression method in flate stream");
- return;
+ return false;
}
if ((((cmf << 8) + flg) % 31) != 0) {
error(errSyntaxError, getPos(), "Bad FCHECK in flate stream");
- return;
+ return false;
}
if (flg & 0x20) {
error(errSyntaxError, getPos(), "FDICT bit set in flate stream");
- return;
+ return false;
}
eof = false;
+
+ return true;
}
int FlateStream::getChar()
@@ -4674,7 +4696,7 @@ BufStream::~BufStream()
delete str;
}
-void BufStream::reset()
+bool BufStream::reset()
{
int i;
@@ -4682,6 +4704,8 @@ void BufStream::reset()
for (i = 0; i < bufSize; ++i) {
buf[i] = str->getChar();
}
+
+ return true;
}
int BufStream::getChar()
@@ -4728,10 +4752,12 @@ FixedLengthEncoder::~FixedLengthEncoder()
}
}
-void FixedLengthEncoder::reset()
+bool FixedLengthEncoder::reset()
{
str->reset();
count = 0;
+
+ return true;
}
int FixedLengthEncoder::getChar()
@@ -4774,12 +4800,14 @@ ASCIIHexEncoder::~ASCIIHexEncoder()
}
}
-void ASCIIHexEncoder::reset()
+bool ASCIIHexEncoder::reset()
{
str->reset();
bufPtr = bufEnd = buf;
lineLen = 0;
eof = false;
+
+ return true;
}
bool ASCIIHexEncoder::fillBuf()
@@ -4824,12 +4852,14 @@ ASCII85Encoder::~ASCII85Encoder()
}
}
-void ASCII85Encoder::reset()
+bool ASCII85Encoder::reset()
{
str->reset();
bufPtr = bufEnd = buf;
lineLen = 0;
eof = false;
+
+ return true;
}
bool ASCII85Encoder::fillBuf()
@@ -4919,11 +4949,13 @@ RunLengthEncoder::~RunLengthEncoder()
}
}
-void RunLengthEncoder::reset()
+bool RunLengthEncoder::reset()
{
str->reset();
bufPtr = bufEnd = nextEnd = buf;
eof = false;
+
+ return true;
}
//
@@ -5031,7 +5063,7 @@ LZWEncoder::~LZWEncoder()
}
}
-void LZWEncoder::reset()
+bool LZWEncoder::reset()
{
int i;
@@ -5053,6 +5085,8 @@ void LZWEncoder::reset()
outBuf = 256;
outBufLen = 9;
needEOD = false;
+
+ return true;
}
int LZWEncoder::getChar()
@@ -5180,11 +5214,13 @@ CMYKGrayEncoder::~CMYKGrayEncoder()
}
}
-void CMYKGrayEncoder::reset()
+bool CMYKGrayEncoder::reset()
{
str->reset();
bufPtr = bufEnd = buf;
eof = false;
+
+ return true;
}
bool CMYKGrayEncoder::fillBuf()
@@ -5229,11 +5265,13 @@ RGBGrayEncoder::~RGBGrayEncoder()
}
}
-void RGBGrayEncoder::reset()
+bool RGBGrayEncoder::reset()
{
str->reset();
bufPtr = bufEnd = buf;
eof = false;
+
+ return true;
}
bool RGBGrayEncoder::fillBuf()
@@ -5275,10 +5313,12 @@ SplashBitmapCMYKEncoder::SplashBitmapCMYKEncoder(SplashBitmap *bitmapA) : bitmap
SplashBitmapCMYKEncoder::~SplashBitmapCMYKEncoder() = default;
-void SplashBitmapCMYKEncoder::reset()
+bool SplashBitmapCMYKEncoder::reset()
{
bufPtr = width;
curLine = height - 1;
+
+ return true;
}
int SplashBitmapCMYKEncoder::lookChar()
diff --git a/poppler/Stream.h b/poppler/Stream.h
index 353b2e25..1ccbaa08 100644
--- a/poppler/Stream.h
+++ b/poppler/Stream.h
@@ -125,8 +125,8 @@ public:
// Get kind of stream.
virtual StreamKind getKind() const = 0;
- // Reset stream to beginning.
- virtual void reset() = 0;
+ // Reset stream to beginning. Returns 'false' if stream was found to be invalid, 'true' otherwise.
+ virtual bool reset() = 0;
// Close down the stream.
virtual void close();
@@ -385,7 +385,7 @@ public:
BaseSeekInputStream(Goffset startA, bool limitedA, Goffset lengthA, Object &&dictA);
~BaseSeekInputStream() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
void close() override;
int getChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
int lookChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
@@ -465,7 +465,7 @@ public:
ImageStream &operator=(const ImageStream &other) = delete;
// Reset the stream.
- void reset();
+ bool reset();
// Close the stream previously reset
void close();
@@ -545,7 +545,7 @@ public:
BaseStream *copy() override;
Stream *makeSubStream(Goffset startA, bool limitedA, Goffset lengthA, Object &&dictA) override;
StreamKind getKind() const override { return strFile; }
- void reset() override;
+ bool reset() override;
void close() override;
int getChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
int lookChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
@@ -614,7 +614,7 @@ public:
BaseStream *copy() override;
Stream *makeSubStream(Goffset startA, bool limitedA, Goffset lengthA, Object &&dictA) override;
StreamKind getKind() const override { return strCachedFile; }
- void reset() override;
+ bool reset() override;
void close() override;
int getChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
int lookChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
@@ -673,7 +673,11 @@ public:
StreamKind getKind() const override { return strWeird; }
- void reset() override { bufPtr = buf + start; }
+ bool reset() override
+ {
+ bufPtr = buf + start;
+ return true;
+ }
void close() override { }
@@ -784,7 +788,7 @@ public:
BaseStream *copy() override;
Stream *makeSubStream(Goffset start, bool limitedA, Goffset lengthA, Object &&dictA) override;
StreamKind getKind() const override { return str->getKind(); }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override;
Goffset getPos() override;
@@ -824,7 +828,7 @@ public:
explicit ASCIIHexStream(Stream *strA);
~ASCIIHexStream() override;
StreamKind getKind() const override { return strASCIIHex; }
- void reset() override;
+ bool reset() override;
int getChar() override
{
int c = lookChar();
@@ -850,7 +854,7 @@ public:
explicit ASCII85Stream(Stream *strA);
~ASCII85Stream() override;
StreamKind getKind() const override { return strASCII85; }
- void reset() override;
+ bool reset() override;
int getChar() override
{
int ch = lookChar();
@@ -878,7 +882,7 @@ public:
LZWStream(Stream *strA, int predictor, int columns, int colors, int bits, int earlyA);
~LZWStream() override;
StreamKind getKind() const override { return strLZW; }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override;
int getRawChar() override;
@@ -938,7 +942,7 @@ public:
explicit RunLengthStream(Stream *strA);
~RunLengthStream() override;
StreamKind getKind() const override { return strRunLength; }
- void reset() override;
+ bool reset() override;
int getChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
int lookChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
GooString *getPSFilter(int psLevel, const char *indent) override;
@@ -968,7 +972,7 @@ public:
CCITTFaxStream(Stream *strA, int encodingA, bool endOfLineA, bool byteAlignA, int columnsA, int rowsA, bool endOfBlockA, bool blackA, int damagedRowsBeforeErrorA);
~CCITTFaxStream() override;
StreamKind getKind() const override { return strCCITTFax; }
- void reset() override;
+ bool reset() override;
int getChar() override
{
int c = lookChar();
@@ -1065,7 +1069,7 @@ public:
DCTStream(Stream *strA, int colorXformA, Dict *dict, int recursion);
~DCTStream() override;
StreamKind getKind() const override { return strDCT; }
- void reset() override;
+ bool reset() override;
void close() override;
int getChar() override;
int lookChar() override;
@@ -1169,7 +1173,7 @@ public:
FlateStream(Stream *strA, int predictor, int columns, int colors, int bits);
~FlateStream() override;
StreamKind getKind() const override { return strFlate; }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override;
int getRawChar() override;
@@ -1245,7 +1249,7 @@ public:
explicit EOFStream(Stream *strA);
~EOFStream() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override { }
+ bool reset() override { return true; }
int getChar() override { return EOF; }
int lookChar() override { return EOF; }
GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) override { return nullptr; }
@@ -1262,7 +1266,7 @@ public:
BufStream(Stream *strA, int bufSizeA);
~BufStream() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override;
GooString *getPSFilter(int psLevel, const char *indent) override { return nullptr; }
@@ -1285,7 +1289,7 @@ public:
FixedLengthEncoder(Stream *strA, int lengthA);
~FixedLengthEncoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override;
GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) override { return nullptr; }
@@ -1307,7 +1311,7 @@ public:
explicit ASCIIHexEncoder(Stream *strA);
~ASCIIHexEncoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
int lookChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) override { return nullptr; }
@@ -1334,7 +1338,7 @@ public:
explicit ASCII85Encoder(Stream *strA);
~ASCII85Encoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
int lookChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) override { return nullptr; }
@@ -1361,7 +1365,7 @@ public:
explicit RunLengthEncoder(Stream *strA);
~RunLengthEncoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
int lookChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) override { return nullptr; }
@@ -1395,7 +1399,7 @@ public:
explicit LZWEncoder(Stream *strA);
~LZWEncoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override;
GooString *getPSFilter(int psLevel, const char *indent) override { return nullptr; }
@@ -1425,7 +1429,7 @@ public:
explicit CMYKGrayEncoder(Stream *strA);
~CMYKGrayEncoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
int lookChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) override { return nullptr; }
@@ -1451,7 +1455,7 @@ public:
explicit RGBGrayEncoder(Stream *strA);
~RGBGrayEncoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
int lookChar() override { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) override { return nullptr; }
@@ -1480,7 +1484,7 @@ public:
explicit SplashBitmapCMYKEncoder(SplashBitmap *bitmapA);
~SplashBitmapCMYKEncoder() override;
StreamKind getKind() const override { return strWeird; }
- void reset() override;
+ bool reset() override;
int getChar() override;
int lookChar() override;
GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) override { return nullptr; }