cjson_read_fuzzer.cc 1.6 KB

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