소스 검색

LibJS: Dereference intrinsic accessor before deleting it

The iterator used to find an intrinsic accessor is used after calling
`HashMap.remove()` on it, which works for our current implementation but
will fall apart when you consider that modifications to the hash map
might invalidate all existing iterators that came from it, as many
implementations do.

Since we're aiming to replace our `HashTable` implementation with
something new, let's fix this first :^)
Jelle Raaijmakers 2 년 전
부모
커밋
8f015a18a5
1개의 변경된 파일5개의 추가작업 그리고 4개의 파일을 삭제
  1. 5 4
      Userland/Libraries/LibJS/Runtime/Object.cpp

+ 5 - 4
Userland/Libraries/LibJS/Runtime/Object.cpp

@@ -1007,12 +1007,13 @@ static Optional<Object::IntrinsicAccessor> find_intrinsic_accessor(Object const*
     if (intrinsics == s_intrinsics.end())
     if (intrinsics == s_intrinsics.end())
         return {};
         return {};
 
 
-    auto accessor = intrinsics->value.find(property_key.as_string());
-    if (accessor == intrinsics->value.end())
+    auto accessor_iterator = intrinsics->value.find(property_key.as_string());
+    if (accessor_iterator == intrinsics->value.end())
         return {};
         return {};
 
 
-    intrinsics->value.remove(accessor);
-    return move(accessor->value);
+    auto accessor = accessor_iterator->value;
+    intrinsics->value.remove(accessor_iterator);
+    return accessor;
 }
 }
 
 
 Optional<ValueAndAttributes> Object::storage_get(PropertyKey const& property_key) const
 Optional<ValueAndAttributes> Object::storage_get(PropertyKey const& property_key) const