aboutsummaryrefslogtreecommitdiffstats
path: root/zlib-flate
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-11-02 22:54:10 +0100
committerJay Berkenbilt <ejb@ql.org>2021-11-03 14:43:17 +0100
commit532a4f3d60f6981b22beb32e6ff688ec41f87e26 (patch)
tree73800f3a6da80171152df8c9236ce390bcd581f4 /zlib-flate
parentc491d9f6af8dd2ecfbc5bd70b2054e03ac2521ac (diff)
downloadqpdf-532a4f3d60f6981b22beb32e6ff688ec41f87e26.tar.zst
Detect recoverable but invalid zlib data streams (fixes #562)
Diffstat (limited to 'zlib-flate')
-rw-r--r--zlib-flate/qtest/missing-z-finish.in2
-rw-r--r--zlib-flate/qtest/zf.test9
-rw-r--r--zlib-flate/zlib-flate.cc12
3 files changed, 21 insertions, 2 deletions
diff --git a/zlib-flate/qtest/missing-z-finish.in b/zlib-flate/qtest/missing-z-finish.in
new file mode 100644
index 00000000..848c9c5c
--- /dev/null
+++ b/zlib-flate/qtest/missing-z-finish.in
@@ -0,0 +1,2 @@
+xڻ⻈Qţr#U?0&I%dJIYҒy!ԢTC=c=%Iiy龮A>iy%0vRz^gprz^ k'eZXY&4L*Iϴ0105400K*) 02475NMLu rM*N4202i3614252060I%EFf& Nr[kRr>I)Iə
+A~VaΞVVnAVFQF~^cON&@ye!>_3եcyj*NݸwI7KQc䵅q [s \ No newline at end of file
diff --git a/zlib-flate/qtest/zf.test b/zlib-flate/qtest/zf.test
index 2b188eb2..2f89ff54 100644
--- a/zlib-flate/qtest/zf.test
+++ b/zlib-flate/qtest/zf.test
@@ -29,4 +29,11 @@ $td->runtest("error",
$td->EXIT_STATUS => 2},
$td->NORMALIZE_NEWLINES);
-$td->report(7);
+$td->runtest("corrupted input",
+ {$td->COMMAND => "zlib-flate -uncompress < missing-z-finish.in"},
+ {$td->REGEXP =>
+ "input stream is complete but output may still be valid",
+ $td->EXIT_STATUS => 3},
+ $td->NORMALIZE_NEWLINES);
+
+$td->report(8);
diff --git a/zlib-flate/zlib-flate.cc b/zlib-flate/zlib-flate.cc
index 4d65bcc3..ae0fa4e1 100644
--- a/zlib-flate/zlib-flate.cc
+++ b/zlib-flate/zlib-flate.cc
@@ -76,6 +76,12 @@ int main(int argc, char* argv[])
PointerHolder<Pl_StdioFile> out = new Pl_StdioFile("stdout", stdout);
PointerHolder<Pl_Flate> flate =
new Pl_Flate("flate", out.getPointer(), action);
+ bool warn = false;
+ flate->setWarnCallback([&warn](char const* msg, int code) {
+ warn = true;
+ std::cerr << whoami << ": WARNING: zlib code " << code
+ << ", msg = " << msg << std::endl;
+ });
try
{
@@ -97,9 +103,13 @@ int main(int argc, char* argv[])
}
catch (std::exception& e)
{
- std::cerr << e.what() << std::endl;
+ std::cerr << whoami << ": " << e.what() << std::endl;
exit(2);
}
+ if (warn)
+ {
+ exit(3);
+ }
return 0;
}