Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2021-12-28 21:22:14 +0300
committerPhilipp Oeser <info@graphics-engineer.com>2022-01-11 12:06:54 +0300
commit512014f04216de3d488a8b4732fb72d538e38858 (patch)
tree5a0947d085bb1e53ce2a40f01511e4cfc9907578 /source/blender
parent3d5dbc1c44907c73d2e6e57a146cbadaea9623bd (diff)
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.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/spline_base.cc4
1 files changed, 3 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/spline_base.cc b/source/blender/blenkernel/intern/spline_base.cc
index c2c9d178171..adbe6ff337a 100644
--- a/source/blender/blenkernel/intern/spline_base.cc
+++ b/source/blender/blenkernel/intern/spline_base.cc
@@ -444,7 +444,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};
}