]> granicus.if.org Git - icinga2/commitdiff
Fix failed assertion in ScriptUtils::Intersection
authorGunnar Beutner <gunnar@beutner.name>
Wed, 15 Jul 2015 06:19:55 +0000 (08:19 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 15 Jul 2015 06:20:30 +0000 (08:20 +0200)
fixes #9621

lib/base/scriptutils.cpp

index 7ce6d4bbf6a8d635e107dc09e85101ff99f82a63..942297a78ede45e1148701f4091592d0419321cd 100644 (file)
@@ -139,7 +139,10 @@ Array::Ptr ScriptUtils::Intersection(const std::vector<Value>& arguments)
        Array::Ptr arr1 = arg1->ShallowClone();
 
        for (std::vector<Value>::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];
 
@@ -147,11 +150,19 @@ Array::Ptr ScriptUtils::Intersection(const std::vector<Value>& 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;
        }