|
|
- From 6d46f2d7f7617852bab7cbb2f7cae8350b99204e Mon Sep 17 00:00:00 2001
- From: Mark Harris <mark.hsj@gmail.com>
- 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,
|