Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(548)

Unified Diff: extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc

Issue 2695633008: Re-check existence of GuestViewContainer before requesting attach. (Closed)
Patch Set: Add checks for RenderFrame in AttachIFrameGuest. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc
diff --git a/extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc b/extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc
index bec7d1c852016119b6a3df2e7c81ffbda0047867..c060abad4b0c20bb272ab968a4a749c9924fc434 100644
--- a/extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc
+++ b/extensions/renderer/guest_view/guest_view_internal_custom_bindings.cc
@@ -166,6 +166,20 @@ void GuestViewInternalCustomBindings::AttachGuest(
args.Length() == 4 ? args[3].As<v8::Function>()
: v8::Local<v8::Function>(),
args.GetIsolate()));
+
+ // We should be careful that some malicious JS in the GuestView's embedder
+ // hasn't destroyed |guest_view_container| during the enumeration of the
+ // properties of the guest's object during extraction of |params| above
+ // (see https://crbug.com/683523).
+ // TODO(wjmaclean): Evaluate if it's possible for malicious JS to *change*
+ // the |guest_view_container| ... we guard against that below, but a simple
+ // null check might suffice.
+ // TODO(wjmaclean): Evaluate if it's worth removing the early-out above
+ // and just do it here.
+ if (guest_view_container !=
+ guest_view::GuestViewContainer::FromID(element_instance_id)) {
lfg 2017/02/16 20:00:58 GuestViewContainer already has a weak ptr factory,
wjmaclean 2017/02/16 21:26:16 Done.
+ return;
+ }
guest_view_container->IssueRequest(std::move(request));
args.GetReturnValue().Set(v8::Boolean::New(context()->isolate(), true));
@@ -235,9 +249,17 @@ void GuestViewInternalCustomBindings::AttachIframeGuest(
params->SetBoolean(guest_view::kElementSizeIsLogical, true);
content::RenderFrame* render_frame = GetRenderFrame(args[3]);
+ // It's possible that code executed during the |params| enumeration above
lfg 2017/02/16 20:00:58 Can we use the same approach as above: Get the Ren
wjmaclean 2017/02/16 21:26:16 How about if we grab the parent_frame WebLocalFram
lfg 2017/02/16 22:09:14 I think this is fine, the WebFrame may be closed w
+ // could delete the guest view's RenderFrame, so we shouldn't blindly assume
+ // it still exists.
+ if (!render_frame)
+ return;
+
blink::WebLocalFrame* frame = render_frame->GetWebFrame();
// Parent must exist.
+ // TODO(wjmaclean): Reviewers ... can you confirm that as long as the
+ // GuestView object's RenderFrame exists, that it will have a local parent?
lfg 2017/02/16 20:00:57 The frame comes from getIframeContentWindow in jav
wjmaclean 2017/02/16 21:26:16 Acknowledged.
blink::WebFrame* parent_frame = frame->parent();
DCHECK(parent_frame);
DCHECK(parent_frame->isWebLocalFrame());
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698