avdevice/avfoundation: check strdup

This commit is contained in:
Zhao Zhili 2022-02-05 00:19:35 +08:00 committed by Thilo Borgmann
parent 6b708592fa
commit 079de49912
1 changed files with 10 additions and 2 deletions

View File

@ -310,18 +310,21 @@ static void destroy_context(AVFContext* ctx)
} }
} }
static void parse_device_name(AVFormatContext *s) static int parse_device_name(AVFormatContext *s)
{ {
AVFContext *ctx = (AVFContext*)s->priv_data; AVFContext *ctx = (AVFContext*)s->priv_data;
ctx->url = av_strdup(s->url); ctx->url = av_strdup(s->url);
char *save; char *save;
if (!ctx->url)
return AVERROR(ENOMEM);
if (ctx->url[0] != ':') { if (ctx->url[0] != ':') {
ctx->video_filename = av_strtok(ctx->url, ":", &save); ctx->video_filename = av_strtok(ctx->url, ":", &save);
ctx->audio_filename = av_strtok(NULL, ":", &save); ctx->audio_filename = av_strtok(NULL, ":", &save);
} else { } else {
ctx->audio_filename = av_strtok(ctx->url, ":", &save); ctx->audio_filename = av_strtok(ctx->url, ":", &save);
} }
return 0;
} }
/** /**
@ -760,6 +763,7 @@ static int get_audio_config(AVFormatContext *s)
static int avf_read_header(AVFormatContext *s) static int avf_read_header(AVFormatContext *s)
{ {
int ret = 0;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
uint32_t num_screens = 0; uint32_t num_screens = 0;
AVFContext *ctx = (AVFContext*)s->priv_data; AVFContext *ctx = (AVFContext*)s->priv_data;
@ -812,7 +816,9 @@ static int avf_read_header(AVFormatContext *s)
} }
// parse input filename for video and audio device // parse input filename for video and audio device
parse_device_name(s); ret = parse_device_name(s);
if (ret)
goto fail;
// check for device index given in filename // check for device index given in filename
if (ctx->video_device_index == -1 && ctx->video_filename) { if (ctx->video_device_index == -1 && ctx->video_filename) {
@ -1002,6 +1008,8 @@ static int avf_read_header(AVFormatContext *s)
fail: fail:
[pool release]; [pool release];
destroy_context(ctx); destroy_context(ctx);
if (ret)
return ret;
return AVERROR(EIO); return AVERROR(EIO);
} }