Commit 1bde5c68a302c99c627f86d8c95226a8a7623ac3

Authored by Jay Berkenbilt
1 parent 658b5bb3

Add QUtil::read_file_into_memory

This code was essentially duplicated between test_driver and
standalone_fuzz_target_runner.
ChangeLog
  1 +2019-06-22 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Add new function QUtil::read_file_into_memory.
  4 +
1 5 2019-06-21 Jay Berkenbilt <ejb@ql.org>
2 6  
3 7 * When supported, qpdf builds with -fvisibility=hidden, which
... ...
fuzz/standalone_fuzz_target_runner.cc
1 1 #include <qpdf/QUtil.hh>
2   -#include <qpdf/PointerHolder.hh>
3   -#include <qpdf/QIntC.hh>
4 2 #include <iostream>
5 3 #include <string>
6 4  
7 5 extern "C" int LLVMFuzzerTestOneInput(unsigned char const* data, size_t size);
8 6  
9   -static void read_file_into_memory(
10   - char const* filename,
11   - PointerHolder<unsigned char>& file_buf, size_t& size)
12   -{
13   - FILE* f = QUtil::safe_fopen(filename, "rb");
14   - fseek(f, 0, SEEK_END);
15   - size = QIntC::to_size(QUtil::tell(f));
16   - fseek(f, 0, SEEK_SET);
17   - file_buf = PointerHolder<unsigned char>(true, new unsigned char[size]);
18   - unsigned char* buf_p = file_buf.getPointer();
19   - size_t bytes_read = 0;
20   - size_t len = 0;
21   - while ((len = fread(buf_p + bytes_read, 1, size - bytes_read, f)) > 0)
22   - {
23   - bytes_read += len;
24   - }
25   - if (bytes_read != size)
26   - {
27   - throw std::runtime_error(
28   - std::string("failure reading file ") + filename +
29   - " into memory: read " +
30   - QUtil::uint_to_string(bytes_read) + "; wanted " +
31   - QUtil::uint_to_string(size));
32   - }
33   - fclose(f);
34   -}
35   -
36 7 int main(int argc, char **argv)
37 8 {
38 9 for (int i = 1; i < argc; i++)
39 10 {
40   - PointerHolder<unsigned char> file_buf;
  11 + PointerHolder<char> file_buf;
41 12 size_t size = 0;
42   - read_file_into_memory(argv[i], file_buf, size);
43   - LLVMFuzzerTestOneInput(file_buf.getPointer(), size);
  13 + QUtil::read_file_into_memory(argv[i], file_buf, size);
  14 + LLVMFuzzerTestOneInput(
  15 + reinterpret_cast<unsigned char*>(file_buf.getPointer()), size);
44 16 std::cout << argv[i] << " successful" << std::endl;
45 17 }
46 18 return 0;
... ...
include/qpdf/QUtil.hh
... ... @@ -24,6 +24,7 @@
24 24  
25 25 #include <qpdf/DLL.h>
26 26 #include <qpdf/Types.h>
  27 +#include <qpdf/PointerHolder.hh>
27 28 #include <string>
28 29 #include <list>
29 30 #include <vector>
... ... @@ -304,6 +305,9 @@ namespace QUtil
304 305 std::list<std::string> read_lines_from_file(char const* filename);
305 306 QPDF_DLL
306 307 std::list<std::string> read_lines_from_file(std::istream&);
  308 + QPDF_DLL
  309 + void read_file_into_memory(
  310 + char const* filename, PointerHolder<char>& file_buf, size_t& size);
307 311  
308 312 // This used to be called strcasecmp, but that is a macro on some
309 313 // platforms, so we have to give it a name that is not likely to
... ...
libqpdf/QUtil.cc
... ... @@ -957,6 +957,45 @@ QUtil::read_lines_from_file(char const* filename)
957 957 return lines;
958 958 }
959 959  
  960 +void
  961 +QUtil::read_file_into_memory(
  962 + char const* filename,
  963 + PointerHolder<char>& file_buf, size_t& size)
  964 +{
  965 + FILE* f = safe_fopen(filename, "rb");
  966 + fseek(f, 0, SEEK_END);
  967 + size = QIntC::to_size(QUtil::tell(f));
  968 + fseek(f, 0, SEEK_SET);
  969 + file_buf = PointerHolder<char>(true, new char[size]);
  970 + char* buf_p = file_buf.getPointer();
  971 + size_t bytes_read = 0;
  972 + size_t len = 0;
  973 + while ((len = fread(buf_p + bytes_read, 1, size - bytes_read, f)) > 0)
  974 + {
  975 + bytes_read += len;
  976 + }
  977 + if (bytes_read != size)
  978 + {
  979 + if (ferror(f))
  980 + {
  981 + throw std::runtime_error(
  982 + std::string("failure reading file ") + filename +
  983 + " into memory: read " +
  984 + uint_to_string(bytes_read) + "; wanted " +
  985 + uint_to_string(size));
  986 + }
  987 + else
  988 + {
  989 + throw std::runtime_error(
  990 + std::string("premature eof reading file ") + filename +
  991 + " into memory: read " +
  992 + uint_to_string(bytes_read) + "; wanted " +
  993 + uint_to_string(size));
  994 + }
  995 + }
  996 + fclose(f);
  997 +}
  998 +
