I've had this kicking around for like 4 years, maybe it can be of use to some people. I haven't done full scale fuzzing with this because laziness. I just sometimes run it when I'm bored. It's not thread-safe, but it would be trivial to make it so.
It's based off my old LD_PRELOAD hack from here: https://gist.github.com/dwbuiten/7101755 Optionally takes two env vars, MALLOC_SEED (the seed), and MALLOC_FAILPROB for the probability of failing. I've been running it directly integrated inside FFmpeg's allocator because it makes it easier to run under gdb to find where it actually crashes, if the stack trace of the failure is not enough info/context. Currently FFmpeg has a lot of unchecked allocations - just one single FATE run with this found: daemon404@bbvm:~/dev/f/ffmpeg/tests/data/fate$ grep Seg *.err adpcm-ima-amv.err:Segmentation fault adpcm-ima-apc.err:Segmentation fault caf.err:Segmentation fault filter-mergeplanes.err:Segmentation fault filter-paletteuse-bayer.err:Segmentation fault filter-paletteuse-sierra2_4a.err:Segmentation fault lavf-wav.err:Segmentation fault lavf-wav_peak.err:Segmentation fault lavf-wav_peak_only.err:Segmentation fault vorbis-encode.err:Segmentation fault vsynth1-msvideo1.err:Segmentation fault Plus an infinite EAGAIN loop with av_usleep ffmpeg.c, that I'm still trying to debug. It prints a stack trace when it fails so that you know which allocation failed: daemon404@bbvm:~/dev/f/ffmpeg/tests/data/fate$ cat vorbis-encode.err [... snip ...] FAILED. Iteration = 9789, Seed = 1511549218. my_posix_memalign:77 in libavutil/posixmemalign.c av_malloc:89 in libavutil/mem.c av_mallocz:240 in libavutil/mem.c av_frame_alloc:152 in libavutil/frame.c av_frame_clone:499 in libavutil/frame.c vorbis_encode_frame:1098 in libavcodec/vorbisenc.c avcodec_encode_audio2:198 in libavcodec/encode.c do_encode:377 in libavcodec/encode.c avcodec_send_frame:423 in libavcodec/encode.c do_audio_out:931 in fftools/ffmpeg.c reap_filters:1507 in fftools/ffmpeg.c transcode_step:4562 in fftools/ffmpeg.c transcode:4606 in fftools/ffmpeg.c main:4812 in fftools/ffmpeg.c (null):0 in (null) (null):0 in (null) (null):0 in (null) Segmentation fault The (null) stuff is noise from libbacktrace, and could be skipped with a proper callback. And e.g. to reproduce this under gdb: $ MALLOC_SEED=1511549218 gdb --args /home/daemon404/dev/f/ffmpeg/ffmpeg_g \ -nostdin -nostats -cpuflags all -hwaccel none -threads 1 -thread_type frame+slice \ -i /home/daemon404/fate/audio-reference/luckynight_2ch_44kHz_s16.wav -c:a vorbis \ -strict experimental -f ogg -y /home/daemon404/dev/f/ffmpeg/tests/data/fate/vorbis-encode.ogg (Obtained from 'make fate-vorbis-encode V=1'.) Currently it's using libbacktrace from GCC, which can be build entirely separately from GDB (cd libbacktrace && ./configure && make && cp backtrace.h /usr/local/include && cp .libs/libbacktrace.a /usr/local/lib). Add -lbacktrace to extra-libs. Hacky? Yeah... Derek Buitenhuis (1): Allocation NULL check fuzzing tool libavutil/mem.c | 4 ++- libavutil/posixmemalign.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 libavutil/posixmemalign.c -- 2.15.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel