Avoid memory OOB access in get_obu_length_field_size()
BUG=b/74489829
Change-Id: I6a49719f264962c1996ce9448a2bdb355916064d
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index f375922..0d5d388 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -161,9 +161,10 @@
return AOM_CODEC_OK;
}
-static size_t get_obu_length_field_size(const uint8_t *data) {
+static size_t get_obu_length_field_size(const uint8_t *data, size_t data_sz) {
+ const size_t max_bytes = AOMMIN(sizeof(uint64_t), data_sz);
size_t length_field_size = 1;
- for (size_t i = 0; i < sizeof(uint64_t) && (data[i] & 0x80); ++i) {
+ for (size_t i = 0; i < max_bytes && (data[i] & 0x80); ++i) {
++length_field_size;
}
return length_field_size;
@@ -175,7 +176,7 @@
int *is_intra_only) {
int intra_only_flag = 0;
- if (data + data_sz <= data) return AOM_CODEC_INVALID_PARAM;
+ if (data + data_sz <= data || data_sz < 1) return AOM_CODEC_INVALID_PARAM;
si->w = 0;
si->h = 0;
@@ -191,7 +192,7 @@
#if CONFIG_OBU_SIZE_AFTER_HEADER
struct aom_read_bit_buffer rb = { data, data + data_sz, 0, NULL, NULL };
#else
- const size_t length_field_size = get_obu_length_field_size(data);
+ const size_t length_field_size = get_obu_length_field_size(data, data_sz);
struct aom_read_bit_buffer rb = { data + length_field_size, data + data_sz, 0,
NULL, NULL };
#endif // CONFIG_OBU_SIZE_AFTER_HEADER
@@ -204,7 +205,7 @@
#if CONFIG_OBU_SIZE_AFTER_HEADER
// One byte has been consumed by the OBU header.
- rb.bit_offset += get_obu_length_field_size(data + 1);
+ rb.bit_offset += get_obu_length_field_size(data + 1, data_sz - 1);
#endif // CONFIG_OBU_SIZE_AFTER_HEADER
// This check is disabled because existing behavior is depended upon by