add fuzzers and build script from OSS-Fuzz
[platform/upstream/libvorbis.git] / contrib / oss-fuzz / decode_fuzzer.cc
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 size_t read_func(void *ptr, size_t size1, size_t size2, void *datasource) {
13   vorbis_data* vd = (vorbis_data *)(datasource);
14   size_t len = size1 * size2;
15   if (vd->current + len > vd->data + vd->size) {
16       len = vd->data + vd->size - vd->current;
17   }
18   memcpy(ptr, vd->current, len);
19   vd->current += len;
20   return len;
21 }
22
23
24 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
25   ov_callbacks memory_callbacks = {0};
26   memory_callbacks.read_func = read_func;
27   vorbis_data data_st;
28   data_st.size = Size;
29   data_st.current = Data;
30   data_st.data = Data;
31   OggVorbis_File vf;
32   int result = ov_open_callbacks(&data_st, &vf, NULL, 0, memory_callbacks);
33   if (result < 0) {
34     return 0;
35   }
36   int current_section = 0;
37   int eof = 0;
38   char buf[4096];
39   int read_result;
40   while (!eof) {
41     read_result = ov_read(&vf, buf, sizeof(buf), 0, 2, 1, &current_section);
42     if (read_result != OV_HOLE && read_result <= 0) {
43       eof = 1;
44     }
45   }
46   ov_clear(&vf);
47   return 0;
48 }