xref: /aosp_15_r20/external/flac/oss-fuzz/decoder.cc (revision 600f14f40d737144c998e2ec7a483122d3776fbc)
1*600f14f4SXin Li /* Copyright 2019 Guido Vranken
2*600f14f4SXin Li  *
3*600f14f4SXin Li  * Permission is hereby granted, free of charge, to any person obtaining
4*600f14f4SXin Li  * a copy of this software and associated documentation files (the
5*600f14f4SXin Li  * "Software"), to deal in the Software without restriction, including
6*600f14f4SXin Li  * without limitation the rights to use, copy, modify, merge, publish,
7*600f14f4SXin Li  * distribute, sublicense, and/or sell copies of the Software, and to
8*600f14f4SXin Li  * permit persons to whom the Software is furnished to do so, subject
9*600f14f4SXin Li  * to the following conditions:
10*600f14f4SXin Li  *
11*600f14f4SXin Li  * The above copyright notice and this permission notice shall be
12*600f14f4SXin Li  * included in all copies or substantial portions of the Software.
13*600f14f4SXin Li  *
14*600f14f4SXin Li  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15*600f14f4SXin Li  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16*600f14f4SXin Li  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17*600f14f4SXin Li  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
18*600f14f4SXin Li  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19*600f14f4SXin Li  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20*600f14f4SXin Li  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*600f14f4SXin Li  * SOFTWARE.
22*600f14f4SXin Li  */
23*600f14f4SXin Li 
24*600f14f4SXin Li #include <cstddef>
25*600f14f4SXin Li #include <cstdint>
26*600f14f4SXin Li 
27*600f14f4SXin Li #include <fuzzing/datasource/datasource.hpp>
28*600f14f4SXin Li #include <fuzzing/memory.hpp>
29*600f14f4SXin Li 
30*600f14f4SXin Li #include "FLAC++/decoder.h"
31*600f14f4SXin Li #include "FLAC++/metadata.h"
32*600f14f4SXin Li #include "common.h"
33*600f14f4SXin Li 
Get(const uint64_t id)34*600f14f4SXin Li template <> FLAC__MetadataType fuzzing::datasource::Base::Get<FLAC__MetadataType>(const uint64_t id) {
35*600f14f4SXin Li     (void)id;
36*600f14f4SXin Li     switch ( Get<uint8_t>() ) {
37*600f14f4SXin Li         case 0:
38*600f14f4SXin Li             return FLAC__METADATA_TYPE_STREAMINFO;
39*600f14f4SXin Li         case 1:
40*600f14f4SXin Li             return FLAC__METADATA_TYPE_PADDING;
41*600f14f4SXin Li         case 2:
42*600f14f4SXin Li             return FLAC__METADATA_TYPE_APPLICATION;
43*600f14f4SXin Li         case 3:
44*600f14f4SXin Li             return FLAC__METADATA_TYPE_SEEKTABLE;
45*600f14f4SXin Li         case 4:
46*600f14f4SXin Li             return FLAC__METADATA_TYPE_VORBIS_COMMENT;
47*600f14f4SXin Li         case 5:
48*600f14f4SXin Li             return FLAC__METADATA_TYPE_CUESHEET;
49*600f14f4SXin Li         case 6:
50*600f14f4SXin Li             return FLAC__METADATA_TYPE_PICTURE;
51*600f14f4SXin Li         case 7:
52*600f14f4SXin Li             return FLAC__METADATA_TYPE_UNDEFINED;
53*600f14f4SXin Li         case 8:
54*600f14f4SXin Li             return FLAC__MAX_METADATA_TYPE;
55*600f14f4SXin Li         default:
56*600f14f4SXin Li             return FLAC__METADATA_TYPE_STREAMINFO;
57*600f14f4SXin Li     }
58*600f14f4SXin Li }
59*600f14f4SXin Li 
60*600f14f4SXin Li namespace FLAC {
61*600f14f4SXin Li 	namespace Decoder {
62*600f14f4SXin Li         class FuzzerStream : public Stream {
63*600f14f4SXin Li             private:
64*600f14f4SXin Li                 fuzzing::datasource::Datasource& ds;
65*600f14f4SXin Li             public:
FuzzerStream(fuzzing::datasource::Datasource & dsrc)66*600f14f4SXin Li                 FuzzerStream(fuzzing::datasource::Datasource& dsrc) :
67*600f14f4SXin Li                     Stream(), ds(dsrc) { }
68*600f14f4SXin Li 
read_callback(FLAC__byte buffer[],size_t * bytes)69*600f14f4SXin Li                 ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes)  override {
70*600f14f4SXin Li                     try {
71*600f14f4SXin Li                         const size_t maxCopySize = *bytes;
72*600f14f4SXin Li 
73*600f14f4SXin Li                         if ( maxCopySize > 0 ) {
74*600f14f4SXin Li                             /* memset just to test if this overwrites anything, and triggers ASAN */
75*600f14f4SXin Li                             memset(buffer, 0, maxCopySize);
76*600f14f4SXin Li                         }
77*600f14f4SXin Li 
78*600f14f4SXin Li                         const auto data = ds.GetData(0);
79*600f14f4SXin Li                         const auto dataSize = data.size();
80*600f14f4SXin Li                         const auto copySize = std::min(maxCopySize, dataSize);
81*600f14f4SXin Li 
82*600f14f4SXin Li                         if ( copySize > 0 ) {
83*600f14f4SXin Li                             memcpy(buffer, data.data(), copySize);
84*600f14f4SXin Li                         }
85*600f14f4SXin Li 
86*600f14f4SXin Li                         *bytes = copySize;
87*600f14f4SXin Li 
88*600f14f4SXin Li                         return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
89*600f14f4SXin Li                     } catch ( ... ) {
90*600f14f4SXin Li 	                    return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
91*600f14f4SXin Li                     }
92*600f14f4SXin Li                 }
93*600f14f4SXin Li 
write_callback(const::FLAC__Frame * frame,const FLAC__int32 * const buffer[])94*600f14f4SXin Li                 ::FLAC__StreamDecoderWriteStatus write_callback(const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[])  override {
95*600f14f4SXin Li                     {
96*600f14f4SXin Li                         fuzzing::memory::memory_test(&(frame->header), sizeof(frame->header));
97*600f14f4SXin Li                         fuzzing::memory::memory_test(&(frame->footer), sizeof(frame->footer));
98*600f14f4SXin Li                     }
99*600f14f4SXin Li 
100*600f14f4SXin Li                     {
101*600f14f4SXin Li                         const auto numChannels = get_channels();
102*600f14f4SXin Li                         const size_t bytesPerChannel = frame->header.blocksize * sizeof(FLAC__int32);
103*600f14f4SXin Li                         for (size_t i = 0; i < numChannels; i++) {
104*600f14f4SXin Li                             fuzzing::memory::memory_test(buffer[i], bytesPerChannel);
105*600f14f4SXin Li                         }
106*600f14f4SXin Li                     }
107*600f14f4SXin Li 
108*600f14f4SXin Li                     try {
109*600f14f4SXin Li                         if ( ds.Get<bool>() == true ) {
110*600f14f4SXin Li 	                        return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
111*600f14f4SXin Li                         }
112*600f14f4SXin Li                     } catch ( ... ) { }
113*600f14f4SXin Li                     return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
114*600f14f4SXin Li                 }
115*600f14f4SXin Li 
error_callback(::FLAC__StreamDecoderErrorStatus status)116*600f14f4SXin Li                 void error_callback(::FLAC__StreamDecoderErrorStatus status)  override {
117*600f14f4SXin Li                     fuzzing::memory::memory_test(status);
118*600f14f4SXin Li                 }
119*600f14f4SXin Li 
metadata_callback(const::FLAC__StreamMetadata * metadata)120*600f14f4SXin Li                 void metadata_callback(const ::FLAC__StreamMetadata *metadata) override {
121*600f14f4SXin Li                     Metadata::Prototype * cloned_object = nullptr;
122*600f14f4SXin Li                     fuzzing::memory::memory_test(metadata->type);
123*600f14f4SXin Li                     fuzzing::memory::memory_test(metadata->is_last);
124*600f14f4SXin Li                     fuzzing::memory::memory_test(metadata->length);
125*600f14f4SXin Li                     fuzzing::memory::memory_test(metadata->data);
126*600f14f4SXin Li                     if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO)
127*600f14f4SXin Li                         cloned_object = new Metadata::StreamInfo(metadata);
128*600f14f4SXin Li                     else if (metadata->type == FLAC__METADATA_TYPE_PADDING)
129*600f14f4SXin Li                         cloned_object = new Metadata::Padding(metadata);
130*600f14f4SXin Li                     else if (metadata->type == FLAC__METADATA_TYPE_APPLICATION)
131*600f14f4SXin Li                         cloned_object = new Metadata::Application(metadata);
132*600f14f4SXin Li                     else if (metadata->type == FLAC__METADATA_TYPE_SEEKTABLE)
133*600f14f4SXin Li                         cloned_object = new Metadata::SeekTable(metadata);
134*600f14f4SXin Li                     else if (metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT)
135*600f14f4SXin Li                         cloned_object = new Metadata::VorbisComment(metadata);
136*600f14f4SXin Li                     else if (metadata->type == FLAC__METADATA_TYPE_CUESHEET)
137*600f14f4SXin Li                         cloned_object = new Metadata::CueSheet(metadata);
138*600f14f4SXin Li                     else if (metadata->type == FLAC__METADATA_TYPE_PICTURE)
139*600f14f4SXin Li                         cloned_object = new Metadata::Picture(metadata);
140*600f14f4SXin Li                     else
141*600f14f4SXin Li                         return;
142*600f14f4SXin Li                     if (0 != cloned_object && *cloned_object == *metadata && cloned_object->is_valid()) {
143*600f14f4SXin Li                         if (cloned_object->get_type() == FLAC__METADATA_TYPE_SEEKTABLE)
144*600f14f4SXin Li                             dynamic_cast<Metadata::SeekTable *>(cloned_object)->is_legal();
145*600f14f4SXin Li                         if (cloned_object->get_type() == FLAC__METADATA_TYPE_PICTURE)
146*600f14f4SXin Li                             dynamic_cast<Metadata::Picture *>(cloned_object)->is_legal(NULL);
147*600f14f4SXin Li                         if (cloned_object->get_type() == FLAC__METADATA_TYPE_CUESHEET)
148*600f14f4SXin Li                             dynamic_cast<Metadata::CueSheet *>(cloned_object)->is_legal(true,NULL);
149*600f14f4SXin Li                     }
150*600f14f4SXin Li                     delete cloned_object;
151*600f14f4SXin Li                 }
152*600f14f4SXin Li 
seek_callback(FLAC__uint64 absolute_byte_offset)153*600f14f4SXin Li                 ::FLAC__StreamDecoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset) override {
154*600f14f4SXin Li                     fuzzing::memory::memory_test(absolute_byte_offset);
155*600f14f4SXin Li 
156*600f14f4SXin Li                     try {
157*600f14f4SXin Li                         if ( ds.Get<bool>() == true ) {
158*600f14f4SXin Li                             return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
159*600f14f4SXin Li                         } else {
160*600f14f4SXin Li                             return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
161*600f14f4SXin Li                         }
162*600f14f4SXin Li                     } catch ( ... ) {
163*600f14f4SXin Li                         return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
164*600f14f4SXin Li                     }
165*600f14f4SXin Li                 }
166*600f14f4SXin Li #if 0
167*600f14f4SXin Li                 ::FLAC__StreamDecoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset) override {
168*600f14f4SXin Li                     fuzzing::memory::memory_test(*absolute_byte_offset);
169*600f14f4SXin Li 
170*600f14f4SXin Li                     try {
171*600f14f4SXin Li                         if ( ds.Get<bool>() == true ) {
172*600f14f4SXin Li                             return FLAC__STREAM_DECODER_TELL_STATUS_OK;
173*600f14f4SXin Li                         } else {
174*600f14f4SXin Li                             return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
175*600f14f4SXin Li                         }
176*600f14f4SXin Li                     } catch ( ... ) {
177*600f14f4SXin Li                         return FLAC__STREAM_DECODER_TELL_STATUS_OK;
178*600f14f4SXin Li                     }
179*600f14f4SXin Li                 }
180*600f14f4SXin Li 
181*600f14f4SXin Li                 ::FLAC__StreamDecoderLengthStatus length_callback(FLAC__uint64 *stream_length) override {
182*600f14f4SXin Li                     fuzzing::memory::memory_test(*stream_length);
183*600f14f4SXin Li 
184*600f14f4SXin Li                     try {
185*600f14f4SXin Li                         if ( ds.Get<bool>() == true ) {
186*600f14f4SXin Li                             return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
187*600f14f4SXin Li                         } else {
188*600f14f4SXin Li                             return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
189*600f14f4SXin Li                         }
190*600f14f4SXin Li                     } catch ( ... ) {
191*600f14f4SXin Li                         return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
192*600f14f4SXin Li                     }
193*600f14f4SXin Li                 }
194*600f14f4SXin Li #endif
195*600f14f4SXin Li         };
196*600f14f4SXin Li     }
197*600f14f4SXin Li }
198*600f14f4SXin Li 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)199*600f14f4SXin Li extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
200*600f14f4SXin Li     fuzzing::datasource::Datasource ds(data, size);
201*600f14f4SXin Li     FLAC::Decoder::FuzzerStream decoder(ds);
202*600f14f4SXin Li     bool use_ogg = true;
203*600f14f4SXin Li 
204*600f14f4SXin Li     try {
205*600f14f4SXin Li         if ( ds.Get<bool>() ) {
206*600f14f4SXin Li             use_ogg = false;
207*600f14f4SXin Li         }
208*600f14f4SXin Li         if ( ds.Get<bool>() ) {
209*600f14f4SXin Li #ifdef FUZZER_DEBUG
210*600f14f4SXin Li             printf("set_ogg_serial_number\n");
211*600f14f4SXin Li #endif
212*600f14f4SXin Li             decoder.set_ogg_serial_number(ds.Get<long>());
213*600f14f4SXin Li         }
214*600f14f4SXin Li         if ( ds.Get<bool>() ) {
215*600f14f4SXin Li #ifdef FUZZER_DEBUG
216*600f14f4SXin Li             printf("set_md5_checking\n");
217*600f14f4SXin Li #endif
218*600f14f4SXin Li             decoder.set_md5_checking(ds.Get<bool>());
219*600f14f4SXin Li         }
220*600f14f4SXin Li         if ( ds.Get<bool>() ) {
221*600f14f4SXin Li #ifdef FUZZER_DEBUG
222*600f14f4SXin Li             printf("set_metadata_respond\n");
223*600f14f4SXin Li #endif
224*600f14f4SXin Li             decoder.set_metadata_respond(ds.Get<::FLAC__MetadataType>());
225*600f14f4SXin Li         }
226*600f14f4SXin Li         if ( ds.Get<bool>() ) {
227*600f14f4SXin Li             const auto idVector = ds.GetData(0);
228*600f14f4SXin Li             unsigned char id[4];
229*600f14f4SXin Li             if ( idVector.size() >= sizeof(id) ) {
230*600f14f4SXin Li                 memcpy(id, idVector.data(), sizeof(id));
231*600f14f4SXin Li #ifdef FUZZER_DEBUG
232*600f14f4SXin Li                 printf("set_metadata_respond_application\n");
233*600f14f4SXin Li #endif
234*600f14f4SXin Li                 decoder.set_metadata_respond_application(id);
235*600f14f4SXin Li             }
236*600f14f4SXin Li         }
237*600f14f4SXin Li         if ( ds.Get<bool>() ) {
238*600f14f4SXin Li #ifdef FUZZER_DEBUG
239*600f14f4SXin Li             printf("set_metadata_respond_all\n");
240*600f14f4SXin Li #endif
241*600f14f4SXin Li             decoder.set_metadata_respond_all();
242*600f14f4SXin Li         }
243*600f14f4SXin Li         if ( ds.Get<bool>() ) {
244*600f14f4SXin Li #ifdef FUZZER_DEBUG
245*600f14f4SXin Li             printf("set_metadata_ignore\n");
246*600f14f4SXin Li #endif
247*600f14f4SXin Li             decoder.set_metadata_ignore(ds.Get<::FLAC__MetadataType>());
248*600f14f4SXin Li         }
249*600f14f4SXin Li         if ( ds.Get<bool>() ) {
250*600f14f4SXin Li             const auto idVector = ds.GetData(0);
251*600f14f4SXin Li             unsigned char id[4];
252*600f14f4SXin Li             if ( idVector.size() >= sizeof(id) ) {
253*600f14f4SXin Li                 memcpy(id, idVector.data(), sizeof(id));
254*600f14f4SXin Li #ifdef FUZZER_DEBUG
255*600f14f4SXin Li                 printf("set_metadata_ignore_application\n");
256*600f14f4SXin Li #endif
257*600f14f4SXin Li                 decoder.set_metadata_ignore_application(id);
258*600f14f4SXin Li             }
259*600f14f4SXin Li         }
260*600f14f4SXin Li         if ( ds.Get<bool>() ) {
261*600f14f4SXin Li #ifdef FUZZER_DEBUG
262*600f14f4SXin Li             printf("set_metadata_ignore_all\n");
263*600f14f4SXin Li #endif
264*600f14f4SXin Li             decoder.set_metadata_ignore_all();
265*600f14f4SXin Li         }
266*600f14f4SXin Li         {
267*600f14f4SXin Li             ::FLAC__StreamDecoderInitStatus ret;
268*600f14f4SXin Li             if ( !use_ogg ) {
269*600f14f4SXin Li                 ret = decoder.init();
270*600f14f4SXin Li             } else {
271*600f14f4SXin Li                 ret = decoder.init_ogg();
272*600f14f4SXin Li             }
273*600f14f4SXin Li 
274*600f14f4SXin Li             if ( ret != FLAC__STREAM_DECODER_INIT_STATUS_OK ) {
275*600f14f4SXin Li                 goto end;
276*600f14f4SXin Li             }
277*600f14f4SXin Li         }
278*600f14f4SXin Li 
279*600f14f4SXin Li         while ( ds.Get<bool>() ) {
280*600f14f4SXin Li             switch ( ds.Get<uint8_t>() ) {
281*600f14f4SXin Li                 case    0:
282*600f14f4SXin Li                     {
283*600f14f4SXin Li #ifdef FUZZER_DEBUG
284*600f14f4SXin Li                         printf("flush\n");
285*600f14f4SXin Li #endif
286*600f14f4SXin Li                         const bool res = decoder.flush();
287*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
288*600f14f4SXin Li                     }
289*600f14f4SXin Li                     break;
290*600f14f4SXin Li                 case    1:
291*600f14f4SXin Li                     {
292*600f14f4SXin Li #ifdef FUZZER_DEBUG
293*600f14f4SXin Li                         printf("reset\n");
294*600f14f4SXin Li #endif
295*600f14f4SXin Li                         const bool res = decoder.reset();
296*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
297*600f14f4SXin Li                     }
298*600f14f4SXin Li                     break;
299*600f14f4SXin Li                 case    2:
300*600f14f4SXin Li                     {
301*600f14f4SXin Li #ifdef FUZZER_DEBUG
302*600f14f4SXin Li                         printf("process_single\n");
303*600f14f4SXin Li #endif
304*600f14f4SXin Li                         const bool res = decoder.process_single();
305*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
306*600f14f4SXin Li                     }
307*600f14f4SXin Li                     break;
308*600f14f4SXin Li                 case    3:
309*600f14f4SXin Li                     {
310*600f14f4SXin Li #ifdef FUZZER_DEBUG
311*600f14f4SXin Li                         printf("process_until_end_of_metadata\n");
312*600f14f4SXin Li #endif
313*600f14f4SXin Li                         const bool res = decoder.process_until_end_of_metadata();
314*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
315*600f14f4SXin Li                     }
316*600f14f4SXin Li                     break;
317*600f14f4SXin Li                 case    4:
318*600f14f4SXin Li                     {
319*600f14f4SXin Li #ifdef FUZZER_DEBUG
320*600f14f4SXin Li                         printf("process_until_end_of_stream\n");
321*600f14f4SXin Li #endif
322*600f14f4SXin Li                         const bool res = decoder.process_until_end_of_stream();
323*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
324*600f14f4SXin Li                     }
325*600f14f4SXin Li                     break;
326*600f14f4SXin Li                 case    5:
327*600f14f4SXin Li                     {
328*600f14f4SXin Li #ifdef FUZZER_DEBUG
329*600f14f4SXin Li                         printf("skip_single_frame\n");
330*600f14f4SXin Li #endif
331*600f14f4SXin Li                         const bool res = decoder.skip_single_frame();
332*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
333*600f14f4SXin Li                     }
334*600f14f4SXin Li                     break;
335*600f14f4SXin Li                 case    6:
336*600f14f4SXin Li                     {
337*600f14f4SXin Li #ifdef FUZZER_DEBUG
338*600f14f4SXin Li                         printf("seek_absolute\n");
339*600f14f4SXin Li #endif
340*600f14f4SXin Li                         const bool res = decoder.seek_absolute(ds.Get<uint64_t>());
341*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
342*600f14f4SXin Li                     }
343*600f14f4SXin Li                     break;
344*600f14f4SXin Li                 case    7:
345*600f14f4SXin Li                     {
346*600f14f4SXin Li #ifdef FUZZER_DEBUG
347*600f14f4SXin Li                         printf("get_md5_checking\n");
348*600f14f4SXin Li #endif
349*600f14f4SXin Li                         const bool res = decoder.get_md5_checking();
350*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
351*600f14f4SXin Li                     }
352*600f14f4SXin Li                     break;
353*600f14f4SXin Li                 case    8:
354*600f14f4SXin Li                     {
355*600f14f4SXin Li #ifdef FUZZER_DEBUG
356*600f14f4SXin Li                         printf("get_total_samples\n");
357*600f14f4SXin Li #endif
358*600f14f4SXin Li                         const bool res = decoder.get_total_samples();
359*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
360*600f14f4SXin Li                     }
361*600f14f4SXin Li                     break;
362*600f14f4SXin Li                 case    9:
363*600f14f4SXin Li                     {
364*600f14f4SXin Li #ifdef FUZZER_DEBUG
365*600f14f4SXin Li                         printf("get_channels\n");
366*600f14f4SXin Li #endif
367*600f14f4SXin Li                         const bool res = decoder.get_channels();
368*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
369*600f14f4SXin Li                     }
370*600f14f4SXin Li                     break;
371*600f14f4SXin Li                 case    10:
372*600f14f4SXin Li                     {
373*600f14f4SXin Li #ifdef FUZZER_DEBUG
374*600f14f4SXin Li                         printf("get_bits_per_sample\n");
375*600f14f4SXin Li #endif
376*600f14f4SXin Li                         const bool res = decoder.get_bits_per_sample();
377*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
378*600f14f4SXin Li                     }
379*600f14f4SXin Li                     break;
380*600f14f4SXin Li                 case    11:
381*600f14f4SXin Li                     {
382*600f14f4SXin Li #ifdef FUZZER_DEBUG
383*600f14f4SXin Li                         printf("get_sample_rate\n");
384*600f14f4SXin Li #endif
385*600f14f4SXin Li                         const bool res = decoder.get_sample_rate();
386*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
387*600f14f4SXin Li                     }
388*600f14f4SXin Li                     break;
389*600f14f4SXin Li                 case    12:
390*600f14f4SXin Li                     {
391*600f14f4SXin Li #ifdef FUZZER_DEBUG
392*600f14f4SXin Li                         printf("get_blocksize\n");
393*600f14f4SXin Li #endif
394*600f14f4SXin Li                         const bool res = decoder.get_blocksize();
395*600f14f4SXin Li                         fuzzing::memory::memory_test(res);
396*600f14f4SXin Li                     }
397*600f14f4SXin Li                     break;
398*600f14f4SXin Li             }
399*600f14f4SXin Li         }
400*600f14f4SXin Li     } catch ( ... ) { }
401*600f14f4SXin Li 
402*600f14f4SXin Li end:
403*600f14f4SXin Li     {
404*600f14f4SXin Li         const bool res = decoder.finish();
405*600f14f4SXin Li         fuzzing::memory::memory_test(res);
406*600f14f4SXin Li     }
407*600f14f4SXin Li     return 0;
408*600f14f4SXin Li }
409