/src/load_from_memory_fuzzer.cc
Line | Count | Source (jump to first uncovered line) |
1 | | #include <cstddef> |
2 | | #include <cstdint> |
3 | | #include <cstdlib> |
4 | | #include <vector> |
5 | | #include <FreeImage.h> |
6 | | |
7 | | namespace { |
8 | | |
9 | | // Returns true if the format should be attempted to loaded from memory. |
10 | 24.7k | bool SafeToLoadFromMemory(FREE_IMAGE_FORMAT fif) { |
11 | | // For now, just load if it is a BMP. Future heuristics may need to be based |
12 | | // on the expected size in different formats for memory regions to avoid OOMs. |
13 | 24.7k | return fif == FIF_BMP; |
14 | 24.7k | } |
15 | | |
16 | | } // namespace |
17 | | |
18 | 24.7k | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
19 | 24.7k | static bool initialized = false; |
20 | 24.7k | if (!initialized) { |
21 | 24.7k | FreeImage_Initialise(); |
22 | 24.7k | } |
23 | | |
24 | 24.7k | if (size > 100 * 1000) { |
25 | 0 | return 0; |
26 | 0 | } |
27 | | |
28 | 24.7k | std::vector<uint8_t> fuzzer_data_vector(data, data + size); |
29 | 24.7k | FIMEMORY* fiMem = FreeImage_OpenMemory( |
30 | 24.7k | reinterpret_cast<unsigned char*>(fuzzer_data_vector.data()), |
31 | 24.7k | fuzzer_data_vector.size()); |
32 | | |
33 | 24.7k | FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(fiMem, 0); |
34 | 24.7k | if (SafeToLoadFromMemory(fif)) { |
35 | 66 | FIBITMAP* fiBitmap = FreeImage_LoadFromMemory(fif, fiMem); |
36 | 66 | FreeImage_Unload(fiBitmap); |
37 | 66 | } |
38 | 24.7k | FreeImage_CloseMemory(fiMem); |
39 | | |
40 | 24.7k | return 0; |
41 | 24.7k | } |