mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 10:58:58 +00:00
Add QUtil::read_file_into_memory
This code was essentially duplicated between test_driver and standalone_fuzz_target_runner.
This commit is contained in:
parent
658b5bb3be
commit
1bde5c68a3
@ -1,3 +1,7 @@
|
|||||||
|
2019-06-22 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
|
* Add new function QUtil::read_file_into_memory.
|
||||||
|
|
||||||
2019-06-21 Jay Berkenbilt <ejb@ql.org>
|
2019-06-21 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
* When supported, qpdf builds with -fvisibility=hidden, which
|
* When supported, qpdf builds with -fvisibility=hidden, which
|
||||||
|
@ -1,46 +1,18 @@
|
|||||||
#include <qpdf/QUtil.hh>
|
#include <qpdf/QUtil.hh>
|
||||||
#include <qpdf/PointerHolder.hh>
|
|
||||||
#include <qpdf/QIntC.hh>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
extern "C" int LLVMFuzzerTestOneInput(unsigned char const* data, size_t size);
|
extern "C" int LLVMFuzzerTestOneInput(unsigned char const* data, size_t size);
|
||||||
|
|
||||||
static void read_file_into_memory(
|
|
||||||
char const* filename,
|
|
||||||
PointerHolder<unsigned char>& file_buf, size_t& size)
|
|
||||||
{
|
|
||||||
FILE* f = QUtil::safe_fopen(filename, "rb");
|
|
||||||
fseek(f, 0, SEEK_END);
|
|
||||||
size = QIntC::to_size(QUtil::tell(f));
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
file_buf = PointerHolder<unsigned char>(true, new unsigned char[size]);
|
|
||||||
unsigned char* buf_p = file_buf.getPointer();
|
|
||||||
size_t bytes_read = 0;
|
|
||||||
size_t len = 0;
|
|
||||||
while ((len = fread(buf_p + bytes_read, 1, size - bytes_read, f)) > 0)
|
|
||||||
{
|
|
||||||
bytes_read += len;
|
|
||||||
}
|
|
||||||
if (bytes_read != size)
|
|
||||||
{
|
|
||||||
throw std::runtime_error(
|
|
||||||
std::string("failure reading file ") + filename +
|
|
||||||
" into memory: read " +
|
|
||||||
QUtil::uint_to_string(bytes_read) + "; wanted " +
|
|
||||||
QUtil::uint_to_string(size));
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
for (int i = 1; i < argc; i++)
|
for (int i = 1; i < argc; i++)
|
||||||
{
|
{
|
||||||
PointerHolder<unsigned char> file_buf;
|
PointerHolder<char> file_buf;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
read_file_into_memory(argv[i], file_buf, size);
|
QUtil::read_file_into_memory(argv[i], file_buf, size);
|
||||||
LLVMFuzzerTestOneInput(file_buf.getPointer(), size);
|
LLVMFuzzerTestOneInput(
|
||||||
|
reinterpret_cast<unsigned char*>(file_buf.getPointer()), size);
|
||||||
std::cout << argv[i] << " successful" << std::endl;
|
std::cout << argv[i] << " successful" << std::endl;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include <qpdf/DLL.h>
|
#include <qpdf/DLL.h>
|
||||||
#include <qpdf/Types.h>
|
#include <qpdf/Types.h>
|
||||||
|
#include <qpdf/PointerHolder.hh>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -304,6 +305,9 @@ namespace QUtil
|
|||||||
std::list<std::string> read_lines_from_file(char const* filename);
|
std::list<std::string> read_lines_from_file(char const* filename);
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
std::list<std::string> read_lines_from_file(std::istream&);
|
std::list<std::string> read_lines_from_file(std::istream&);
|
||||||
|
QPDF_DLL
|
||||||
|
void read_file_into_memory(
|
||||||
|
char const* filename, PointerHolder<char>& file_buf, size_t& size);
|
||||||
|
|
||||||
// This used to be called strcasecmp, but that is a macro on some
|
// This used to be called strcasecmp, but that is a macro on some
|
||||||
// platforms, so we have to give it a name that is not likely to
|
// platforms, so we have to give it a name that is not likely to
|
||||||
|
@ -957,6 +957,45 @@ QUtil::read_lines_from_file(char const* filename)
|
|||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
QUtil::read_file_into_memory(
|
||||||
|
char const* filename,
|
||||||
|
PointerHolder<char>& file_buf, size_t& size)
|
||||||
|
{
|
||||||
|
FILE* f = safe_fopen(filename, "rb");
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
size = QIntC::to_size(QUtil::tell(f));
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
file_buf = PointerHolder<char>(true, new char[size]);
|
||||||
|
char* buf_p = file_buf.getPointer();
|
||||||
|
size_t bytes_read = 0;
|
||||||
|
size_t len = 0;
|
||||||
|
while ((len = fread(buf_p + bytes_read, 1, size - bytes_read, f)) > 0)
|
||||||
|
{
|
||||||
|
bytes_read += len;
|
||||||
|
}
|
||||||
|
if (bytes_read != size)
|
||||||
|
{
|
||||||
|
if (ferror(f))
|
||||||
|
{
|
||||||
|
throw std::runtime_error(
|
||||||
|
std::string("failure reading file ") + filename +
|
||||||
|
" into memory: read " +
|
||||||
|
uint_to_string(bytes_read) + "; wanted " +
|
||||||
|
uint_to_string(size));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw std::runtime_error(
|
||||||
|
std::string("premature eof reading file ") + filename +
|
||||||
|
" into memory: read " +
|
||||||
|
uint_to_string(bytes_read) + "; wanted " +
|
||||||
|
uint_to_string(size));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
|
||||||
std::list<std::string>
|
std::list<std::string>
|
||||||
QUtil::read_lines_from_file(std::istream& in)
|
QUtil::read_lines_from_file(std::istream& in)
|
||||||
{
|
{
|
||||||
|
File diff suppressed because one or more lines are too long
@ -400,7 +400,7 @@ void same_file_test()
|
|||||||
assert_same_file("", "qutil.out", false);
|
assert_same_file("", "qutil.out", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void read_lines_from_file_test()
|
void read_from_file_test()
|
||||||
{
|
{
|
||||||
std::list<std::string> lines = QUtil::read_lines_from_file("other-file");
|
std::list<std::string> lines = QUtil::read_lines_from_file("other-file");
|
||||||
for (std::list<std::string>::iterator iter = lines.begin();
|
for (std::list<std::string>::iterator iter = lines.begin();
|
||||||
@ -408,6 +408,15 @@ void read_lines_from_file_test()
|
|||||||
{
|
{
|
||||||
std::cout << *iter << std::endl;
|
std::cout << *iter << std::endl;
|
||||||
}
|
}
|
||||||
|
PointerHolder<char> buf;
|
||||||
|
size_t size = 0;
|
||||||
|
QUtil::read_file_into_memory("other-file", buf, size);
|
||||||
|
std::cout << "read " << size << " bytes" << std::endl;
|
||||||
|
char const* p = buf.getPointer();
|
||||||
|
assert(size == 24652);
|
||||||
|
assert(memcmp(p, "This file is used for qutil testing.", 36) == 0);
|
||||||
|
assert(p[59] == static_cast<char>(13));
|
||||||
|
assert(memcmp(p + 24641, "very long.", 10) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void assert_hex_encode(std::string const& input, std::string const& expected)
|
void assert_hex_encode(std::string const& input, std::string const& expected)
|
||||||
@ -472,8 +481,8 @@ int main(int argc, char* argv[])
|
|||||||
get_whoami_test();
|
get_whoami_test();
|
||||||
std::cout << "---- file" << std::endl;
|
std::cout << "---- file" << std::endl;
|
||||||
same_file_test();
|
same_file_test();
|
||||||
std::cout << "---- lines from file" << std::endl;
|
std::cout << "---- read from file" << std::endl;
|
||||||
read_lines_from_file_test();
|
read_from_file_test();
|
||||||
std::cout << "---- hex encode/decode" << std::endl;
|
std::cout << "---- hex encode/decode" << std::endl;
|
||||||
hex_encode_decode_test();
|
hex_encode_decode_test();
|
||||||
}
|
}
|
||||||
|
@ -168,44 +168,6 @@ static void print_rect(std::ostream& out,
|
|||||||
<< r.urx << ", " << r.ury << "]";
|
<< r.urx << ", " << r.ury << "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read_file_into_memory(
|
|
||||||
char const* filename,
|
|
||||||
PointerHolder<char>& file_buf, size_t& size)
|
|
||||||
{
|
|
||||||
FILE* f = QUtil::safe_fopen(filename, "rb");
|
|
||||||
fseek(f, 0, SEEK_END);
|
|
||||||
size = QIntC::to_size(QUtil::tell(f));
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
file_buf = PointerHolder<char>(true, new char[size]);
|
|
||||||
char* buf_p = file_buf.getPointer();
|
|
||||||
size_t bytes_read = 0;
|
|
||||||
size_t len = 0;
|
|
||||||
while ((len = fread(buf_p + bytes_read, 1, size - bytes_read, f)) > 0)
|
|
||||||
{
|
|
||||||
bytes_read += len;
|
|
||||||
}
|
|
||||||
if (bytes_read != size)
|
|
||||||
{
|
|
||||||
if (ferror(f))
|
|
||||||
{
|
|
||||||
throw std::runtime_error(
|
|
||||||
std::string("failure reading file ") + filename +
|
|
||||||
" into memory: read " +
|
|
||||||
QUtil::uint_to_string(bytes_read) + "; wanted " +
|
|
||||||
QUtil::uint_to_string(size));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw std::logic_error(
|
|
||||||
std::string("premature eof reading file ") + filename +
|
|
||||||
" into memory: read " +
|
|
||||||
QUtil::uint_to_string(bytes_read) + "; wanted " +
|
|
||||||
QUtil::uint_to_string(size));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define assert_compare_numbers(expected, expr) \
|
#define assert_compare_numbers(expected, expr) \
|
||||||
compare_numbers(#expr, expected, expr)
|
compare_numbers(#expr, expected, expr)
|
||||||
|
|
||||||
@ -277,7 +239,7 @@ void runtest(int n, char const* filename1, char const* arg2)
|
|||||||
|
|
||||||
std::string filename(std::string(filename1) + ".obfuscated");
|
std::string filename(std::string(filename1) + ".obfuscated");
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
read_file_into_memory(filename.c_str(), file_buf, size);
|
QUtil::read_file_into_memory(filename.c_str(), file_buf, size);
|
||||||
char* p = file_buf.getPointer();
|
char* p = file_buf.getPointer();
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
{
|
{
|
||||||
@ -308,7 +270,7 @@ void runtest(int n, char const* filename1, char const* arg2)
|
|||||||
{
|
{
|
||||||
QTC::TC("qpdf", "exercise processMemoryFile");
|
QTC::TC("qpdf", "exercise processMemoryFile");
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
read_file_into_memory(filename1, file_buf, size);
|
QUtil::read_file_into_memory(filename1, file_buf, size);
|
||||||
pdf.processMemoryFile(filename1, file_buf.getPointer(), size);
|
pdf.processMemoryFile(filename1, file_buf.getPointer(), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user