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. SafeToLoadFromMemory(FREE_IMAGE_FORMAT fif)10bool 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 return fif == FIF_BMP; 14 } 15 16 } // namespace 17 LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)18extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { 19 static bool initialized = false; 20 if (!initialized) { 21 FreeImage_Initialise(); 22 } 23 24 if (size > 100 * 1000) { 25 return 0; 26 } 27 28 std::vector<uint8_t> fuzzer_data_vector(data, data + size); 29 FIMEMORY* fiMem = FreeImage_OpenMemory( 30 reinterpret_cast<unsigned char*>(fuzzer_data_vector.data()), 31 fuzzer_data_vector.size()); 32 33 FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(fiMem, 0); 34 if (SafeToLoadFromMemory(fif)) { 35 FIBITMAP* fiBitmap = FreeImage_LoadFromMemory(fif, fiMem); 36 FreeImage_Unload(fiBitmap); 37 } 38 FreeImage_CloseMemory(fiMem); 39 40 return 0; 41 } 42