decode_fuzzer.cc 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <cstdint>
  4. #include <vorbis/vorbisfile.h>
  5. struct vorbis_data {
  6. const uint8_t *current;
  7. const uint8_t *data;
  8. size_t size;
  9. };
  10. size_t read_func(void *ptr, size_t size1, size_t size2, void *datasource) {
  11. vorbis_data* vd = (vorbis_data *)(datasource);
  12. size_t len = size1 * size2;
  13. if (vd->current + len > vd->data + vd->size) {
  14. len = vd->data + vd->size - vd->current;
  15. }
  16. memcpy(ptr, vd->current, len);
  17. vd->current += len;
  18. return len;
  19. }
  20. extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
  21. ov_callbacks memory_callbacks = {0};
  22. memory_callbacks.read_func = read_func;
  23. vorbis_data data_st;
  24. data_st.size = Size;
  25. data_st.current = Data;
  26. data_st.data = Data;
  27. OggVorbis_File vf;
  28. int result = ov_open_callbacks(&data_st, &vf, NULL, 0, memory_callbacks);
  29. if (result < 0) {
  30. return 0;
  31. }
  32. int current_section = 0;
  33. int eof = 0;
  34. char buf[4096];
  35. int read_result;
  36. while (!eof) {
  37. read_result = ov_read(&vf, buf, sizeof(buf), 0, 2, 1, &current_section);
  38. if (read_result != OV_HOLE && read_result <= 0) {
  39. eof = 1;
  40. }
  41. }
  42. ov_clear(&vf);
  43. return 0;
  44. }