On 03.12.2014 01:28, Michael Niedermayer wrote:
On Wed, Dec 03, 2014 at 01:24:55AM +0100, Lukasz Marek wrote:
On 03.12.2014 01:15, Michael Niedermayer wrote:
On Wed, Dec 03, 2014 at 12:06:47AM +0100, Lukasz Marek wrote:
This prevents potential crash when opt API is used without a class.

Signed-off-by: Lukasz Marek <lukasz.m.lu...@gmail.com>
---
  libavcodec/options.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/options.c b/libavcodec/options.c
index 7f9fb07..42ef754 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -196,7 +196,7 @@ int avcodec_copy_context(AVCodecContext *dest, const 
AVCodecContext *src)

      dest->priv_data       = orig_priv_data;

-    if (orig_priv_data)
+    if (orig_priv_data && src->codec && src->codec->priv_class)
          av_opt_copy(orig_priv_data, src->priv_data);


"&& src->codec->priv_class" <--- LGTM
the src->codec check is probably ok too but is it NULL ever ?

after avcodec_alloc_context3(NULL)?
IIRC there was a patch recently that set codec in
avcodec_alloc_context3 (via avcodec_get_context_defaults3) when
provided. Maybe after that it is not so common case. But still when
allocated with NULL then you have NULL there. src context doesn't
have to be open neither.

ok

I'm sorry for doing a mess recently regarding this damn avcodec_copy_context function. I'm sending updated patch.
I will send in a moment patchset with test for it.
The test doesn't cover everything (it is kinda hard to test it), but it should cover options management. Just to clear, I will ping in one more in a moment and don't bother with any other atm :)

>From d8884452f3bd0af45e459c7c2b2549b7a225ed4d Mon Sep 17 00:00:00 2001
From: Lukasz Marek <lukasz.m.lu...@gmail.com>
Date: Tue, 2 Dec 2014 23:24:15 +0100
Subject: [PATCH] lavc/options: don't copy priv context when it is not AVOption
 object

This prevents potential crash when opt API is used without a class.

Signed-off-by: Lukasz Marek <lukasz.m.lu...@gmail.com>
---
 libavcodec/options.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/libavcodec/options.c b/libavcodec/options.c
index 7f9fb07..49c8b40 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -195,11 +195,12 @@ int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src)
     av_opt_copy(dest, src);
 
     dest->priv_data       = orig_priv_data;
+    dest->codec           = orig_codec;
 
-    if (orig_priv_data)
+    if (orig_priv_data && src->codec && src->codec->priv_class &&
+        dest->codec && dest->codec->priv_class)
         av_opt_copy(orig_priv_data, src->priv_data);
 
-    dest->codec           = orig_codec;
 
     /* set values specific to opened codecs back to their default state */
     dest->slice_offset    = NULL;
-- 
1.9.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to