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;
 | 
						|
}
 |