summaryrefslogtreecommitdiffstats
path: root/modules/navigation/navigation_mesh_generator.cpp
diff options
context:
space:
mode:
authorsmix8 <52464204+smix8@users.noreply.github.com>2023-06-19 20:10:39 +0200
committersmix8 <52464204+smix8@users.noreply.github.com>2023-06-19 20:58:36 +0200
commitf3a6e04f8b83cce1b7789d726e8e90950b86ca06 (patch)
treefa14d565cad1d32d316ed7f33d59abd08cd8bb15 /modules/navigation/navigation_mesh_generator.cpp
parent116f783db73f4bf7e9e96ae54dd3d0a20337cc8a (diff)
downloadredot-engine-f3a6e04f8b83cce1b7789d726e8e90950b86ca06.tar.gz
Fix potential crashes in navmesh bake geometry functions
Fixes potential crashes in navmesh geometry functions.
Diffstat (limited to 'modules/navigation/navigation_mesh_generator.cpp')
-rw-r--r--modules/navigation/navigation_mesh_generator.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/modules/navigation/navigation_mesh_generator.cpp b/modules/navigation/navigation_mesh_generator.cpp
index 88965cd439..18c8256255 100644
--- a/modules/navigation/navigation_mesh_generator.cpp
+++ b/modules/navigation/navigation_mesh_generator.cpp
@@ -92,12 +92,15 @@ void NavigationMeshGenerator::_add_mesh(const Ref<Mesh> &p_mesh, const Transform
int face_count = index_count / 3;
Array a = p_mesh->surface_get_arrays(i);
+ ERR_CONTINUE(a.is_empty() || (a.size() != Mesh::ARRAY_MAX));
Vector<Vector3> mesh_vertices = a[Mesh::ARRAY_VERTEX];
+ ERR_CONTINUE(mesh_vertices.is_empty());
const Vector3 *vr = mesh_vertices.ptr();
if (p_mesh->surface_get_format(i) & Mesh::ARRAY_FORMAT_INDEX) {
Vector<int> mesh_indices = a[Mesh::ARRAY_INDEX];
+ ERR_CONTINUE(mesh_indices.is_empty() || (mesh_indices.size() != index_count));
const int *ir = mesh_indices.ptr();
for (int j = 0; j < mesh_vertices.size(); j++) {
@@ -111,6 +114,7 @@ void NavigationMeshGenerator::_add_mesh(const Ref<Mesh> &p_mesh, const Transform
p_indices.push_back(current_vertex_count + (ir[j * 3 + 1]));
}
} else {
+ ERR_CONTINUE(mesh_vertices.size() != index_count);
face_count = mesh_vertices.size() / 3;
for (int j = 0; j < face_count; j++) {
_add_vertex(p_xform.xform(vr[j * 3 + 0]), p_vertices);
@@ -126,10 +130,14 @@ void NavigationMeshGenerator::_add_mesh(const Ref<Mesh> &p_mesh, const Transform
}
void NavigationMeshGenerator::_add_mesh_array(const Array &p_array, const Transform3D &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices) {
+ ERR_FAIL_COND(p_array.size() != Mesh::ARRAY_MAX);
+
Vector<Vector3> mesh_vertices = p_array[Mesh::ARRAY_VERTEX];
+ ERR_FAIL_COND(mesh_vertices.is_empty());
const Vector3 *vr = mesh_vertices.ptr();
Vector<int> mesh_indices = p_array[Mesh::ARRAY_INDEX];
+ ERR_FAIL_COND(mesh_indices.is_empty());
const int *ir = mesh_indices.ptr();
const int face_count = mesh_indices.size() / 3;
@@ -148,6 +156,8 @@ void NavigationMeshGenerator::_add_mesh_array(const Array &p_array, const Transf
}
void NavigationMeshGenerator::_add_faces(const PackedVector3Array &p_faces, const Transform3D &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices) {
+ ERR_FAIL_COND(p_faces.is_empty());
+ ERR_FAIL_COND(p_faces.size() % 3 != 0);
int face_count = p_faces.size() / 3;
int current_vertex_count = p_vertices.size() / 3;