cjson_read_fuzzer.c 1.6 KB

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