From 427d61131a1af5eed48d5428e723ab4602b56cc1 Mon Sep 17 00:00:00 2001 From: Mark Harris Date: Tue, 29 Dec 2020 01:43:37 -0800 Subject: [PATCH] Fix use of uninitialized serialno Also do not crash if OPE_GET_SERIALNO_REQUEST is used after draining. --- src/opusenc.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) --- a/src/opusenc.c +++ b/src/opusenc.c @@ -356,6 +356,11 @@ fail: return NULL; } +static void stream_generate_serialno(EncStream *stream) { + stream->serialno = rand(); + stream->serialno_is_set = 1; +} + static void stream_destroy(EncStream *stream) { if (stream->comment) free(stream->comment); free(stream); @@ -512,9 +517,7 @@ int ope_encoder_deferred_init_with_mappi static void init_stream(OggOpusEnc *enc) { assert(!enc->streams->stream_is_init); - if (!enc->streams->serialno_is_set) { - enc->streams->serialno = rand(); - } + if (!enc->streams->serialno_is_set) stream_generate_serialno(enc->streams); if (enc->oggp != NULL) oggp_chain(enc->oggp, enc->streams->serialno); else { @@ -1071,6 +1074,11 @@ int ope_encoder_ctl(OggOpusEnc *enc, int case OPE_GET_SERIALNO_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); + if (!enc->last_stream) { + ret = OPE_TOO_LATE; + break; + } + if (!enc->last_stream->serialno_is_set) stream_generate_serialno(enc->last_stream); *value = enc->last_stream->serialno; } break;