| /* Copyright (C) 2019 Mozilla Foundation. |
| File: decode_fuzzer.cc |
| |
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the following conditions |
| are met: |
| |
| - Redistributions of source code must retain the above copyright |
| notice, this list of conditions and the following disclaimer. |
| |
| - Redistributions in binary form must reproduce the above copyright |
| notice, this list of conditions and the following disclaimer in the |
| documentation and/or other materials provided with the distribution. |
| |
| - Neither the name of the Xiph.org Foundation nor the names of its |
| contributors may be used to endorse or promote products derived from |
| this software without specific prior written permission. |
| |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR |
| CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| /* This based on decode_fuzzer.cc used with Vorbis. |
| https://git.xiph.org/?p=vorbis.git;a=blob;f=contrib/oss-fuzz/decode_fuzzer.cc;hb=HEAD |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <cstdint> |
| #include "ivorbisfile.h" |
| |
| #define INPUT_LIMIT 16384 |
| |
| struct vorbis_data { |
| const uint8_t *current; |
| const uint8_t *data; |
| size_t size; |
| }; |
| |
| size_t read_func(void *ptr, size_t size1, size_t size2, void *datasource) { |
| vorbis_data* vd = (vorbis_data *)(datasource); |
| size_t len = size1 * size2; |
| if (vd->current + len > vd->data + vd->size) { |
| len = vd->data + vd->size - vd->current; |
| } |
| memcpy(ptr, vd->current, len); |
| vd->current += len; |
| return len; |
| } |
| |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { |
| ov_callbacks memory_callbacks = {0}; |
| memory_callbacks.read_func = read_func; |
| vorbis_data data_st; |
| data_st.size = Size > INPUT_LIMIT ? INPUT_LIMIT : Size; |
| data_st.current = Data; |
| data_st.data = Data; |
| OggVorbis_File vf; |
| int result = ov_open_callbacks(&data_st, &vf, NULL, 0, memory_callbacks); |
| if (result < 0) { |
| return 0; |
| } |
| int current_section = 0; |
| char pcm[4096]; |
| long read_result; |
| while (true) { |
| read_result = ov_read(&vf, pcm, sizeof(pcm), ¤t_section); |
| if (read_result <= 0 && read_result != OV_HOLE) { |
| break; |
| } |
| } |
| ov_clear(&vf); |
| return 0; |
| } |