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

Unified Diff: chrome/browser/nacl_host/nacl_process_host.cc

Issue 14750007: NaCl: enable meta-based validation for shared libraries. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comment Created 7 years, 7 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: chrome/browser/nacl_host/nacl_process_host.cc
diff --git a/chrome/browser/nacl_host/nacl_process_host.cc b/chrome/browser/nacl_host/nacl_process_host.cc
index 26a1df5673dc7053c09b04a6747a045e8aaa1c6d..1b824834cd7d7e86471cd1f3962c39c71dbd71aa 100644
--- a/chrome/browser/nacl_host/nacl_process_host.cc
+++ b/chrome/browser/nacl_host/nacl_process_host.cc
@@ -623,6 +623,8 @@ bool NaClProcessHost::OnMessageReceived(const IPC::Message& msg) {
OnQueryKnownToValidate)
IPC_MESSAGE_HANDLER(NaClProcessMsg_SetKnownToValidate,
OnSetKnownToValidate)
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClProcessMsg_ResolveFileToken,
+ OnResolveFileToken)
#if defined(OS_WIN)
IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClProcessMsg_AttachDebugExceptionHandler,
OnAttachDebugExceptionHandler)
@@ -761,7 +763,6 @@ bool NaClProcessHost::StartNaClExecution() {
if (params.uses_irt) {
base::PlatformFile irt_file = nacl_browser->IrtFile();
CHECK_NE(irt_file, base::kInvalidPlatformFileValue);
-
// Send over the IRT file handle. We don't close our own copy!
if (!ShareHandleToSelLdr(data.handle, irt_file, false, &params.handles))
return false;
@@ -930,6 +931,78 @@ void NaClProcessHost::OnSetKnownToValidate(const std::string& signature) {
NaClBrowser::GetInstance()->SetKnownToValidate(signature, off_the_record_);
}
+void NaClProcessHost::FileResolved(
+ base::PlatformFile* file,
+ const base::FilePath& file_path,
+ IPC::Message* reply_msg) {
+ if (*file != base::kInvalidPlatformFileValue) {
+ IPC::PlatformFileForTransit handle = IPC::GetFileHandleForProcess(
+ *file,
+ process_->GetData().handle,
+ true /* close_source */);
+ NaClProcessMsg_ResolveFileToken::WriteReplyParams(
+ reply_msg,
+ handle,
+ file_path);
+ } else {
+ NaClProcessMsg_ResolveFileToken::WriteReplyParams(
+ reply_msg,
+ IPC::InvalidPlatformFileForTransit(),
+ base::FilePath(FILE_PATH_LITERAL("")));
+ }
+ Send(reply_msg);
+}
+
+void NaClProcessHost::OnResolveFileToken(uint64 file_token_lo,
+ uint64 file_token_hi,
+ IPC::Message* reply_msg) {
+ // Was the file registered?
Mark Seaborn 2013/05/24 20:21:58 Nit: add empty line after each comment paragraph f
+ // Note that the file path cache is of bounded size, and old entries can get
+ // evicted. If a large number of NaCl modules are being launched at once,
+ // resolving the file_token may fail because the path cache was thrashed
+ // while the file_token was in flight. In this case the query fails, and we
+ // need to fall back to the slower path.
+ // However: each NaCl process will consume 2-3 entries as it starts up, this
Mark Seaborn 2013/05/24 20:21:58 Why 2-3? Explain more in comment, perhaps?
Nick Bray (chromium) 2013/05/24 21:35:24 Done.
+ // means that eviction will not happen unless you start up 33+ NaCl processes
+ // at the same time, and this still requires worst-case timing. As a
+ // practical matter, no entries should be evicted prematurely.
+ // The cache itself should take ~ (150 characters * 2 bytes/char + ~60 bytes
+ // data structure overhead) * 100 = 35k when full, so making it bigger should
+ // not be a problem, if needed.
+ // TODO(ncbray): track behavior with UMA. If entries are getting evicted or
+ // bogus keys are getting queried, this would be good to know.
+ base::FilePath file_path;
+ if (!NaClBrowser::GetInstance()->GetFilePath(file_token_lo, file_token_hi,
+ &file_path)) {
+ NaClProcessMsg_ResolveFileToken::WriteReplyParams(
+ reply_msg,
+ IPC::InvalidPlatformFileForTransit(),
+ base::FilePath(FILE_PATH_LITERAL("")));
+ Send(reply_msg);
+ return;
+ }
+
+ // Scratch space to share between the callbacks.
+ base::PlatformFile* data = new base::PlatformFile();
+
+ // Open the file.
+ if (!content::BrowserThread::PostBlockingPoolTaskAndReply(
+ FROM_HERE,
Mark Seaborn 2013/05/24 20:21:58 Indent arguments properly. i.e.: // Wrong if (so
Nick Bray (chromium) 2013/05/24 21:35:24 Done.
+ base::Bind(nacl::OpenNaClExecutableImpl,
+ file_path, data),
+ base::Bind(&NaClProcessHost::FileResolved,
+ weak_factory_.GetWeakPtr(),
+ base::Owned(data),
+ file_path,
+ reply_msg))) {
+ NaClProcessMsg_ResolveFileToken::WriteReplyParams(
+ reply_msg,
+ IPC::InvalidPlatformFileForTransit(),
+ base::FilePath(FILE_PATH_LITERAL("")));
+ Send(reply_msg);
+ }
+}
+
#if defined(OS_WIN)
void NaClProcessHost::OnAttachDebugExceptionHandler(const std::string& info,
IPC::Message* reply_msg) {

Powered by Google App Engine
This is Rietveld 408576698