From a83bc4f59707ab5a09c24f0b04d2d57d03fb2d2b Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 14 May 2016 18:02:34 +0200 Subject: [PATCH] Fix an error in new lockfree parallel_range_next_iter_get() helper. Reading the shared state->iter value after storing it in the 'reference' var could in theory lead to a race condition setting state->iter value above state->stop, which would be 'deadly'. This **may** be the cause of T48422, though I was not able to reproduce that issue so far. --- source/blender/blenlib/intern/task.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c index 2e68e5a592f..a61b0276700 100644 --- a/source/blender/blenlib/intern/task.c +++ b/source/blender/blenlib/intern/task.c @@ -784,13 +784,13 @@ BLI_INLINE bool parallel_range_next_iter_get( { uint32_t n, olditer, previter, newiter; - if (state->iter >= state->stop) { + if (UNLIKELY(state->iter >= state->stop)) { return false; } do { olditer = state->iter; - n = min_ii(state->chunk_size, state->stop - state->iter); + n = min_ii(state->chunk_size, state->stop - olditer); newiter = olditer + n; previter = atomic_cas_uint32((uint32_t *)&state->iter, olditer, newiter); } while (UNLIKELY(previter != olditer));