Commit f593a96929 for aom
commit f593a96929891e089785eb8e1cc8e3ccbf56e28c
Author: Cheng Chen <chengchen@google.com>
Date: Mon Apr 20 10:12:12 2026 -0700
Return error if worker is not initialized
Avoid reference to uninitialized member variables.
BUG=aomedia:503691210
Change-Id: I86d5c9963afea212c200a848dfe56b9d027e291e
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index cd41f8c15e..3fbe5e53f2 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -950,6 +950,7 @@ static aom_codec_err_t ctrl_set_reference(aom_codec_alg_priv_t *ctx,
av1_ref_frame_t *const frame = data;
YV12_BUFFER_CONFIG sd;
AVxWorker *const worker = ctx->frame_worker;
+ if (worker == NULL) return AOM_CODEC_ERROR;
FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
image2yuvconfig(&frame->img, &sd);
@@ -975,6 +976,7 @@ static aom_codec_err_t ctrl_copy_reference(aom_codec_alg_priv_t *ctx,
if (frame) {
YV12_BUFFER_CONFIG sd;
AVxWorker *const worker = ctx->frame_worker;
+ if (worker == NULL) return AOM_CODEC_ERROR;
FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
image2yuvconfig(&frame->img, &sd);
return av1_copy_reference_dec(frame_worker_data->pbi, frame->idx, &sd);
@@ -989,6 +991,7 @@ static aom_codec_err_t ctrl_get_reference(aom_codec_alg_priv_t *ctx,
if (data) {
YV12_BUFFER_CONFIG *fb;
AVxWorker *const worker = ctx->frame_worker;
+ if (worker == NULL) return AOM_CODEC_ERROR;
FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
fb = get_ref_frame(&frame_worker_data->pbi->common, data->idx);
if (fb == NULL) return AOM_CODEC_ERROR;
@@ -1005,6 +1008,7 @@ static aom_codec_err_t ctrl_get_new_frame_image(aom_codec_alg_priv_t *ctx,
if (new_img) {
YV12_BUFFER_CONFIG new_frame;
AVxWorker *const worker = ctx->frame_worker;
+ if (worker == NULL) return AOM_CODEC_ERROR;
FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
if (av1_get_frame_to_show(frame_worker_data->pbi, &new_frame) == 0) {
@@ -1024,6 +1028,7 @@ static aom_codec_err_t ctrl_copy_new_frame_image(aom_codec_alg_priv_t *ctx,
if (img) {
YV12_BUFFER_CONFIG new_frame;
AVxWorker *const worker = ctx->frame_worker;
+ if (worker == NULL) return AOM_CODEC_ERROR;
FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
if (av1_get_frame_to_show(frame_worker_data->pbi, &new_frame) == 0) {
diff --git a/test/decode_api_test.cc b/test/decode_api_test.cc
index f504be053b..ca17433932 100644
--- a/test/decode_api_test.cc
+++ b/test/decode_api_test.cc
@@ -59,4 +59,25 @@ TEST(DecodeAPI, InvalidControlId) {
EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&dec));
}
+TEST(DecodeAPI, Buganizer503691210) {
+ aom_codec_iface_t *iface = aom_codec_av1_dx();
+ aom_codec_ctx_t dec;
+ aom_codec_dec_cfg_t cfg = { 1, 424, 144, 1 };
+ EXPECT_EQ(AOM_CODEC_OK, aom_codec_dec_init(&dec, iface, &cfg, 0));
+
+ av1_ref_frame_t ref;
+ ref.idx = 0;
+ // These control calls should fail with AOM_CODEC_ERROR because the decoder
+ // is not fully initialized yet (no frames decoded).
+ EXPECT_EQ(AOM_CODEC_ERROR, aom_codec_control(&dec, AV1_GET_REFERENCE, &ref));
+ EXPECT_EQ(AOM_CODEC_ERROR, aom_codec_control(&dec, AV1_SET_REFERENCE, &ref));
+ EXPECT_EQ(AOM_CODEC_ERROR, aom_codec_control(&dec, AV1_COPY_REFERENCE, &ref));
+
+ aom_image_t img;
+ EXPECT_EQ(AOM_CODEC_ERROR,
+ aom_codec_control(&dec, AV1_COPY_NEW_FRAME_IMAGE, &img));
+
+ EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&dec));
+}
+
} // namespace