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