diff --git a/xs/src/libslic3r/TriangleMesh.cpp b/xs/src/libslic3r/TriangleMesh.cpp index c13802c1d6..ea04172aff 100644 --- a/xs/src/libslic3r/TriangleMesh.cpp +++ b/xs/src/libslic3r/TriangleMesh.cpp @@ -37,7 +37,7 @@ TriangleMesh::TriangleMesh() stl_initialize(&this->stl); } -TriangleMesh::TriangleMesh(const Pointf3* points, const Point3* facets, size_t n_facets) +TriangleMesh::TriangleMesh(const Pointf3* points, size_t n_points, const Point3* facets, size_t n_facets) : repaired(false) { stl_initialize(&this->stl); @@ -51,6 +51,13 @@ TriangleMesh::TriangleMesh(const Pointf3* points, const Point3* facets, size_t n stl_allocate(&stl); for (int i = 0; i < stl.stats.number_of_facets; i++) { + + if (facets[i].x >= n_points || + facets[i].y >= n_points || + facets[i].z >= n_points) { + throw std::runtime_error("Invalid facet"); + } + stl_facet facet; facet.normal.x = 0; facet.normal.y = 0; diff --git a/xs/src/libslic3r/TriangleMesh.hpp b/xs/src/libslic3r/TriangleMesh.hpp index 3b1702f938..da6c748593 100644 --- a/xs/src/libslic3r/TriangleMesh.hpp +++ b/xs/src/libslic3r/TriangleMesh.hpp @@ -42,7 +42,7 @@ class TriangleMesh /// First argument is a container (either vector or array) of Pointf3 for the vertex data. /// Second argument is container of facets (currently Point3). template - TriangleMesh(const Vertex_Cont& vertices, const Facet_Cont& facets) : TriangleMesh(vertices.data(), facets.data(), facets.size()) {} + TriangleMesh(const Vertex_Cont& vertices, const Facet_Cont& facets) : TriangleMesh(vertices.data(), vertices.size(), facets.data(), facets.size()) {} TriangleMesh(const TriangleMesh &other); /// copy assignment @@ -163,7 +163,7 @@ class TriangleMesh /// Private constructor that is called from the public sphere. /// It doesn't do any bounds checking on points and operates on raw pointers, so we hide it. /// Other constructors can call this one! - TriangleMesh(const Pointf3* points, const Point3* facets, size_t n_facets); + TriangleMesh(const Pointf3* points, size_t n_points, const Point3* facets, size_t n_facets); /// Perform the mechanics of a stl copy void clone(const TriangleMesh& other);