From 7b9f23a99a1ea3e97eaecf80ef29e2805e351b8f Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 3 Mar 2018 11:35:01 -0500 Subject: [PATCH] Ignore zlib data check errors (fixes #191) --- ChangeLog | 6 ++++++ libqpdf/Pl_Flate.cc | 12 +++++++++++- qpdf/qtest/qpdf/issue-106.out | 2 -- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index fb1fea17..0bb24590 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2018-03-03 Jay Berkenbilt + + * Ignore zlib data check errors while uncompressing streams. This + is consistent with behaviors of other readers and enables handling + of some incorrectly written zlib strems. Fixes #191. + 2018-02-25 Jay Berkenbilt * 8.0.0: release diff --git a/libqpdf/Pl_Flate.cc b/libqpdf/Pl_Flate.cc index 212f7e1d..3becc135 100644 --- a/libqpdf/Pl_Flate.cc +++ b/libqpdf/Pl_Flate.cc @@ -1,5 +1,6 @@ #include #include +#include #include @@ -71,7 +72,8 @@ Pl_Flate::write(unsigned char* data, size_t len) while (bytes_left > 0) { size_t bytes = (bytes_left >= max_bytes ? max_bytes : bytes_left); - handleData(buf, bytes, Z_NO_FLUSH); + handleData(buf, bytes, + (action == a_inflate ? Z_SYNC_FLUSH : Z_NO_FLUSH)); bytes_left -= bytes; buf += bytes; } @@ -125,6 +127,14 @@ Pl_Flate::handleData(unsigned char* data, int len, int flush) { err = inflate(&zstream, flush); } + if ((action == a_inflate) && (err != Z_OK) && zstream.msg && + (strcmp(zstream.msg, "incorrect data check") == 0)) + { + // Other PDF readers ignore this specific error. Combining + // this with Z_SYNC_FLUSH enables qpdf to handle some + // broken zlib streams without losing data. + err = Z_STREAM_END; + } switch (err) { case Z_BUF_ERROR: diff --git a/qpdf/qtest/qpdf/issue-106.out b/qpdf/qtest/qpdf/issue-106.out index 4af06209..477db429 100644 --- a/qpdf/qtest/qpdf/issue-106.out +++ b/qpdf/qtest/qpdf/issue-106.out @@ -1,6 +1,4 @@ WARNING: issue-106.pdf: file is damaged WARNING: issue-106.pdf (offset 809): xref not found WARNING: issue-106.pdf: Attempting to reconstruct cross-reference table -WARNING: issue-106.pdf (offset 965): error decoding stream data for object 8 0: stream inflate: inflate: data: incorrect data check -WARNING: issue-106.pdf (offset 965): stream will be re-processed without filtering to avoid data loss qpdf: operation succeeded with warnings; resulting file may have some problems