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

Unified Diff: content/browser/renderer_host/pepper_message_filter.cc

Issue 9379002: Move socket API restriction check to browser process (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nit Created 8 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
Index: content/browser/renderer_host/pepper_message_filter.cc
diff --git a/content/browser/renderer_host/pepper_message_filter.cc b/content/browser/renderer_host/pepper_message_filter.cc
index f4183c6d3b8800a0ad23d4275663798dd9225746..28e23ddc585e17d0fe21f6828aeb267b19cf5aac 100644
--- a/content/browser/renderer_host/pepper_message_filter.cc
+++ b/content/browser/renderer_host/pepper_message_filter.cc
@@ -6,12 +6,15 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/process_util.h"
+#include "base/string_tokenizer.h"
#include "base/threading/worker_pool.h"
#include "base/values.h"
+#include "chrome/common/chrome_switches.h"
Dmitry Polukhin 2012/02/10 13:24:12 It looks like header from chrome/... can't be incl
Dmitry Polukhin 2012/02/10 14:05:45 It looks like from architectural point of check fo
jam 2012/02/10 18:23:54 see my comment below. the switch and origin checki
#include "content/browser/font_list_async.h"
#include "content/browser/renderer_host/pepper_tcp_socket.h"
#include "content/browser/renderer_host/pepper_udp_socket.h"
@@ -46,24 +49,53 @@ namespace {
const size_t kMaxSocketsAllowed = 1024;
const uint32 kInvalidSocketID = 0;
+const char* kPredefinedAllowedSocketOrigins[] = {
+ "okddffdblfhhnmhodogpojmfkjmhinfp", // Test SSH Client
jam 2012/02/10 18:23:54 these are chrome extension IDs right? if so, exten
jam 2012/02/10 18:33:42 for completeness, here's how you can do this in th
Dmitry Polukhin 2012/02/13 14:54:35 Now this white-list contains only extensions but I
Dmitry Polukhin 2012/02/13 14:54:35 My initial version used RenderProcessHost::FromID
+ "pnhechapfaindjhompbnflcldabbghjo" // HTerm App (SSH Client)
+};
+
} // namespace
+PepperMessageFilter::PepperMessageFilterMap PepperMessageFilter::instance_map_;
+base::Lock PepperMessageFilter::instance_map_mutex_;
+
PepperMessageFilter::PepperMessageFilter(
+ int process_id,
content::ResourceContext* resource_context)
: resource_context_(resource_context),
host_resolver_(NULL),
+ process_id_(process_id),
next_socket_id_(1) {
DCHECK(resource_context_);
+ DCHECK(process_id);
+ for (size_t i = 0; i < arraysize(kPredefinedAllowedSocketOrigins); ++i)
+ allowed_socket_origins_.insert(kPredefinedAllowedSocketOrigins[i]);
+
+ const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+ std::string allowed_list =
+ command_line.GetSwitchValueASCII(switches::kAllowNaClSocketAPI);
+ if (!allowed_list.empty()) {
+ StringTokenizer t(allowed_list, ",");
+ while (t.GetNext()) {
+ allowed_socket_origins_.insert(t.token());
+ }
+ }
+ base::AutoLock lock(instance_map_mutex_);
+ instance_map_.insert(PepperMessageFilterMap::value_type(process_id, this));
}
PepperMessageFilter::PepperMessageFilter(net::HostResolver* host_resolver)
: resource_context_(NULL),
host_resolver_(host_resolver),
+ process_id_(0),
next_socket_id_(1) {
DCHECK(host_resolver);
}
-PepperMessageFilter::~PepperMessageFilter() {}
+PepperMessageFilter::~PepperMessageFilter() {
+ base::AutoLock lock(instance_map_mutex_);
+ instance_map_.erase(process_id_);
+}
bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg,
bool* message_was_ok) {
@@ -341,6 +373,11 @@ void PepperMessageFilter::OnGetFontFamilies(IPC::Message* reply_msg) {
void PepperMessageFilter::OnTCPCreate(int32 routing_id,
uint32 plugin_dispatcher_id,
uint32* socket_id) {
+ if (!CanUseSocketAPIs(routing_id)) {
+ *socket_id = 0;
+ return;
+ }
+
*socket_id = GenerateSocketID();
if (*socket_id == kInvalidSocketID)
return;
@@ -422,6 +459,11 @@ void PepperMessageFilter::OnTCPDisconnect(uint32 socket_id) {
void PepperMessageFilter::OnUDPCreate(int32 routing_id,
uint32 plugin_dispatcher_id,
uint32* socket_id) {
+ if (!CanUseSocketAPIs(routing_id)) {
+ *socket_id = 0;
+ return;
+ }
+
*socket_id = GenerateSocketID();
if (*socket_id == kInvalidSocketID)
return;
@@ -528,3 +570,36 @@ uint32 PepperMessageFilter::GenerateSocketID() {
return socket_id;
}
+
+bool PepperMessageFilter::CanUseSocketAPIs(int32 render_id) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ if (host_resolver_) {
+ // Always allow socket APIs for out-process plugins.
+ // TODO(dpolukhin, yzshen): make the check consistent for in- and
+ // out-process cases.
+ return true;
+ }
+
+ base::AutoLock lock(allowed_socket_renders_mutex_);
+ return allowed_socket_renders_.find(render_id) !=
+ allowed_socket_renders_.end();
+}
+
+void PepperMessageFilter::SetRenderSite(int render_id, const GURL& url) {
+ base::AutoLock lock(allowed_socket_renders_mutex_);
+ if (url.is_valid() && allowed_socket_origins_.find(url.host()) !=
+ allowed_socket_origins_.end()) {
+ allowed_socket_renders_.insert(render_id);
+ } else {
+ allowed_socket_renders_.erase(render_id);
+ }
+}
+
+void PepperMessageFilter::SetRenderSite(int process_id,
+ int render_id,
+ const GURL& url) {
+ base::AutoLock lock(instance_map_mutex_);
+ PepperMessageFilterMap::iterator it = instance_map_.find(process_id);
+ if (it != instance_map_.end())
+ it->second->SetRenderSite(render_id, url);
+}

Powered by Google App Engine
This is Rietveld 408576698