New submission from Daniel Kang <daniel.d.k...@gmail.com>: ffmpeg crashes on some dpx files with invalid headers. target_packet_size*avctx->width is not checked to see if the buffer will be overread. The patch fixes this.
gdb run: (gdb) r -i ../fuzzed.dpx del.mkv Starting program: ffmpeg/ffmpeg_g -i ../fuzzed.dpx del.mkv [Thread debugging using libthread_db enabled] FFmpeg version git-b06938e, Copyright (c) 2000-2011 the FFmpeg developers built on Jan 6 2011 20:01:54 with gcc 4.4.5 configuration: --enable-gpl --disable-pthreads libavutil 50.36. 0 / 50.36. 0 libavcore 0.16. 0 / 0.16. 0 libavcodec 52.103. 1 / 52.103. 1 libavformat 52.92. 0 / 52.92. 0 libavdevice 52. 2. 3 / 52. 2. 3 libavfilter 1.72. 0 / 1.72. 0 libswscale 0.12. 0 / 0.12. 0 Program received signal SIGSEGV, Segmentation fault. 0x00007ffff6f74b4b in memcpy () from /lib/libc.so.6 (gdb) bt #0 0x00007ffff6f74b4b in memcpy () from /lib/libc.so.6 #1 0x000000000051ae20 in decode_frame (avctx=0x1203260, data=<value optimized out>, data_size=<value optimized out>, avpkt=<value optimized out>) at /usr/include/bits/string3.h:52 #2 0x0000000000756790 in avcodec_decode_video2 (avctx=0x1203260, picture=0x7fffffffd160, got_picture_ptr=0x7fffffffd43c, avpkt=0x1203850) at libavcodec/utils.c:632 #3 0x00000000004d7470 in try_decode_frame (ic=0x1200510) at libavformat/utils.c:2080 #4 av_find_stream_info (ic=0x1200510) at libavformat/utils.c:2361 #5 0x000000000043124b in opt_input_file (filename=0x7fffffffdafe "../fuzzed.dpx") at ffmpeg.c:3214 #6 0x000000000043b40c in parse_options (argc=4, argv=0x7fffffffd758, options=<value optimized out>, parse_arg_function=0x437e20 <opt_output_file>) at cmdutils.c:208 #7 0x0000000000437412 in main (argc=4, argv=0x7fffffffd758) at ffmpeg.c:4343 (gdb) disass $pc-32 $pc+32 Dump of assembler code from 0x7ffff6f74b2b to 0x7ffff6f74b6b: 0x00007ffff6f74b2b <memcpy+315>: (bad) 0x00007ffff6f74b2c <memcpy+316>: (bad) 0x00007ffff6f74b2d <memcpy+317>: push %rbx 0x00007ffff6f74b2f <memcpy+319>: retq 0x00007ffff6f74b30 <memcpy+320>: mov 0x2d45b9(%rip),%r11 # 0x7ffff72490f0 0x00007ffff6f74b37 <memcpy+327>: cmp %rdx,%r11 0x00007ffff6f74b3a <memcpy+330>: cmova %rdx,%r11 0x00007ffff6f74b3e <memcpy+334>: mov %r11,%rcx 0x00007ffff6f74b41 <memcpy+337>: and $0xfffffffffffffff8,%r11 0x00007ffff6f74b45 <memcpy+341>: shr $0x3,%rcx 0x00007ffff6f74b49 <memcpy+345>: je 0x7ffff6f74b50 <memcpy+352> 0x00007ffff6f74b4b <memcpy+347>: rep movsq %ds:(%rsi),%es:(%rdi) 0x00007ffff6f74b4e <memcpy+350>: xchg %ax,%ax 0x00007ffff6f74b50 <memcpy+352>: sub %r11,%rdx 0x00007ffff6f74b53 <memcpy+355>: test $0xfffffffffffffff8,%rdx 0x00007ffff6f74b5a <memcpy+362>: jne 0x7ffff6f74b70 <memcpy+384> 0x00007ffff6f74b5c <memcpy+364>: and $0x7,%edx 0x00007ffff6f74b5f <memcpy+367>: mov -0x8(%rsp),%rax 0x00007ffff6f74b64 <memcpy+372>: jne 0x7ffff6f749f9 <memcpy+9> 0x00007ffff6f74b6a <memcpy+378>: repz retq End of assembler dump. (gdb) info all-registers rax 0x7ffff5d03590 140737317451152 rbx 0x1203260 18887264 rcx 0xc2 194 rdx 0x1200 4608 rsi 0x7ffff68cc000 140737329807360 rdi 0x7ffff5d04180 140737317454208 rbp 0x203 0x203 rsp 0x7fffffffd058 0x7fffffffd058 r8 0x0 0 r9 0x300000 3145728 r10 0x0 0 r11 0x1200 4608 r12 0x12c0 4800 r13 0x7ffff68cb410 140737329804304 r14 0x7ffff5d04850 140737317455952 r15 0x6 6 rip 0x7ffff6f74b4b 0x7ffff6f74b4b <memcpy+347> eflags 0x10202 [ IF RF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0 st0 0 (raw 0x00000000000000000000) st1 0 (raw 0x00000000000000000000) st2 0 (raw 0x00000000000000000000) st3 0 (raw 0x00000000000000000000) st4 0 (raw 0x00000000000000000000) st5 0 (raw 0x00000000000000000000) st6 0 (raw 0x00000000000000000000) st7 0 (raw 0x00000000000000000000) fctrl 0x37f 895 fstat 0x0 0 ftag 0xffff 65535 fiseg 0x0 0 fioff 0x0 0 foseg 0x0 0 fooff 0x0 0 fop 0x0 0 xmm0 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x80 <repeats 16 times>}, v8_int16 = {0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080}, v4_int32 = {0x80808080, 0x80808080, 0x80808080, 0x80808080}, v2_int64 = {0x8080808080808080, 0x8080808080808080}, uint128 = 0x80808080808080808080808080808080} ---Type <return> to continue, or q <return> to quit--- xmm1 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000} xmm2 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x8000000000000000}, v16_int8 = {0x0 <repeats 13 times>, 0xff, 0xff, 0xff}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff00, 0xffff}, v4_int32 = {0x0, 0x0, 0x0, 0xffffff00}, v2_int64 = {0x0, 0xffffff0000000000}, uint128 = 0xffffff00000000000000000000000000} xmm3 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x8000000000000000, 0x8000000000000000}, v16_int8 = {0x0, 0xff <repeats 15 times>}, v8_int16 = {0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, v4_int32 = {0xffffff00, 0xffffffff, 0xffffffff, 0xffffffff}, v2_int64 = {0xffffffffffffff00, 0xffffffffffffffff}, uint128 = 0xffffffffffffffffffffffffffffff00} xmm4 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x8000000000000000}, v16_int8 = {0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x54, 0x72, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f}, v8_int16 = {0x73, 0x0, 0x0, 0x0, 0x7254, 0x6569, 0x2064, 0x6f74}, v4_int32 = {0x73, 0x0, 0x65697254, 0x6f742064}, v2_int64 = {0x73, 0x6f74206465697254}, uint128 = 0x6f742064656972540000000000000073} xmm5 {v4_float = {0x0, 0x1, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0xe0, 0x95, 0x9c, 0xe7, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0xe000, 0x9c95, 0x3fe7, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0xe0000000, 0x3fe79c95, 0x0, 0x0}, v2_int64 = {0x3fe79c95e0000000, 0x0}, uint128 = 0x00000000000000003fe79c95e0000000} xmm6 {v4_float = {0x0, 0x1, 0x0, 0x0}, v2_double = {0x1, 0x0}, v16_int8 = {0x6d, 0x7d, 0xbf, 0xbb, 0x27, 0xaf, 0xf5, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x7d6d, 0xbbbf, 0xaf27, 0x3ff5, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0xbbbf7d6d, 0x3ff5af27, 0x0, 0x0}, v2_int64 = {0x3ff5af27bbbf7d6d, 0x0}, uint128 = 0x00000000000000003ff5af27bbbf7d6d} xmm7 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x68, 0xc8, 0xbc, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0xc868, 0x3bbc, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x3bbcc868, 0x0, 0x0}, v2_int64 = {0x3bbcc86800000000, 0x0}, uint128 = 0x00000000000000003bbcc86800000000} xmm8 {v4_float = {0x0, 0xfffffffd, 0x0, 0x0}, v2_double = {0xffffffffffffffd2, 0x0}, v16_int8 = {0xe0, 0xe6, 0x35, 0x67, 0x9e, 0x6, 0x47, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0xe6e0, 0x6735, 0x69e, 0xc047, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x6735e6e0, 0xc047069e, 0x0, 0x0}, v2_int64 = { 0xc047069e6735e6e0, 0x0}, uint128 = 0x0000000000000000c047069e6735e6e0} xmm9 {v4_float = {0x0, 0x1, 0x0, 0x0}, v2_double = {0x1, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x0, 0x3ff0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x3ff00000, 0x0, 0x0}, v2_int64 = {0x3ff0000000000000, 0x0}, uint128 = 0x00000000000000003ff0000000000000} xmm10 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x46, 0x84, 0x24, 0x59, 0xd6, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x8446, 0x5924, 0x3ed6, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x84460000, 0x3ed65924, 0x0, 0x0}, v2_int64 = {0x3ed6592484460000, 0x0}, uint128 = 0x00000000000000003ed6592484460000} xmm11 {v4_float = {0x9689a800, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x6a, 0xa2, 0x65, 0x50, 0xf2, 0xea, 0x8f, 0xbd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0xa26a, 0x5065, 0xeaf2, 0xbd8f, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x5065a26a, 0xbd8feaf2, 0x0, 0x0}, v2_int64 = {0xbd8feaf25065a26a, 0x0}, uint128 = 0x0000000000000000bd8feaf25065a26a} xmm12 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x29, 0xf2, 0x88, 0x6c, 0xa6, 0x49, 0xde, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0xf229, 0x6c88, 0x49a6, 0x3ede, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x6c88f229, 0x3ede49a6, 0x0, 0x0}, v2_int64 = {0x3ede49a66c88f229, 0x0}, uint128 = 0x00000000000000003ede49a66c88f229} xmm13 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0xb3, 0x12, 0x58, 0x17, 0x64, 0x46, 0xe6, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x12b3, 0x1758, 0x4664, 0x3be6, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x175812b3, 0x3be64664, 0x0, 0x0}, v2_int64 = {0x3be64664175812b3, 0x0}, uint128 = 0x00000000000000003be64664175812b3} xmm14 {v4_float = {0x0, 0x3, 0x0, 0x0}, v2_double = {0x2d, 0x0}, v16_int8 = {0xc0, 0x9, 0xf2, 0x16, 0xb5, 0xdf, 0x46, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x9c0, 0x16f2, 0xdfb5, 0x4046, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x16f209c0, 0x4046dfb5, 0x0, 0x0}, v2_int64 = {0x4046dfb516f209c0, 0x0}, uint128 = 0x00000000000000004046dfb516f209c0} xmm15 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000} mxcsr 0x1fa0 [ PE IM DM ZM OM UM PM ] ---------- files: dpx_buffer_sanity_check.diff messages: 13265 priority: normal status: open substatus: open title: ffmpeg crashes on dpx files with invalid headers type: bug ________________________________________________ FFmpeg issue tracker <iss...@roundup.ffmpeg.org> <https://roundup.ffmpeg.org/issue2503> ________________________________________________
dpx_buffer_sanity_check.diff
Description: Binary data