Commit 8ae3ef28ac34fddb1cc8b03b2479f499e4af5f8a

Authored by m-holger
1 parent 3d569e21

Fix #1170

In QPDF::read_xrefEntry add buffer overflow test for first eol character.
Overlong f1 or f2 entries consisting only of zeros could cause a buffer
overflow.

Add fuzz testcase 69913.
fuzz/CMakeLists.txt
@@ -119,6 +119,7 @@ set(CORPUS_OTHER @@ -119,6 +119,7 @@ set(CORPUS_OTHER
119 68668.fuzz 119 68668.fuzz
120 68915.fuzz 120 68915.fuzz
121 69857.fuzz 121 69857.fuzz
  122 + 69913.fuzz
122 ) 123 )
123 124
124 set(CORPUS_DIR ${CMAKE_CURRENT_BINARY_DIR}/qpdf_corpus) 125 set(CORPUS_DIR ${CMAKE_CURRENT_BINARY_DIR}/qpdf_corpus)
fuzz/qpdf_extra/69913.fuzz 0 → 100644
No preview for this file type
fuzz/qtest/fuzz.test
@@ -21,7 +21,7 @@ my @fuzzers = ( @@ -21,7 +21,7 @@ my @fuzzers = (
21 ['pngpredictor' => 1], 21 ['pngpredictor' => 1],
22 ['runlength' => 6], 22 ['runlength' => 6],
23 ['tiffpredictor' => 2], 23 ['tiffpredictor' => 2],
24 - ['qpdf' => 61], # increment when adding new files 24 + ['qpdf' => 62], # increment when adding new files
25 ); 25 );
26 26
27 my $n_tests = 0; 27 my $n_tests = 0;
libqpdf/QPDF.cc
@@ -905,9 +905,8 @@ QPDF::read_xrefEntry(qpdf_offset_t& f1, int& f2, char& type) @@ -905,9 +905,8 @@ QPDF::read_xrefEntry(qpdf_offset_t& f1, int& f2, char& type)
905 if (QUtil::is_space(*p++) && (*p == 'f' || *p == 'n')) { 905 if (QUtil::is_space(*p++) && (*p == 'f' || *p == 'n')) {
906 // C++20: [[likely]] 906 // C++20: [[likely]]
907 type = *p; 907 type = *p;
908 - ++p;  
909 - ++p; // No test for valid line[19].  
910 - if ((*p == '\n' || *p == '\r') && f1_len == 10 && f2_len == 5) { 908 + // No test for valid line[19].
  909 + if (*(++p) && *(++p) && (*p == '\n' || *p == '\r') && f1_len == 10 && f2_len == 5) {
911 // C++20: [[likely]] 910 // C++20: [[likely]]
912 return true; 911 return true;
913 } 912 }