From 626bf0fc4587f70bd15ab585f58d026ff2b555cd Mon Sep 17 00:00:00 2001 From: Adam Kewley Date: Mon, 29 Jul 2024 15:51:12 +0200 Subject: [PATCH] Fix UB found by libASAN build --- src/oscar/Graphics/GraphicsImplementation.cpp | 10 ++++++++-- tests/testoscar/Graphics/TestMesh.cpp | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/oscar/Graphics/GraphicsImplementation.cpp b/src/oscar/Graphics/GraphicsImplementation.cpp index 2d68e4ccb5..21c2dfd8a4 100644 --- a/src/oscar/Graphics/GraphicsImplementation.cpp +++ b/src/oscar/Graphics/GraphicsImplementation.cpp @@ -4923,8 +4923,14 @@ class osc::Mesh::Impl final { { indices_are_32bit_ = false; num_indices_ = indices.size(); - indices_data_.resize((indices.size()+1)/2); - rgs::copy(indices, &indices_data_.front().u16.a); + + if (not indices.empty()) { + indices_data_.resize((indices.size()+1)/2); + rgs::copy(indices, &indices_data_.front().u16.a); + } + else { + indices_data_.clear(); + } range_check_indices_and_recalculate_bounds(flags); version_->reset(); diff --git a/tests/testoscar/Graphics/TestMesh.cpp b/tests/testoscar/Graphics/TestMesh.cpp index 83bcebff92..b6199afdfd 100644 --- a/tests/testoscar/Graphics/TestMesh.cpp +++ b/tests/testoscar/Graphics/TestMesh.cpp @@ -809,6 +809,24 @@ TEST(Mesh, SetIndicesThrowsIfOutOfBounds) ASSERT_ANY_THROW({ m.set_indices(iota_index_range(3, 6)); }) << "should throw: indices are out-of-bounds"; } +TEST(Mesh, SetIndices16BitWorksWithEmptyVector) +{ + std::vector indices; + Mesh m; + m.set_vertices(generate_vertices(3)); + m.set_indices(indices); // should just work + ASSERT_TRUE(m.indices().empty()); +} + +TEST(Mesh, SetIndices32BitWorksWithEmptyVector) +{ + std::vector indices; + Mesh m; + m.set_vertices(generate_vertices(3)); + m.set_indices(indices); // should just work + ASSERT_TRUE(m.indices().empty()); +} + TEST(Mesh, SetIndiciesWithDontValidateIndicesAndDontRecalculateBounds) { Mesh m;