/src/tremor/decode_fuzzer.cc
Line | Count | Source |
1 | | /* Copyright (C) 2019 Mozilla Foundation. |
2 | | File: decode_fuzzer.cc |
3 | | |
4 | | Redistribution and use in source and binary forms, with or without |
5 | | modification, are permitted provided that the following conditions |
6 | | are met: |
7 | | |
8 | | - Redistributions of source code must retain the above copyright |
9 | | notice, this list of conditions and the following disclaimer. |
10 | | |
11 | | - Redistributions in binary form must reproduce the above copyright |
12 | | notice, this list of conditions and the following disclaimer in the |
13 | | documentation and/or other materials provided with the distribution. |
14 | | |
15 | | - Neither the name of the Xiph.org Foundation nor the names of its |
16 | | contributors may be used to endorse or promote products derived from |
17 | | this software without specific prior written permission. |
18 | | |
19 | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
20 | | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
21 | | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
22 | | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR |
23 | | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
24 | | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
25 | | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
26 | | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
27 | | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
28 | | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
29 | | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 | | */ |
31 | | /* This based on decode_fuzzer.cc used with Vorbis. |
32 | | https://git.xiph.org/?p=vorbis.git;a=blob;f=contrib/oss-fuzz/decode_fuzzer.cc;hb=HEAD |
33 | | */ |
34 | | |
35 | | #include <stdio.h> |
36 | | #include <string.h> |
37 | | #include <cstdint> |
38 | | #include "ivorbisfile.h" |
39 | | |
40 | 1.65k | #define INPUT_LIMIT 16384 |
41 | | |
42 | | struct vorbis_data { |
43 | | const uint8_t *current; |
44 | | const uint8_t *data; |
45 | | size_t size; |
46 | | }; |
47 | | |
48 | 4.68k | size_t read_func(void *ptr, size_t size1, size_t size2, void *datasource) { |
49 | 4.68k | vorbis_data* vd = (vorbis_data *)(datasource); |
50 | 4.68k | size_t len = size1 * size2; |
51 | 4.68k | if (vd->current + len > vd->data + vd->size) { |
52 | 2.74k | len = vd->data + vd->size - vd->current; |
53 | 2.74k | } |
54 | 4.68k | memcpy(ptr, vd->current, len); |
55 | 4.68k | vd->current += len; |
56 | 4.68k | return len; |
57 | 4.68k | } |
58 | | |
59 | 1.64k | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { |
60 | 1.64k | ov_callbacks memory_callbacks = {0}; |
61 | 1.64k | memory_callbacks.read_func = read_func; |
62 | 1.64k | vorbis_data data_st; |
63 | 1.64k | data_st.size = Size > INPUT_LIMIT ? INPUT_LIMIT : Size; |
64 | 1.64k | data_st.current = Data; |
65 | 1.64k | data_st.data = Data; |
66 | 1.64k | OggVorbis_File vf; |
67 | 1.64k | int result = ov_open_callbacks(&data_st, &vf, NULL, 0, memory_callbacks); |
68 | 1.64k | if (result < 0) { |
69 | 523 | return 0; |
70 | 523 | } |
71 | 1.12k | int current_section = 0; |
72 | 1.12k | char pcm[4096]; |
73 | 1.12k | long read_result; |
74 | 967k | while (true) { |
75 | 967k | read_result = ov_read(&vf, pcm, sizeof(pcm), ¤t_section); |
76 | 967k | if (read_result <= 0 && read_result != OV_HOLE) { |
77 | 1.12k | break; |
78 | 1.12k | } |
79 | 967k | } |
80 | 1.12k | ov_clear(&vf); |
81 | 1.12k | return 0; |
82 | 1.64k | } |