[FFmpeg-cvslog] x11grab: fix a memory leak exposed by valgrind

Antonio Ospite git at videolan.org
Sat Mar 17 23:52:39 CET 2012


ffmpeg | branch: master | Antonio Ospite <ospite at studenti.unina.it> | Fri Mar 16 22:23:34 2012 +0100| [d3958ab4edf49cb760412d8687c870d349f692c7] | committer: Ronald S. Bultje

x11grab: fix a memory leak exposed by valgrind

When using "-f x11grab -i :0.0" valgrind reports a definitely lost
memory block with this message:

==31544== 5 bytes in 1 blocks are definitely lost in loss record 1 of 2
==31544==    at 0x4026E68: memalign (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==31544==    by 0x4026F17: posix_memalign (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==31544==    by 0x60D399A: av_malloc (in /usr/lib/x86_64-linux-gnu/libavutil.so.51.22.1)
==31544==    by 0x60D3A70: av_strdup (in /usr/lib/x86_64-linux-gnu/libavutil.so.51.22.1)
==31544==    by 0x4A2BE58: ??? (in /usr/lib/x86_64-linux-gnu/libavdevice.so.53.2.0)
==31544==    by 0x506D29E: avformat_open_input (in /usr/lib/x86_64-linux-gnu/libavformat.so.53.21.0)
==31544==    by 0x400A80: main (in /home/ao2/WIP/am7xxx-play/tests/a.out)

The 5 bytes lost are the ones from param = av_strdup(":0.0"), so let's
free param in the exit path.

Also check the av_strdup() return value.

Note: calling av_free(param) even when av_strdup() fails and param is
NULL is OK and keeps the code simpler without adding another label to
skip av_free().

Signed-off-by: Ronald S. Bultje <rsbultje at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d3958ab4edf49cb760412d8687c870d349f692c7
---

 libavdevice/x11grab.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/libavdevice/x11grab.c b/libavdevice/x11grab.c
index 305fda6..06cec9d 100644
--- a/libavdevice/x11grab.c
+++ b/libavdevice/x11grab.c
@@ -169,6 +169,9 @@ x11grab_read_header(AVFormatContext *s1)
     AVRational framerate;
 
     param = av_strdup(s1->filename);
+    if (!param)
+        goto out;
+
     offset = strchr(param, '+');
     if (offset) {
         sscanf(offset, "%d,%d", &x_off, &y_off);
@@ -319,6 +322,7 @@ x11grab_read_header(AVFormatContext *s1)
     st->codec->bit_rate = x11grab->frame_size * 1/av_q2d(x11grab->time_base) * 8;
 
 out:
+    av_free(param);
     return ret;
 }
 



More information about the ffmpeg-cvslog mailing list