|
@@ -0,0 +1,40 @@
|
|
|
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
+From: UwU UwU <[email protected]>
|
|
|
+Date: Tue, 19 Apr 2022 15:10:38 +0000
|
|
|
+Subject: NavigatorManagedData: Prevent iterator invalidation during Promise
|
|
|
+ resolution
|
|
|
+
|
|
|
+(cherry picked from commit 6083135252280d9b43e26169eb35154a9ac861ea)
|
|
|
+
|
|
|
+Bug: 1307223
|
|
|
+Change-Id: Iead6cf8c6236a95dbdfe7877c912f6ba86b370ac
|
|
|
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3532439
|
|
|
+Commit-Queue: Anqing Zhao <[email protected]>
|
|
|
+Cr-Original-Commit-Position: refs/heads/main@{#984230}
|
|
|
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3577263
|
|
|
+Reviewed-by: Artem Sumaneev <[email protected]>
|
|
|
+Owners-Override: Artem Sumaneev <[email protected]>
|
|
|
+Commit-Queue: Roger Felipe Zanoni da Silva <[email protected]>
|
|
|
+Cr-Commit-Position: refs/branch-heads/4664@{#1591}
|
|
|
+Cr-Branched-From: 24dc4ee75e01a29d390d43c9c264372a169273a7-refs/heads/main@{#929512}
|
|
|
+
|
|
|
+diff --git a/third_party/blink/renderer/modules/managed_device/navigator_managed_data.cc b/third_party/blink/renderer/modules/managed_device/navigator_managed_data.cc
|
|
|
+index 2df64ff2c51dfe080cd50b46199e9c1d77ea26db..32b48ca0157a52d322aa4e00d18d4e662d3b1c4a 100644
|
|
|
+--- a/third_party/blink/renderer/modules/managed_device/navigator_managed_data.cc
|
|
|
++++ b/third_party/blink/renderer/modules/managed_device/navigator_managed_data.cc
|
|
|
+@@ -108,8 +108,14 @@ void NavigatorManagedData::OnServiceConnectionError() {
|
|
|
+ !managed_configuration_service_.is_connected()) {
|
|
|
+ managed_configuration_service_.reset();
|
|
|
+ }
|
|
|
++
|
|
|
++ // Move the set to a local variable to prevent script execution in Reject()
|
|
|
++ // from invalidating the iterator used by the loop.
|
|
|
++ HeapHashSet<Member<ScriptPromiseResolver>> pending_promises;
|
|
|
++ pending_promises_.swap(pending_promises);
|
|
|
++
|
|
|
+ // Resolve all pending promises with a failure.
|
|
|
+- for (ScriptPromiseResolver* resolver : pending_promises_) {
|
|
|
++ for (ScriptPromiseResolver* resolver : pending_promises) {
|
|
|
+ resolver->Reject(
|
|
|
+ MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotAllowedError,
|
|
|
+ kNotHighTrustedAppExceptionMessage));
|