From d98f9a3c92cc096351e0d00a9dc49b5ab6f6a371 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 15 Jul 2015 08:19:55 +0200 Subject: [PATCH] Fix failed assertion in ScriptUtils::Intersection fixes #9621 --- lib/base/scriptutils.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index e51430cce..3c4caff6a 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -138,7 +138,10 @@ Array::Ptr ScriptUtils::Intersection(const std::vector& arguments) Array::Ptr arr1 = arg1->ShallowClone(); for (std::vector::size_type i = 1; i < arguments.size(); i++) { - std::sort(arr1->Begin(), arr1->End()); + { + ObjectLock olock(arr1); + std::sort(arr1->Begin(), arr1->End()); + } Array::Ptr arg2 = arguments[i]; @@ -146,11 +149,19 @@ Array::Ptr ScriptUtils::Intersection(const std::vector& arguments) return result; Array::Ptr arr2 = arg2->ShallowClone(); - std::sort(arr2->Begin(), arr2->End()); + { + ObjectLock olock(arr2); + std::sort(arr2->Begin(), arr2->End()); + } result->Resize(std::max(arr1->GetLength(), arr2->GetLength())); - Array::Iterator it = std::set_intersection(arr1->Begin(), arr1->End(), arr2->Begin(), arr2->End(), result->Begin()); - result->Resize(it - result->Begin()); + Array::SizeType len; + { + ObjectLock olock(arr1), xlock(arr2), ylock(result); + Array::Iterator it = std::set_intersection(arr1->Begin(), arr1->End(), arr2->Begin(), arr2->End(), result->Begin()); + len = it - result->Begin(); + } + result->Resize(len); arr1 = result; } -- 2.40.0