Fix OOB memory access in av1_decode_frame_from_obus()
BUG=aomedia:1720
Change-Id: Iab6931f1aff229f007569150c2f14a3ce5301f16
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c
index 156bd26..d558e8a 100644
--- a/av1/decoder/obu.c
+++ b/av1/decoder/obu.c
@@ -413,6 +413,10 @@
}
if (!cm->is_annexb) {
+ if (data_end < data + obu_header.size) {
+ cm->error.error_code = AOM_CODEC_CORRUPT_FRAME;
+ return;
+ }
if (read_obu_size(data + obu_header.size,
bytes_available - obu_header.size, &payload_size,
&length_field_size) != AOM_CODEC_OK) {
@@ -501,6 +505,10 @@
decoded_payload_size = payload_size;
break;
}
+ if (data_end < data + payload_size) {
+ cm->error.error_code = AOM_CODEC_CORRUPT_FRAME;
+ return;
+ }
decoded_payload_size = read_metadata(data, payload_size);
break;
case OBU_PADDING:
@@ -516,6 +524,11 @@
return;
}
+ if (data_end < data + payload_size) {
+ cm->error.error_code = AOM_CODEC_CORRUPT_FRAME;
+ return;
+ }
+
// If there are extra padding bytes, they should all be zero
while (decoded_payload_size < payload_size) {
uint8_t padding_byte = data[decoded_payload_size++];
@@ -526,9 +539,5 @@
}
data += payload_size;
- if (data_end < data) {
- cm->error.error_code = AOM_CODEC_CORRUPT_FRAME;
- return;
- }
}
}