cjson_read_fuzzer.cc 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <stdlib.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #include "../cJSON.h"
  5. extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
  6. {
  7. size_t offset = 4;
  8. if(size < offset) return 0;
  9. if(data[0] != '1' && data[0] != '0') return 0;
  10. if(data[1] != '1' && data[1] != '0') return 0;
  11. if(data[2] != '1' && data[2] != '0') return 0;
  12. if(data[3] != '1' && data[3] != '0') return 0;
  13. int minify = data[0] == '1' ? 1 : 0;
  14. int require_termination = data[1] == '1' ? 1 : 0;
  15. int formatted = data[2] == '1' ? 1 : 0;
  16. int buffered = data[3] == '1' ? 1 : 0;
  17. cJSON *json = cJSON_ParseWithOpts((const char*)data + offset, NULL, require_termination);
  18. if(json == NULL) return 0;
  19. char *printed_json = NULL;
  20. if(buffered)
  21. {
  22. printed_json = cJSON_PrintBuffered(json, 1, formatted);
  23. }
  24. else
  25. {
  26. /* unbuffered printing */
  27. if(formatted)
  28. {
  29. printed_json = cJSON_Print(json);
  30. }
  31. else
  32. {
  33. printed_json = cJSON_PrintUnformatted(json);
  34. }
  35. }
  36. if(printed_json != NULL) free(printed_json);
  37. if(minify)
  38. {
  39. unsigned char *copied = (unsigned char*)malloc(size);
  40. memcpy(copied, data + offset, size);
  41. cJSON_Minify((char*)printed_json);
  42. free(copied);
  43. }
  44. cJSON_Delete(json);
  45. return 0;
  46. }