From 6d46f2d7f7617852bab7cbb2f7cae8350b99204e Mon Sep 17 00:00:00 2001 From: Mark Harris Date: Mon, 28 Dec 2020 17:01:39 -0800 Subject: [PATCH] Fix use of uninitialized fields enc->streams->end_granule used uninitialized in encode_buffer() if the stream contains no audio (opusenc_example /dev/null out.opus). enc->frame_size_request used uninitialized in encode_buffer() if the frame size was not explicitly set. enc->callbacks used uninitialized if the encoder is created with ope_encoder_create_callbacks() and callbacks is NULL. --- src/opusenc.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) --- a/src/opusenc.c +++ b/src/opusenc.c @@ -361,8 +361,7 @@ static void stream_destroy(EncStream *st free(stream); } -/* Create a new OggOpus file (callback-based). */ -OggOpusEnc *ope_encoder_create_callbacks(const OpusEncCallbacks *callbacks, void *user_data, +static OggOpusEnc *ope_encoder_create_callbacks_impl(const OpusEncCallbacks *callbacks, void *user_data, OggOpusComments *comments, opus_int32 rate, int channels, int family, int *error) { OggOpusEnc *enc=NULL; int ret; @@ -395,11 +394,11 @@ OggOpusEnc *ope_encoder_create_callbacks enc->oggp = NULL; /* Not initializing anything is an unrecoverable error. */ enc->unrecoverable = family == -1 ? OPE_TOO_LATE : 0; - enc->pull_api = 0; enc->packet_callback = NULL; enc->rate = rate; enc->channels = channels; enc->frame_size = 960; + enc->frame_size_request = OPUS_FRAMESIZE_20_MS; enc->decision_delay = 96000; enc->max_ogg_delay = 48000; enc->chaining_keyframe = NULL; @@ -447,8 +446,12 @@ OggOpusEnc *ope_encoder_create_callbacks if (callbacks != NULL) { enc->callbacks = *callbacks; + enc->pull_api = 0; + } else { + enc->pull_api = 1; } enc->streams->user_data = user_data; + enc->streams->end_granule = 0; if (error) *error = OPE_OK; return enc; fail: @@ -462,11 +465,19 @@ fail: return NULL; } +/* Create a new OggOpus stream (callback-based). */ +OggOpusEnc *ope_encoder_create_callbacks(const OpusEncCallbacks *callbacks, void *user_data, + OggOpusComments *comments, opus_int32 rate, int channels, int family, int *error) { + if (callbacks == NULL) { + if (error) *error = OPE_BAD_ARG; + return NULL; + } + return ope_encoder_create_callbacks_impl(callbacks, user_data, comments, rate, channels, family, error); +} + /* Create a new OggOpus stream, pulling one page at a time. */ OggOpusEnc *ope_encoder_create_pull(OggOpusComments *comments, opus_int32 rate, int channels, int family, int *error) { - OggOpusEnc *enc = ope_encoder_create_callbacks(NULL, NULL, comments, rate, channels, family, error); - if (enc) enc->pull_api = 1; - return enc; + return ope_encoder_create_callbacks_impl(NULL, NULL, comments, rate, channels, family, error); } int ope_encoder_deferred_init_with_mapping(OggOpusEnc *enc, int family, int streams,