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