#10677: Use of unitizlised variables when parsing invalid pan filters
--------------------------------------+----------------------------------
Reporter: alexet | Type: defect
Status: new | Priority: minor
Component: undetermined | Version: 5.1.2
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
--------------------------------------+----------------------------------
Summary of the bug:
In af_pan.c there are quite a few uses of sscanf where the return value is
only checked against zero which doesn't account for the possibility of -1
when the end of the string is reached.
Creating truncated pan filters triggers this code and therefore the output
arguments to sscanf are left uninitialized. In the examples I can create
the stack happens to be zero so nothing bad can happen.
How to reproduce:
This one we skip an uninitialized amount of bytes into a string (it
happens to be zero so no actual issues)
{{{
valgrind ffmpeg -i video.mp4 -af "pan=mono|c0=" -c:v copy output.mp4
==148740== Use of uninitialised value of size 8
==148740== at 0x484E399: rawmemchr (in /usr/libexec/valgrind
/vgpreload_memcheck-amd64-linux.so)
==148740== by 0x6FE2555: _IO_str_init_static_internal (strops.c:41)
==148740== by 0x6FADC21: _IO_strfile_read (strfile.h:92)
==148740== by 0x6FADC21: __isoc99_sscanf (isoc99_sscanf.c:28)
==148740== by 0x498D5C3: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x498D9EF: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x4A52DFC: avfilter_init_dict (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x4A53057: avfilter_init_str (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x4A809E5: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x4A81417: avfilter_graph_parse2 (in /usr/lib/x86_64
-linux-gnu/libavfilter.so.8.44.100)
==148740== by 0x116C3A: ??? (in /usr/bin/ffmpeg)
==148740== by 0x138CF8: ??? (in /usr/bin/ffmpeg)
==148740== by 0x139875: ??? (in /usr/bin/ffmpeg)
==148740==
==148740== Conditional jump or move depends on uninitialised value(s)
==148740== at 0x6FB92D8: __vfscanf_internal (vfscanf-internal.c:628)
==148740== by 0x6FADC60: __isoc99_sscanf (isoc99_sscanf.c:31)
==148740== by 0x498D5C3: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x498D9EF: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x4A52DFC: avfilter_init_dict (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x4A53057: avfilter_init_str (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x4A809E5: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==148740== by 0x4A81417: avfilter_graph_parse2 (in /usr/lib/x86_64
-linux-gnu/libavfilter.so.8.44.100)
==148740== by 0x116C3A: ??? (in /usr/bin/ffmpeg)
==148740== by 0x138CF8: ??? (in /usr/bin/ffmpeg)
==148740== by 0x139875: ??? (in /usr/bin/ffmpeg)
==148740== by 0x13C563: ??? (in /usr/bin/ffmpeg)
}}}
In this second case we end up with strncmp on an unitialised char array
(again the char array is zero)
{{{
valgrind ffmpeg -i video.mp4 -af "pan=mono|c0=1*" -c:v copy output.mp4
==151668== Conditional jump or move depends on uninitialised value(s)
==151668== at 0x484A40C: strncmp (in /usr/libexec/valgrind
/vgpreload_memcheck-amd64-linux.so)
==151668== by 0x6CA4103: av_channel_from_string (in /usr/lib/x86_64
-linux-gnu/libavutil.so.57.28.100)
==151668== by 0x498D5EE: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x498D9EF: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x4A52DFC: avfilter_init_dict (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x4A53057: avfilter_init_str (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x4A809E5: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x4A81417: avfilter_graph_parse2 (in /usr/lib/x86_64
-linux-gnu/libavfilter.so.8.44.100)
==151668== by 0x116C3A: ??? (in /usr/bin/ffmpeg)
==151668== by 0x138CF8: ??? (in /usr/bin/ffmpeg)
==151668== by 0x139875: ??? (in /usr/bin/ffmpeg)
==151668== by 0x13C563: ??? (in /usr/bin/ffmpeg)
==151668==
==151668== Conditional jump or move depends on uninitialised value(s)
==151668== at 0x484ACAC: strcmp (in /usr/libexec/valgrind
/vgpreload_memcheck-amd64-linux.so)
==151668== by 0x6CA413C: av_channel_from_string (in /usr/lib/x86_64
-linux-gnu/libavutil.so.57.28.100)
==151668== by 0x498D5EE: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x498D9EF: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x4A52DFC: avfilter_init_dict (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x4A53057: avfilter_init_str (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x4A809E5: ??? (in /usr/lib/x86_64-linux-
gnu/libavfilter.so.8.44.100)
==151668== by 0x4A81417: avfilter_graph_parse2 (in /usr/lib/x86_64
-linux-gnu/libavfilter.so.8.44.100)
==151668== by 0x116C3A: ??? (in /usr/bin/ffmpeg)
==151668== by 0x138CF8: ??? (in /usr/bin/ffmpeg)
==151668== by 0x139875: ??? (in /usr/bin/ffmpeg)
==151668== by 0x13C563: ??? (in /usr/bin/ffmpeg)
}}}
Patches should be submitted to the ffmpeg-devel mailing list and not this
bug tracker.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/10677>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
_______________________________________________
FFmpeg-trac mailing list
FFmpeg-trac@avcodec.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-trac
To unsubscribe, visit link above, or email
ffmpeg-trac-requ...@ffmpeg.org with subject "unsubscribe".