sndfile_alt_fuzzer.cc 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sndfile.h>
  5. #include <inttypes.h>
  6. #include "sndfile_fuzz_header.h"
  7. extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
  8. { // One byte is needed for deciding which function to target.
  9. if (size == 0)
  10. return 0 ;
  11. const uint8_t decider = *data ;
  12. data += 1 ;
  13. size -= 1 ;
  14. SF_INFO sndfile_info ;
  15. VIO_DATA vio_data ;
  16. SF_VIRTUAL_IO vio ;
  17. SNDFILE *sndfile = NULL ;
  18. int err = sf_init_file(data, size, &sndfile, &vio_data, &vio, &sndfile_info) ;
  19. if (err)
  20. goto EXIT_LABEL ;
  21. // Just the right number of channels. Create some buffer space for reading.
  22. switch (decider % 3)
  23. { case 0 :
  24. {
  25. short* read_buffer = NULL ;
  26. read_buffer = (short*)malloc(sizeof(short) * size);
  27. if (read_buffer == NULL)
  28. abort() ;
  29. while (sf_read_short(sndfile, read_buffer, size))
  30. {
  31. // Do nothing with the data.
  32. }
  33. free(read_buffer) ;
  34. }
  35. break ;
  36. case 1 :
  37. {
  38. int* read_buffer = NULL ;
  39. read_buffer = (int*)malloc(sizeof(int) * size) ;
  40. if (read_buffer == NULL)
  41. abort() ;
  42. while (sf_read_int(sndfile, read_buffer, size))
  43. {
  44. // Do nothing with the data.
  45. }
  46. free(read_buffer) ;
  47. }
  48. break ;
  49. case 2 :
  50. {
  51. double* read_buffer = NULL ;
  52. read_buffer = (double*)malloc(sizeof(double) * size) ;
  53. if (read_buffer == NULL)
  54. abort() ;
  55. while (sf_read_double(sndfile, read_buffer, size))
  56. {
  57. // Do nothing with the data.
  58. }
  59. free(read_buffer) ;
  60. }
  61. break ;
  62. default :
  63. break ;
  64. } ;
  65. EXIT_LABEL:
  66. if (sndfile != NULL)
  67. sf_close(sndfile);
  68. return 0 ;
  69. }