Browse Source

Tests: Fix use-after-free in TestRefPtr.self_observers

We can't unref an object to destruction while there's still a live
RefPtr to the object, otherwise the RefPtr destructor will try to
destroy it again, accessing the refcount of a destroyed object (before
realizing that oops! the object is already dead)
Andrew Kaster 4 years ago
parent
commit
09fe9f4542
1 changed files with 14 additions and 14 deletions
  1. 14 14
      Tests/AK/TestRefPtr.cpp

+ 14 - 14
Tests/AK/TestRefPtr.cpp

@@ -129,22 +129,22 @@ TEST_CASE(assign_copy_self)
 
 
 TEST_CASE(self_observers)
 TEST_CASE(self_observers)
 {
 {
-    RefPtr<SelfAwareObject> object = adopt_ref(*new SelfAwareObject);
-    EXPECT_EQ(object->ref_count(), 1u);
-    EXPECT_EQ(object->m_has_one_ref_left, false);
-    EXPECT_EQ(SelfAwareObject::num_destroyed, 0u);
-
-    object->ref();
-    EXPECT_EQ(object->ref_count(), 2u);
-    EXPECT_EQ(object->m_has_one_ref_left, false);
-    EXPECT_EQ(SelfAwareObject::num_destroyed, 0u);
+    {
+        RefPtr<SelfAwareObject> object = adopt_ref(*new SelfAwareObject);
+        EXPECT_EQ(object->ref_count(), 1u);
+        EXPECT_EQ(object->m_has_one_ref_left, false);
+        EXPECT_EQ(SelfAwareObject::num_destroyed, 0u);
 
 
-    object->unref();
-    EXPECT_EQ(object->ref_count(), 1u);
-    EXPECT_EQ(object->m_has_one_ref_left, true);
-    EXPECT_EQ(SelfAwareObject::num_destroyed, 0u);
+        object->ref();
+        EXPECT_EQ(object->ref_count(), 2u);
+        EXPECT_EQ(object->m_has_one_ref_left, false);
+        EXPECT_EQ(SelfAwareObject::num_destroyed, 0u);
 
 
-    object->unref();
+        object->unref();
+        EXPECT_EQ(object->ref_count(), 1u);
+        EXPECT_EQ(object->m_has_one_ref_left, true);
+        EXPECT_EQ(SelfAwareObject::num_destroyed, 0u);
+    }
     EXPECT_EQ(SelfAwareObject::num_destroyed, 1u);
     EXPECT_EQ(SelfAwareObject::num_destroyed, 1u);
 }
 }