From 17c39ccb07fc438b229d280503ca050b3bb63043 Mon Sep 17 00:00:00 2001 From: Richard Stanway Date: Sun, 19 Jun 2022 23:08:06 +0200 Subject: [PATCH] obs-ffmpeg, obs-outputs: Check return of obs_encoder_get_extra_data A race condition can occur in obs-outputs where the send_thread is in the process of (re)connecting but the encoder was shut down in the meantime. This causes the expected header data to be garbage, resulting in a crash. --- plugins/obs-ffmpeg/obs-ffmpeg-mux.c | 6 ++++-- plugins/obs-outputs/flv-output.c | 6 ++++-- plugins/obs-outputs/ftl-stream.c | 3 ++- plugins/obs-outputs/rtmp-stream.c | 6 ++++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c index b7c1a381f..a36fdc5a5 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c @@ -638,7 +638,8 @@ static bool send_audio_headers(struct ffmpeg_muxer *stream, struct encoder_packet packet = { .type = OBS_ENCODER_AUDIO, .timebase_den = 1, .track_idx = idx}; - obs_encoder_get_extra_data(aencoder, &packet.data, &packet.size); + if (!obs_encoder_get_extra_data(aencoder, &packet.data, &packet.size)) + return false; return write_packet(stream, &packet); } @@ -649,7 +650,8 @@ static bool send_video_headers(struct ffmpeg_muxer *stream) struct encoder_packet packet = {.type = OBS_ENCODER_VIDEO, .timebase_den = 1}; - obs_encoder_get_extra_data(vencoder, &packet.data, &packet.size); + if (!obs_encoder_get_extra_data(vencoder, &packet.data, &packet.size)) + return false; return write_packet(stream, &packet); } diff --git a/plugins/obs-outputs/flv-output.c b/plugins/obs-outputs/flv-output.c index 9e092bc78..d7863ba43 100644 --- a/plugins/obs-outputs/flv-output.c +++ b/plugins/obs-outputs/flv-output.c @@ -119,7 +119,8 @@ static void write_audio_header(struct flv_output *stream) struct encoder_packet packet = {.type = OBS_ENCODER_AUDIO, .timebase_den = 1}; - obs_encoder_get_extra_data(aencoder, &packet.data, &packet.size); + if (!obs_encoder_get_extra_data(aencoder, &packet.data, &packet.size)) + return; write_packet(stream, &packet, true); } @@ -133,7 +134,8 @@ static void write_video_header(struct flv_output *stream) struct encoder_packet packet = { .type = OBS_ENCODER_VIDEO, .timebase_den = 1, .keyframe = true}; - obs_encoder_get_extra_data(vencoder, &header, &size); + if (!obs_encoder_get_extra_data(vencoder, &header, &size)) + return; packet.size = obs_parse_avc_header(&packet.data, header, size); write_packet(stream, &packet, true); bfree(packet.data); diff --git a/plugins/obs-outputs/ftl-stream.c b/plugins/obs-outputs/ftl-stream.c index 99d6e95c4..a0556d2a5 100644 --- a/plugins/obs-outputs/ftl-stream.c +++ b/plugins/obs-outputs/ftl-stream.c @@ -553,7 +553,8 @@ static bool send_video_header(struct ftl_stream *stream, int64_t dts_usec) .keyframe = true, .dts_usec = dts_usec}; - obs_encoder_get_extra_data(vencoder, &header, &size); + if (!obs_encoder_get_extra_data(vencoder, &header, &size)) + return false; packet.size = obs_parse_avc_header(&packet.data, header, size); return send_packet(stream, &packet, true) >= 0; } diff --git a/plugins/obs-outputs/rtmp-stream.c b/plugins/obs-outputs/rtmp-stream.c index 34f3c3489..797a8c12c 100644 --- a/plugins/obs-outputs/rtmp-stream.c +++ b/plugins/obs-outputs/rtmp-stream.c @@ -804,7 +804,8 @@ static bool send_audio_header(struct rtmp_stream *stream, size_t idx, return true; } - obs_encoder_get_extra_data(aencoder, &header, &packet.size); + if (!obs_encoder_get_extra_data(aencoder, &header, &packet.size)) + return false; packet.data = bmemdup(header, packet.size); return send_packet(stream, &packet, true, idx) >= 0; } @@ -819,7 +820,8 @@ static bool send_video_header(struct rtmp_stream *stream) struct encoder_packet packet = { .type = OBS_ENCODER_VIDEO, .timebase_den = 1, .keyframe = true}; - obs_encoder_get_extra_data(vencoder, &header, &size); + if (!obs_encoder_get_extra_data(vencoder, &header, &size)) + return false; packet.size = obs_parse_avc_header(&packet.data, header, size); return send_packet(stream, &packet, true, 0) >= 0; }