From e96506a1398f7e4298fec0458a18d6f00264fd36 Mon Sep 17 00:00:00 2001
From: dxfhgwet <noreply@example.com>
Date: Fri, 27 Oct 2017 21:53:54 -0700
Subject: [PATCH] avfilter/zscale: fix segfault on library error

---
 libavfilter/vf_zscale.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c
index 53f34b43eb..fc0ad886e4 100644
--- a/libavfilter/vf_zscale.c
+++ b/libavfilter/vf_zscale.c
@@ -314,14 +314,12 @@ fail:
     return ret;
 }
 
-static int print_zimg_error(AVFilterContext *ctx)
+static void print_zimg_error(AVFilterContext *ctx)
 {
     char err_msg[1024];
     int err_code = zimg_get_last_error(err_msg, sizeof(err_msg));
 
     av_log(ctx, AV_LOG_ERROR, "code %d: %s\n", err_code, err_msg);
-
-    return err_code;
 }
 
 static int convert_chroma_location(enum AVChromaLocation chroma_location)
@@ -449,12 +447,16 @@ static int graph_build(zimg_filter_graph **graph, zimg_graph_builder_params *par
 
     zimg_filter_graph_free(*graph);
     *graph = zimg_filter_graph_build(src_format, dst_format, params);
-    if (!*graph)
-        return print_zimg_error(NULL);
+    if (!*graph) {
+        print_zimg_error(NULL);
+        return AVERROR_EXTERNAL;
+    }
 
     ret = zimg_filter_graph_get_tmp_size(*graph, &size);
-    if (ret)
-        return print_zimg_error(NULL);
+    if (ret) {
+        print_zimg_error(NULL);
+        return AVERROR_EXTERNAL;
+    }
 
     if (size > *tmp_size) {
         av_freep(tmp);
@@ -551,7 +553,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
 
         ret = graph_build(&s->graph, &s->params, &s->src_format, &s->dst_format,
                           &s->tmp, &s->tmp_size);
-        if (ret < 0)
+        if (ret)
             goto fail;
 
         s->in_colorspace  = in->colorspace;
@@ -587,7 +589,8 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
             zimg_filter_graph_free(s->alpha_graph);
             s->alpha_graph = zimg_filter_graph_build(&s->alpha_src_format, &s->alpha_dst_format, &s->alpha_params);
             if (!s->alpha_graph) {
-                ret = print_zimg_error(link->dst);
+                print_zimg_error(link->dst);
+                ret = AVERROR_EXTERNAL;
                 goto fail;
             }
         }
@@ -625,6 +628,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
     ret = zimg_filter_graph_process(s->graph, &src_buf, &dst_buf, s->tmp, 0, 0, 0, 0);
     if (ret) {
         print_zimg_error(link->dst);
+        ret = AVERROR_EXTERNAL;
         goto fail;
     }
 
@@ -640,6 +644,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
         ret = zimg_filter_graph_process(s->alpha_graph, &src_buf, &dst_buf, s->tmp, 0, 0, 0, 0);
         if (ret) {
             print_zimg_error(link->dst);
+            ret = AVERROR_EXTERNAL;
             goto fail;
         }
     } else if (odesc->flags & AV_PIX_FMT_FLAG_ALPHA) {
-- 
2.13.2.windows.1

