diff options
author | Nelson Benítez León <nbenitezl@gmail.com> | 2025-01-05 21:33:23 +0000 |
---|---|---|
committer | Albert Astals Cid <aacid@kde.org> | 2025-01-05 21:33:23 +0000 |
commit | 5d71c95d08aa0e097f711254e1c69ee0cf275328 (patch) | |
tree | 4ea7e98f321250a09afe863369eca7d5cf721c03 | |
parent | 3ead1238555ce14dd0c619f1097d552307e6e40a (diff) |
Detect malformed Streams in Annot Appearances
-rw-r--r-- | poppler/Annot.cc | 5 | ||||
-rw-r--r-- | poppler/DCTStream.cc | 6 | ||||
-rw-r--r-- | poppler/DCTStream.h | 2 | ||||
-rw-r--r-- | poppler/Decrypt.cc | 12 | ||||
-rw-r--r-- | poppler/Decrypt.h | 6 | ||||
-rw-r--r-- | poppler/FlateEncoder.cc | 5 | ||||
-rw-r--r-- | poppler/FlateEncoder.h | 2 | ||||
-rw-r--r-- | poppler/FlateStream.cc | 4 | ||||
-rw-r--r-- | poppler/FlateStream.h | 2 | ||||
-rw-r--r-- | poppler/JBIG2Stream.cc | 4 | ||||
-rw-r--r-- | poppler/JBIG2Stream.h | 2 | ||||
-rw-r--r-- | poppler/JPEG2000Stream.cc | 4 | ||||
-rw-r--r-- | poppler/JPEG2000Stream.h | 2 | ||||
-rw-r--r-- | poppler/JPXStream.cc | 6 | ||||
-rw-r--r-- | poppler/JPXStream.h | 2 | ||||
-rw-r--r-- | poppler/PSOutputDev.cc | 6 | ||||
-rw-r--r-- | poppler/Stream.cc | 98 | ||||
-rw-r--r-- | poppler/Stream.h | 54 |
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; } |