From 4cbcfd22f5d26e3cb520fa0ee0d85eedf018bab9 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 28 Dec 2021 12:22:14 -0600 Subject: Fix T94442: Trim curve node can crash with duplicate point The calculation to find the factor between two evaluated points assumed that the points were not at the same location. This assumption is some- what reasonable, since we might expect `lower_bound` to skip those point anyway. However, the report found a case where the first two evaluated points were coincident, and there is no strong reason not to make this safe, so add a check for 0 length before the division. --- source/blender/blenkernel/intern/spline_base.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/intern/spline_base.cc b/source/blender/blenkernel/intern/spline_base.cc index 4ff392a5ddb..857022345f3 100644 --- a/source/blender/blenkernel/intern/spline_base.cc +++ b/source/blender/blenkernel/intern/spline_base.cc @@ -417,7 +417,9 @@ Spline::LookupResult Spline::lookup_evaluated_length(const float length) const const int next_index = (index == this->evaluated_points_size() - 1) ? 0 : index + 1; const float previous_length = (index == 0) ? 0.0f : lengths[index - 1]; - const float factor = (length - previous_length) / (lengths[index] - previous_length); + const float length_in_segment = length - previous_length; + const float segment_length = lengths[index] - previous_length; + const float factor = segment_length == 0.0f ? 0.0f : length_in_segment / segment_length; return LookupResult{index, next_index, factor}; } -- cgit v1.2.3