aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVittorio Giovara <vittorio.giovara@gmail.com>2015-01-23 16:15:37 +0000
committerVittorio Giovara <vittorio.giovara@gmail.com>2015-01-27 15:26:37 +0000
commit8805589b803fab5f362008306319336ac79a3fa7 (patch)
tree42101057ca5d117e7e8cad8a59b43714b4b95d37
parent607ad990d31e6be52980970e5ce8cd25ab3de812 (diff)
downloadffmpeg-8805589b803fab5f362008306319336ac79a3fa7.tar.gz
libopencv: Rework error handling in parse_iplconvkernel()
Fix 'values' memory leak in case of error. CC: libav-stable@libav.org Bug-Id: CID 739879
-rw-r--r--libavfilter/vf_libopencv.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/libavfilter/vf_libopencv.c b/libavfilter/vf_libopencv.c
index bd3d59bc6b..31fad1fb24 100644
--- a/libavfilter/vf_libopencv.c
+++ b/libavfilter/vf_libopencv.c
@@ -205,7 +205,7 @@ static int parse_iplconvkernel(IplConvKernel **kernel, char *buf, void *log_ctx)
{
char shape_filename[128] = "", shape_str[32] = "rect";
int cols = 0, rows = 0, anchor_x = 0, anchor_y = 0, shape = CV_SHAPE_RECT;
- int *values = NULL, ret;
+ int *values = NULL, ret = 0;
sscanf(buf, "%dx%d+%dx%d/%32[^=]=%127s", &cols, &rows, &anchor_x, &anchor_y, shape_str, shape_filename);
@@ -219,30 +219,36 @@ static int parse_iplconvkernel(IplConvKernel **kernel, char *buf, void *log_ctx)
} else {
av_log(log_ctx, AV_LOG_ERROR,
"Shape unspecified or type '%s' unknown.\n", shape_str);
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto out;
}
if (rows <= 0 || cols <= 0) {
av_log(log_ctx, AV_LOG_ERROR,
"Invalid non-positive values for shape size %dx%d\n", cols, rows);
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto out;
}
if (anchor_x < 0 || anchor_y < 0 || anchor_x >= cols || anchor_y >= rows) {
av_log(log_ctx, AV_LOG_ERROR,
"Shape anchor %dx%d is not inside the rectangle with size %dx%d.\n",
anchor_x, anchor_y, cols, rows);
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto out;
}
*kernel = cvCreateStructuringElementEx(cols, rows, anchor_x, anchor_y, shape, values);
- av_freep(&values);
- if (!*kernel)
- return AVERROR(ENOMEM);
+ if (!*kernel) {
+ ret = AVERROR(ENOMEM);
+ goto out;
+ }
av_log(log_ctx, AV_LOG_VERBOSE, "Structuring element: w:%d h:%d x:%d y:%d shape:%s\n",
rows, cols, anchor_x, anchor_y, shape_str);
- return 0;
+out:
+ av_freep(&values);
+ return ret;
}
typedef struct DilateContext {