Commit baaed389 authored by Ehsan Karamad's avatar Ehsan Karamad Committed by Commit Bot

Fix a potential UaF in MimeHandlerViewContainerBase

The method MHVCB::GetEmbedderRenderFrame() is virtual *and* used inside the dtor
of MHVCB which is a mistake. Currently the references to MHVCB inside an
embedder frame do not get cleaned up after destruction (causing leaks inside
g_mime_handler_view_container_base_map).

This bug is also a potential root cause of some crashes which only show
themselves when the NetworkService is enabled (the corresponding codepath is
triggered when the feature is on).

Bug: 882645
Change-Id: I8c06184ac65054dc7e43d7582f99b2f7162280f0
Reviewed-on: https://chromium-review.googlesource.com/1225470Reviewed-by: default avatarJames MacLean <wjmaclean@chromium.org>
Commit-Queue: Ehsan Karamad <ekaramad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#591341}
parent e5a39388
...@@ -108,10 +108,6 @@ void MimeHandlerViewContainer::OnGuestAttached(int /* unused */, ...@@ -108,10 +108,6 @@ void MimeHandlerViewContainer::OnGuestAttached(int /* unused */,
guest_proxy_routing_id_ = guest_proxy_routing_id; guest_proxy_routing_id_ = guest_proxy_routing_id;
} }
content::RenderFrame* MimeHandlerViewContainer::GetEmbedderRenderFrame() const {
return render_frame();
}
void MimeHandlerViewContainer::CreateMimeHandlerViewGuestIfNecessary() { void MimeHandlerViewContainer::CreateMimeHandlerViewGuestIfNecessary() {
if (!element_size_.has_value()) if (!element_size_.has_value())
return; return;
......
...@@ -60,7 +60,6 @@ class MimeHandlerViewContainer : public guest_view::GuestViewContainer, ...@@ -60,7 +60,6 @@ class MimeHandlerViewContainer : public guest_view::GuestViewContainer,
private: private:
// MimeHandlerViewContainerBase override. // MimeHandlerViewContainerBase override.
content::RenderFrame* GetEmbedderRenderFrame() const final;
void CreateMimeHandlerViewGuestIfNecessary() final; void CreateMimeHandlerViewGuestIfNecessary() final;
blink::WebRemoteFrame* GetGuestProxyFrame() const final; blink::WebRemoteFrame* GetGuestProxyFrame() const final;
int32_t GetInstanceId() const final; int32_t GetInstanceId() const final;
......
...@@ -170,6 +170,7 @@ MimeHandlerViewContainerBase::MimeHandlerViewContainerBase( ...@@ -170,6 +170,7 @@ MimeHandlerViewContainerBase::MimeHandlerViewContainerBase(
: plugin_path_(info.path.MaybeAsASCII()), : plugin_path_(info.path.MaybeAsASCII()),
mime_type_(mime_type), mime_type_(mime_type),
original_url_(original_url), original_url_(original_url),
embedder_render_frame_routing_id_(embedder_render_frame->GetRoutingID()),
before_unload_control_binding_(this), before_unload_control_binding_(this),
weak_factory_(this) { weak_factory_(this) {
DCHECK(!mime_type_.empty()); DCHECK(!mime_type_.empty());
...@@ -294,7 +295,8 @@ void MimeHandlerViewContainerBase::DidFinishLoading() { ...@@ -294,7 +295,8 @@ void MimeHandlerViewContainerBase::DidFinishLoading() {
content::RenderFrame* MimeHandlerViewContainerBase::GetEmbedderRenderFrame() content::RenderFrame* MimeHandlerViewContainerBase::GetEmbedderRenderFrame()
const { const {
return nullptr; DCHECK_NE(embedder_render_frame_routing_id_, MSG_ROUTING_NONE);
return content::RenderFrame::FromRoutingID(embedder_render_frame_routing_id_);
} }
void MimeHandlerViewContainerBase::CreateMimeHandlerViewGuestIfNecessary() { void MimeHandlerViewContainerBase::CreateMimeHandlerViewGuestIfNecessary() {
......
...@@ -71,8 +71,6 @@ class MimeHandlerViewContainerBase : public blink::WebAssociatedURLLoaderClient, ...@@ -71,8 +71,6 @@ class MimeHandlerViewContainerBase : public blink::WebAssociatedURLLoaderClient,
void DidFinishLoading() override; void DidFinishLoading() override;
protected: protected:
// Returns the frame which is embedding the corresponding plugin element.
virtual content::RenderFrame* GetEmbedderRenderFrame() const;
virtual void CreateMimeHandlerViewGuestIfNecessary(); virtual void CreateMimeHandlerViewGuestIfNecessary();
virtual blink::WebRemoteFrame* GetGuestProxyFrame() const = 0; virtual blink::WebRemoteFrame* GetGuestProxyFrame() const = 0;
virtual int32_t GetInstanceId() const = 0; virtual int32_t GetInstanceId() const = 0;
...@@ -102,6 +100,9 @@ class MimeHandlerViewContainerBase : public blink::WebAssociatedURLLoaderClient, ...@@ -102,6 +100,9 @@ class MimeHandlerViewContainerBase : public blink::WebAssociatedURLLoaderClient,
private: private:
class PluginResourceThrottle; class PluginResourceThrottle;
// Returns the frame which is embedding the corresponding plugin element.
content::RenderFrame* GetEmbedderRenderFrame() const;
// Called for embedded plugins when network service is enabled. This is called // Called for embedded plugins when network service is enabled. This is called
// by the URLLoaderThrottle which intercepts the resource load, which is then // by the URLLoaderThrottle which intercepts the resource load, which is then
// sent to the browser to be handed off to the plugin. // sent to the browser to be handed off to the plugin.
...@@ -140,6 +141,9 @@ class MimeHandlerViewContainerBase : public blink::WebAssociatedURLLoaderClient, ...@@ -140,6 +141,9 @@ class MimeHandlerViewContainerBase : public blink::WebAssociatedURLLoaderClient,
// has been called. // has been called.
bool guest_loaded_ = false; bool guest_loaded_ = false;
// The routing ID of the frame which contains the plugin element.
const int32_t embedder_render_frame_routing_id_;
mojo::Binding<mime_handler::BeforeUnloadControl> mojo::Binding<mime_handler::BeforeUnloadControl>
before_unload_control_binding_; before_unload_control_binding_;
......
...@@ -55,8 +55,6 @@ MimeHandlerViewFrameContainer::MimeHandlerViewFrameContainer( ...@@ -55,8 +55,6 @@ MimeHandlerViewFrameContainer::MimeHandlerViewFrameContainer(
plugin_info, plugin_info,
mime_type, mime_type,
resource_url), resource_url),
embedder_frame_(content::RenderFrame::FromWebFrame(
plugin_element.GetDocument().GetFrame())),
plugin_element_(plugin_element), plugin_element_(plugin_element),
element_instance_id_(element_instance_id) { element_instance_id_(element_instance_id) {
is_embedded_ = IsEmbedded(); is_embedded_ = IsEmbedded();
...@@ -72,12 +70,6 @@ MimeHandlerViewFrameContainer::MimeHandlerViewFrameContainer( ...@@ -72,12 +70,6 @@ MimeHandlerViewFrameContainer::MimeHandlerViewFrameContainer(
MimeHandlerViewFrameContainer::~MimeHandlerViewFrameContainer() {} MimeHandlerViewFrameContainer::~MimeHandlerViewFrameContainer() {}
// Returns the frame which is embedding the corresponding plugin element.
content::RenderFrame* MimeHandlerViewFrameContainer::GetEmbedderRenderFrame()
const {
return embedder_frame_;
}
void MimeHandlerViewFrameContainer::CreateMimeHandlerViewGuestIfNecessary() { void MimeHandlerViewFrameContainer::CreateMimeHandlerViewGuestIfNecessary() {
if (auto* frame = GetContentFrame()) { if (auto* frame = GetContentFrame()) {
plugin_frame_routing_id_ = plugin_frame_routing_id_ =
......
...@@ -16,7 +16,6 @@ class WebFrame; ...@@ -16,7 +16,6 @@ class WebFrame;
} // namespace blink } // namespace blink
namespace content { namespace content {
class RenderFrame;
struct WebPluginInfo; struct WebPluginInfo;
} // namespace content } // namespace content
...@@ -42,7 +41,6 @@ class MimeHandlerViewFrameContainer : public MimeHandlerViewContainerBase { ...@@ -42,7 +41,6 @@ class MimeHandlerViewFrameContainer : public MimeHandlerViewContainerBase {
~MimeHandlerViewFrameContainer() override; ~MimeHandlerViewFrameContainer() override;
// MimeHandlerViewContainerBase overrides. // MimeHandlerViewContainerBase overrides.
content::RenderFrame* GetEmbedderRenderFrame() const final;
void CreateMimeHandlerViewGuestIfNecessary() final; void CreateMimeHandlerViewGuestIfNecessary() final;
blink::WebRemoteFrame* GetGuestProxyFrame() const final; blink::WebRemoteFrame* GetGuestProxyFrame() const final;
int32_t GetInstanceId() const final; int32_t GetInstanceId() const final;
...@@ -64,7 +62,6 @@ class MimeHandlerViewFrameContainer : public MimeHandlerViewContainerBase { ...@@ -64,7 +62,6 @@ class MimeHandlerViewFrameContainer : public MimeHandlerViewContainerBase {
void OnMessageReceived(const IPC::Message& message); void OnMessageReceived(const IPC::Message& message);
content::RenderFrame* const embedder_frame_;
blink::WebElement plugin_element_; blink::WebElement plugin_element_;
const int32_t element_instance_id_; const int32_t element_instance_id_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment