15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 1158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/kill.h" 1258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process_handle.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/task_runner.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/browser_child_process_host_impl.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/content_switches.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sync_message.h" 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserMessageFilter; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass BrowserMessageFilter::Internal : public IPC::MessageFilter { 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) explicit Internal(BrowserMessageFilter* filter) : filter_(filter) {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~Internal() {} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // IPC::MessageFilter implementation: 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE { 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter_->sender_ = sender; 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter_->OnFilterAdded(sender); 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnFilterRemoved() OVERRIDE { 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter_->OnFilterRemoved(); 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnChannelClosing() OVERRIDE { 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter_->sender_ = NULL; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter_->OnChannelClosing(); 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnChannelConnected(int32 peer_pid) OVERRIDE { 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter_->peer_pid_ = peer_pid; 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter_->OnChannelConnected(peer_pid); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::ID thread = BrowserThread::IO; 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter_->OverrideThreadForMessage(message, &thread); 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (thread == BrowserThread::IO) { 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<base::TaskRunner> runner = 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filter_->OverrideTaskRunnerForMessage(message); 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (runner.get()) { 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) runner->PostTask( 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind( 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::IgnoreResult(&Internal::DispatchMessage), this, message)); 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return DispatchMessage(message); 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (thread == BrowserThread::UI && 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !BrowserMessageFilter::CheckCanDispatchOnUI(message, filter_.get())) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::PostTask( 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) thread, FROM_HERE, 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind( 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::IgnoreResult(&Internal::DispatchMessage), this, message)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool GetSupportedMessageClasses( 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<uint32>* supported_message_classes) const OVERRIDE { 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supported_message_classes->assign( 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) filter_->message_classes_to_filter().begin(), 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) filter_->message_classes_to_filter().end()); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Dispatches a message to the derived class. 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool DispatchMessage(const IPC::Message& message) { 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool rv = filter_->OnMessageReceived(message); 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO) || rv) << 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "Must handle messages that were dispatched to another thread!"; 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return rv; 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<BrowserMessageFilter> filter_; 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Internal); 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserMessageFilter::BrowserMessageFilter(uint32 message_class_to_filter) 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : internal_(NULL), 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sender_(NULL), 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) peer_handle_(base::kNullProcessHandle), 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) peer_pid_(base::kNullProcessId), 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_classes_to_filter_(1, message_class_to_filter) {} 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserMessageFilter::BrowserMessageFilter( 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint32* message_classes_to_filter, 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t num_message_classes_to_filter) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : internal_(NULL), 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sender_(NULL), 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) peer_handle_(base::kNullProcessHandle), 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) peer_pid_(base::kNullProcessId), 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_classes_to_filter_( 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_classes_to_filter, 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_classes_to_filter + num_message_classes_to_filter) { 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(num_message_classes_to_filter); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::ProcessHandle BrowserMessageFilter::PeerHandle() { 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::AutoLock lock(peer_handle_lock_); 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (peer_handle_ == base::kNullProcessHandle) 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::OpenPrivilegedProcessHandle(peer_pid_, &peer_handle_); 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return peer_handle_; 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::ProcessHandle result = base::kNullProcessHandle; 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::OpenPrivilegedProcessHandle(peer_pid_, &result); 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return result; 1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserMessageFilter::OnDestruct() const { 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delete this; 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserMessageFilter::Send(IPC::Message* message) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (message->is_sync()) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't support sending synchronous messages from the browser. If we 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // really needed it, we can make this class derive from SyncMessageFilter 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but it seems better to not allow sending synchronous messages from the 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser, since it might allow a corrupt/malicious renderer to hang us. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Can't send sync message through BrowserMessageFilter!"; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(base::IgnoreResult(&BrowserMessageFilter::Send), this, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message)); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (sender_) 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return sender_->Send(message); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TaskRunner* BrowserMessageFilter::OverrideTaskRunnerForMessage( 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserMessageFilter::CheckCanDispatchOnUI(const IPC::Message& message, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Sender* sender) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows there's a potential deadlock with sync messsages going in 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a circle from browser -> plugin -> renderer -> browser. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Linux we can avoid this by avoiding sync messages from browser->plugin. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Mac we avoid this by not supporting windowed plugins. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (message.is_sync() && !message.is_caller_pumping_messages()) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: IF YOU HIT THIS ASSERT, THE SOLUTION IS ALMOST NEVER TO RUN A 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NESTED MESSAGE LOOP IN THE RENDERER!!! 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // That introduces reentrancy which causes hard to track bugs. You should 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // find a way to either turn this into an asynchronous message, or one 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that can be answered on the IO thread. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Can't send sync messages to UI thread without pumping " 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "messages in the renderer or else deadlocks can occur if the page " 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "has windowed plugins! (message type " << message.type() << ")"; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply->set_reply_error(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sender->Send(reply); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserMessageFilter::BadMessageReceived() { 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (command_line->HasSwitch(switches::kDisableKillAfterBadIPC)) 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserChildProcessHostImpl::HistogramBadMessageTerminated( 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PROCESS_TYPE_RENDERER); 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::KillProcess(PeerHandle(), content::RESULT_CODE_KILLED_BAD_MESSAGE, 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserMessageFilter::~BrowserMessageFilter() { 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (peer_handle_ != base::kNullProcessHandle) 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::CloseProcessHandle(peer_handle_); 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIPC::MessageFilter* BrowserMessageFilter::GetFilter() { 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We create this on demand so that if a filter is used in a unit test but 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // never attached to a channel, we don't leak Internal and this; 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!internal_) << "Should only be called once."; 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) internal_ = new Internal(this); 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return internal_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 228