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