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