42 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include <cstddef>
 | |
| #include <cstdint>
 | |
| #include <cstdlib>
 | |
| #include <vector>
 | |
| #include <FreeImage.h>
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| // Returns true if the format should be attempted to loaded from memory.
 | |
| bool SafeToLoadFromMemory(FREE_IMAGE_FORMAT fif) {
 | |
|   // For now, just load if it is a BMP. Future heuristics may need to be based
 | |
|   // on the expected size in different formats for memory regions to avoid OOMs.
 | |
|   return fif == FIF_BMP;
 | |
| }
 | |
| 
 | |
| }  // namespace
 | |
| 
 | |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
 | |
|   static bool initialized = false;
 | |
|   if (!initialized) {
 | |
|     FreeImage_Initialise();
 | |
|   }
 | |
| 
 | |
|   if (size > 100 * 1000) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   std::vector<uint8_t> fuzzer_data_vector(data, data + size);
 | |
|   FIMEMORY* fiMem = FreeImage_OpenMemory(
 | |
|       reinterpret_cast<unsigned char*>(fuzzer_data_vector.data()),
 | |
|       fuzzer_data_vector.size());
 | |
| 
 | |
|   FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(fiMem, 0);
 | |
|   if (SafeToLoadFromMemory(fif)) {
 | |
|     FIBITMAP* fiBitmap = FreeImage_LoadFromMemory(fif, fiMem);
 | |
|     FreeImage_Unload(fiBitmap);
 | |
|   }
 | |
|   FreeImage_CloseMemory(fiMem);
 | |
| 
 | |
|   return 0;
 | |
| }
 |