mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2025-02-21 13:22:13 +00:00
libopencv: Rework error handling in parse_iplconvkernel()
Fix 'values' memory leak in case of error. CC: libav-stable@libav.org Bug-Id: CID 739879
This commit is contained in:
parent
607ad990d3
commit
8805589b80
@ -205,7 +205,7 @@ static int parse_iplconvkernel(IplConvKernel **kernel, char *buf, void *log_ctx)
|
|||||||
{
|
{
|
||||||
char shape_filename[128] = "", shape_str[32] = "rect";
|
char shape_filename[128] = "", shape_str[32] = "rect";
|
||||||
int cols = 0, rows = 0, anchor_x = 0, anchor_y = 0, shape = CV_SHAPE_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);
|
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 {
|
} else {
|
||||||
av_log(log_ctx, AV_LOG_ERROR,
|
av_log(log_ctx, AV_LOG_ERROR,
|
||||||
"Shape unspecified or type '%s' unknown.\n", shape_str);
|
"Shape unspecified or type '%s' unknown.\n", shape_str);
|
||||||
return AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rows <= 0 || cols <= 0) {
|
if (rows <= 0 || cols <= 0) {
|
||||||
av_log(log_ctx, AV_LOG_ERROR,
|
av_log(log_ctx, AV_LOG_ERROR,
|
||||||
"Invalid non-positive values for shape size %dx%d\n", cols, rows);
|
"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) {
|
if (anchor_x < 0 || anchor_y < 0 || anchor_x >= cols || anchor_y >= rows) {
|
||||||
av_log(log_ctx, AV_LOG_ERROR,
|
av_log(log_ctx, AV_LOG_ERROR,
|
||||||
"Shape anchor %dx%d is not inside the rectangle with size %dx%d.\n",
|
"Shape anchor %dx%d is not inside the rectangle with size %dx%d.\n",
|
||||||
anchor_x, anchor_y, cols, rows);
|
anchor_x, anchor_y, cols, rows);
|
||||||
return AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
*kernel = cvCreateStructuringElementEx(cols, rows, anchor_x, anchor_y, shape, values);
|
*kernel = cvCreateStructuringElementEx(cols, rows, anchor_x, anchor_y, shape, values);
|
||||||
av_freep(&values);
|
if (!*kernel) {
|
||||||
if (!*kernel)
|
ret = AVERROR(ENOMEM);
|
||||||
return AVERROR(ENOMEM);
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
av_log(log_ctx, AV_LOG_VERBOSE, "Structuring element: w:%d h:%d x:%d y:%d shape:%s\n",
|
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);
|
rows, cols, anchor_x, anchor_y, shape_str);
|
||||||
return 0;
|
out:
|
||||||
|
av_freep(&values);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct DilateContext {
|
typedef struct DilateContext {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user