avdevice/decklink_dec: fix leaks on error

In case of errors in this function, the allocated context
was not properly freed in several cases.

Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
Marvin Scholz 2024-09-12 04:58:38 +02:00 committed by Marton Balint
parent 7554346cb5
commit 8e76c99301
1 changed files with 8 additions and 4 deletions

View File

@ -1114,7 +1114,8 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
break; break;
default: default:
av_log(avctx, AV_LOG_ERROR, "Value of channels option must be one of 2, 8 or 16\n"); av_log(avctx, AV_LOG_ERROR, "Value of channels option must be one of 2, 8 or 16\n");
return AVERROR(EINVAL); ret = AVERROR(EINVAL);
goto error;
} }
/* Check audio bit depth option for valid values: 16 or 32 */ /* Check audio bit depth option for valid values: 16 or 32 */
@ -1124,18 +1125,20 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
break; break;
default: default:
av_log(avctx, AV_LOG_ERROR, "Value for audio bit depth option must be either 16 or 32\n"); av_log(avctx, AV_LOG_ERROR, "Value for audio bit depth option must be either 16 or 32\n");
return AVERROR(EINVAL); ret = AVERROR(EINVAL);
goto error;
} }
/* List available devices. */ /* List available devices. */
if (ctx->list_devices) { if (ctx->list_devices) {
ff_decklink_list_devices_legacy(avctx, 1, 0); ff_decklink_list_devices_legacy(avctx, 1, 0);
return AVERROR_EXIT; ret = AVERROR_EXIT;
goto error;
} }
ret = ff_decklink_init_device(avctx, avctx->url); ret = ff_decklink_init_device(avctx, avctx->url);
if (ret < 0) if (ret < 0)
return ret; goto error;
/* Get input device. */ /* Get input device. */
if (ctx->dl->QueryInterface(IID_IDeckLinkInput, (void **) &ctx->dli) != S_OK) { if (ctx->dl->QueryInterface(IID_IDeckLinkInput, (void **) &ctx->dli) != S_OK) {
@ -1336,6 +1339,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
error: error:
ff_decklink_cleanup(avctx); ff_decklink_cleanup(avctx);
av_freep(&cctx->ctx);
return ret; return ret;
} }