From bf7521b8672fe7554ade075542ba4e8ffe6f7305 Mon Sep 17 00:00:00 2001 From: Walter Doekes Date: Sun, 17 Jul 2022 22:16:36 +0200 Subject: [PATCH] Do not crash in Winding_Clip when using -D_GLIBCXX_ASSERTIONS When setting -D_GLIBCXX_ASSERTIONS, invalid vector accesses are found, like empty_vector.back(). In this case, the result was not used so the bug wasn't found without the assertion. This changeset fixes so dragging a brush to 0 size does not crash/abort netradiant. Closes #156. --- radiant/winding.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radiant/winding.cpp b/radiant/winding.cpp index 9651af2c..8865db52 100644 --- a/radiant/winding.cpp +++ b/radiant/winding.cpp @@ -194,6 +194,10 @@ const double DEBUG_EPSILON_SQUARED = DEBUG_EPSILON * DEBUG_EPSILON; /// If \p winding is completely in back of the plane, \p clipped will be empty. /// If \p winding intersects the plane, the edge of \p clipped which lies on \p clipPlane will store the value of \p adjacent. void Winding_Clip( const FixedWinding& winding, const Plane3& plane, const Plane3& clipPlane, std::size_t adjacent, FixedWinding& clipped ){ + // if there are no points, we're done + if ( winding.size() == 0 ) { + return; + } PlaneClassification classification = Winding_ClassifyDistance( plane3_distance_to_point( clipPlane, winding.back().vertex ), ON_EPSILON ); PlaneClassification nextClassification; // for each edge -- 2.39.2