• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)10 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   return fif == FIF_BMP;
14 }
15 
16 }  // namespace
17 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)18 extern "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