960 999 std::list<std::string>
961 1000 QUtil::read_lines_from_file(std::istream& in)
962 1001 {
... ...
libtests/qtest/qutil/qutil.out
... ... @@ -91,10 +91,11 @@ file1: -qutil.out-, file2: -other-file-; same: 0: PASS
91 91 file1: -qutil.out-, file2: --; same: 0: PASS
92 92 file1: -qutil.out-, file2: -(null)-; same: 0: PASS
93 93 file1: --, file2: -qutil.out-; same: 0: PASS
94   ----- lines from file
  94 +---- read from file
95 95 This file is used for qutil testing.
96 96 It has mixed newlines.
97 97 Some lines are very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long.
  98 +read 24652 bytes
98 99 ---- hex encode/decode
99 100 begin hex encode/decode
100 101 end hex encode/decode
... ...
libtests/qutil.cc
... ... @@ -400,7 +400,7 @@ void same_file_test()
400 400 assert_same_file("", "qutil.out", false);
401 401 }
402 402  
403   -void read_lines_from_file_test()
  403 +void read_from_file_test()
404 404 {
405 405 std::list<std::string> lines = QUtil::read_lines_from_file("other-file");
406 406 for (std::list<std::string>::iterator iter = lines.begin();
... ... @@ -408,6 +408,15 @@ void read_lines_from_file_test()
408 408 {
409 409 std::cout << *iter << std::endl;
410 410 }
  411 + PointerHolder<char> buf;
  412 + size_t size = 0;
  413 + QUtil::read_file_into_memory("other-file", buf, size);
  414 + std::cout << "read " << size << " bytes" << std::endl;
  415 + char const* p = buf.getPointer();
  416 + assert(size == 24652);
  417 + assert(memcmp(p, "This file is used for qutil testing.", 36) == 0);
  418 + assert(p[59] == static_cast<char>(13));
  419 + assert(memcmp(p + 24641, "very long.", 10) == 0);
411 420 }
412 421  
413 422 void assert_hex_encode(std::string const& input, std::string const& expected)
... ... @@ -472,8 +481,8 @@ int main(int argc, char* argv[])
472 481 get_whoami_test();
473 482 std::cout << "---- file" << std::endl;
474 483 same_file_test();
475   - std::cout << "---- lines from file" << std::endl;
476   - read_lines_from_file_test();
  484 + std::cout << "---- read from file" << std::endl;
  485 + read_from_file_test();
477 486 std::cout << "---- hex encode/decode" << std::endl;
478 487 hex_encode_decode_test();
479 488 }
... ...
qpdf/test_driver.cc
... ... @@ -168,44 +168,6 @@ static void print_rect(std::ostream&amp; out,
168 168 << r.urx << ", " << r.ury << "]";
169 169 }
170 170  
171   -static void read_file_into_memory(
172   - char const* filename,
173   - PointerHolder<char>& file_buf, size_t& size)
174   -{
175   - FILE* f = QUtil::safe_fopen(filename, "rb");
176   - fseek(f, 0, SEEK_END);
177   - size = QIntC::to_size(QUtil::tell(f));
178   - fseek(f, 0, SEEK_SET);
179   - file_buf = PointerHolder<char>(true, new char[size]);
180   - char* buf_p = file_buf.getPointer();
181   - size_t bytes_read = 0;
182   - size_t len = 0;
183   - while ((len = fread(buf_p + bytes_read, 1, size - bytes_read, f)) > 0)
184   - {
185   - bytes_read += len;
186   - }
187   - if (bytes_read != size)
188   - {
189   - if (ferror(f))
190   - {
191   - throw std::runtime_error(
192   - std::string("failure reading file ") + filename +
193   - " into memory: read " +
194   - QUtil::uint_to_string(bytes_read) + "; wanted " +
195   - QUtil::uint_to_string(size));
196   - }
197   - else
198   - {
199   - throw std::logic_error(
200   - std::string("premature eof reading file ") + filename +
201   - " into memory: read " +
202   - QUtil::uint_to_string(bytes_read) + "; wanted " +
203   - QUtil::uint_to_string(size));
204   - }
205   - }
206   - fclose(f);
207   -}
208   -
209 171 #define assert_compare_numbers(expected, expr) \
210 172 compare_numbers(#expr, expected, expr)
211 173  
... ... @@ -277,7 +239,7 @@ void runtest(int n, char const* filename1, char const* arg2)
277 239  
278 240 std::string filename(std::string(filename1) + ".obfuscated");
279 241 size_t size = 0;
280   - read_file_into_memory(filename.c_str(), file_buf, size);
  242 + QUtil::read_file_into_memory(filename.c_str(), file_buf, size);
281 243 char* p = file_buf.getPointer();
282 244 for (size_t i = 0; i < size; ++i)
283 245 {
... ... @@ -308,7 +270,7 @@ void runtest(int n, char const* filename1, char const* arg2)
308 270 {
309 271 QTC::TC("qpdf", "exercise processMemoryFile");
310 272 size_t size = 0;
311   - read_file_into_memory(filename1, file_buf, size);
  273 + QUtil::read_file_into_memory(filename1, file_buf, size);
312 274 pdf.processMemoryFile(filename1, file_buf.getPointer(), size);
313 275 }
314 276  
... ...