ObuParser::ParseFrameParameters: validate ref frame index avoids propagating a potentially uninitialized SymbolDecoderContext PiperOrigin-RevId: 320788595 Change-Id: I51bfc2db3e741b713eacf48c9426880efee0c0f6
diff --git a/src/decoder_impl.cc b/src/decoder_impl.cc index cf48862..e40c692 100644 --- a/src/decoder_impl.cc +++ b/src/decoder_impl.cc
@@ -1407,6 +1407,7 @@ const int index = frame_header .reference_frame_index[frame_header.primary_reference_frame]; + assert(index != -1); const RefCountedBuffer* prev_frame = state.reference_frame[index].get(); frame_scratch_buffer->symbol_decoder_context = prev_frame->FrameContext(); if (frame_header.segmentation.enabled &&
diff --git a/src/obu_parser.cc b/src/obu_parser.cc index 6b8ad51..41df909 100644 --- a/src/obu_parser.cc +++ b/src/obu_parser.cc
@@ -2000,14 +2000,24 @@ OBU_READ_LITERAL_OR_FAIL(3); frame_header_.reference_frame_index[i] = scratch; } + const int reference_frame_index = frame_header_.reference_frame_index[i]; + assert(reference_frame_index >= 0); + // Section 6.8.2: It is a requirement of bitstream conformance that + // RefValid[ ref_frame_idx[ i ] ] is equal to 1 ... + // The remainder of the statement is handled by ParseSequenceHeader(). + // Note if support for Annex C: Error resilience behavior is added this + // check should be omitted per C.5 Decoder consequences of processable + // frames. + if (!decoder_state_.reference_valid[reference_frame_index]) { + LIBGAV1_DLOG(ERROR, "ref_frame_idx[%d] (%d) is not valid.", i, + reference_frame_index); + return false; + } // Check if the inter frame requests a nonexistent reference, whether or // not frame_refs_short_signaling is used. - assert(frame_header_.reference_frame_index[i] >= 0); - if (decoder_state_ - .reference_frame[frame_header_.reference_frame_index[i]] == - nullptr) { + if (decoder_state_.reference_frame[reference_frame_index] == nullptr) { LIBGAV1_DLOG(ERROR, "ref_frame_idx[%d] (%d) is not a decoded frame.", i, - frame_header_.reference_frame_index[i]); + reference_frame_index); return false; } if (sequence_header_.frame_id_numbers_present) { @@ -2026,13 +2036,11 @@ // Section 6.8.2: It is a requirement of bitstream conformance that // RefValid[ ref_frame_idx[ i ] ] is equal to 1, ... if (frame_header_.expected_frame_id[i] != - decoder_state_.reference_frame_id - [frame_header_.reference_frame_index[i]] || - !decoder_state_ - .reference_valid[frame_header_.reference_frame_index[i]]) { + decoder_state_.reference_frame_id[reference_frame_index] || + !decoder_state_.reference_valid[reference_frame_index]) { LIBGAV1_DLOG(ERROR, "Reference buffer %d has a frame id number mismatch.", - frame_header_.reference_frame_index[i]); + reference_frame_index); return false; } }