83 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| /* 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;
 | |
| }
 |