[vlc-commits] vout: spu: check module and filter chains at creation

Thomas Guillem git at videolan.org
Thu Jun 6 07:40:17 CEST 2019


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Mon Jun  3 15:38:45 2019 +0200| [06f17d0962c34b7489fdef9b642e52421d48d608] | committer: Thomas Guillem

vout: spu: check module and filter chains at creation

This also fixes a possible null-deref with source_chain and filter_chain.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=06f17d0962c34b7489fdef9b642e52421d48d608
---

 src/video_output/vout_subpictures.c | 42 ++++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 17 deletions(-)

diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c
index bd07493ce1..247321f29c 100644
--- a/src/video_output/vout_subpictures.c
+++ b/src/video_output/vout_subpictures.c
@@ -203,6 +203,11 @@ static filter_t *SpuRenderCreateAndLoadText(spu_t *spu)
     text->pf_get_attachments = spu_get_attachments;
 
     text->p_module = module_need_var(text, "text renderer", "text-renderer");
+    if (!text->p_module)
+    {
+        vlc_object_delete(text);
+        return NULL;
+    }
 
     /* Create a few variables used for enhanced text rendering */
     var_Create(text, "spu-elapsed",   VLC_VAR_INTEGER);
@@ -241,6 +246,11 @@ static filter_t *SpuRenderCreateAndLoadScale(vlc_object_t *object,
     scale->owner.video = &spu_scaler_cbs;
 
     scale->p_module = module_need(scale, "video converter", NULL, false);
+    if (!scale->p_module)
+    {
+        vlc_object_delete(scale);
+        return NULL;
+    }
 
     return scale;
 }
@@ -254,9 +264,6 @@ static void SpuRenderText(spu_t *spu, bool *rerender_text,
 
     assert(region->fmt.i_chroma == VLC_CODEC_TEXT);
 
-    if (!text || !text->p_module)
-        return;
-
     /* Setup 3 variables which can be used to render
      * time-dependent text (and effects). The first indicates
      * the total amount of time the text will be on screen,
@@ -858,10 +865,8 @@ static void SpuRenderRegion(spu_t *spu,
     }
 
     /* Scale from rendered size to destination size */
-    if (sys->scale && sys->scale->p_module &&
-        (!using_palette || (sys->scale_yuvp && sys->scale_yuvp->p_module)) &&
-        (scale_size.w != SCALE_UNIT || scale_size.h != SCALE_UNIT ||
-        using_palette || convert_chroma)) {
+    if (scale_size.w != SCALE_UNIT || scale_size.h != SCALE_UNIT || convert_chroma)
+    {
         const unsigned dst_width  = spu_scale_w(region->fmt.i_visible_width,  scale_size);
         const unsigned dst_height = spu_scale_h(region->fmt.i_visible_height, scale_size);
 
@@ -1123,14 +1128,12 @@ static subpicture_t *SpuRenderSubpictures(spu_t *spu,
             subpic->i_original_picture_height = fmt_src->i_visible_height;
         }
 
-        if (sys->text) {
-            /* FIXME aspect ratio ? */
-            sys->text->fmt_out.video.i_width          =
-            sys->text->fmt_out.video.i_visible_width  = subpic->i_original_picture_width;
+        /* FIXME aspect ratio ? */
+        sys->text->fmt_out.video.i_width          =
+        sys->text->fmt_out.video.i_visible_width  = subpic->i_original_picture_width;
 
-            sys->text->fmt_out.video.i_height         =
-            sys->text->fmt_out.video.i_visible_height = subpic->i_original_picture_height;
-        }
+        sys->text->fmt_out.video.i_height         =
+        sys->text->fmt_out.video.i_visible_height = subpic->i_original_picture_height;
 
         /* Render all regions
          * We always transform non absolute subtitle into absolute one on the
@@ -1364,9 +1367,6 @@ spu_t *spu_Create(vlc_object_t *object, vout_thread_t *vout)
     SpuHeapInit(&sys->heap);
 
     sys->clock = NULL;
-    sys->text = NULL;
-    sys->scale = NULL;
-    sys->scale_yuvp = NULL;
 
     atomic_init(&sys->margin, var_InheritInteger(spu, "sub-margin"));
 
@@ -1392,6 +1392,14 @@ spu_t *spu_Create(vlc_object_t *object, vout_thread_t *vout)
     sys->scale_yuvp = SpuRenderCreateAndLoadScale(VLC_OBJECT(spu),
                                                   VLC_CODEC_YUVP, VLC_CODEC_YUVA, false);
 
+
+    if (!sys->source_chain || !sys->filter_chain || !sys->text || !sys->scale
+     || !sys->scale_yuvp)
+    {
+        sys->vout = NULL;
+        spu_Destroy(spu);
+        return NULL;
+    }
     /* */
     sys->last_sort_date = -1;
     sys->vout = vout;



More information about the vlc-commits mailing list