diff --git a/src/draco/compression/entropy/ans.h b/src/draco/compression/entropy/ans.h index 313546fee..17318c371 100644 --- a/src/draco/compression/entropy/ans.h +++ b/src/draco/compression/entropy/ans.h @@ -441,6 +441,9 @@ class RAnsDecoder { ans_.buf_offset = offset - 3; ans_.state = mem_get_le24(buf + offset - 3) & 0x3FFFFF; } else if (x == 3) { + if (offset < 4) { + return 1; + } ans_.buf_offset = offset - 4; ans_.state = mem_get_le32(buf + offset - 4) & 0x3FFFFFFF; } else { diff --git a/src/draco/compression/mesh/mesh_sequential_decoder.cc b/src/draco/compression/mesh/mesh_sequential_decoder.cc index 124df3345..bf6f9a0f2 100644 --- a/src/draco/compression/mesh/mesh_sequential_decoder.cc +++ b/src/draco/compression/mesh/mesh_sequential_decoder.cc @@ -78,6 +78,9 @@ bool MeshSequentialDecoder::DecodeConnectivity() { if (!buffer()->Decode(&val)) { return false; } + if (val >= num_points) { + return false; + } face[j] = val; } mesh()->AddFace(face); @@ -91,6 +94,9 @@ bool MeshSequentialDecoder::DecodeConnectivity() { if (!buffer()->Decode(&val)) { return false; } + if (val >= num_points) { + return false; + } face[j] = val; } mesh()->AddFace(face); @@ -105,6 +111,9 @@ bool MeshSequentialDecoder::DecodeConnectivity() { if (!DecodeVarint(&val, buffer())) { return false; } + if (val >= num_points) { + return false; + } face[j] = val; } mesh()->AddFace(face); @@ -118,6 +127,9 @@ bool MeshSequentialDecoder::DecodeConnectivity() { if (!buffer()->Decode(&val)) { return false; } + if (val >= num_points) { + return false; + } face[j] = val; } mesh()->AddFace(face);