| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/nacl_host/nacl_file_host.h" | 5 #include "chrome/browser/nacl_host/nacl_file_host.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| 11 #include "base/platform_file.h" | 11 #include "base/platform_file.h" |
| 12 #include "base/threading/sequenced_worker_pool.h" | 12 #include "base/threading/sequenced_worker_pool.h" |
| 13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 14 #include "chrome/browser/extensions/extension_info_map.h" | 14 #include "chrome/browser/extensions/extension_info_map.h" |
| 15 #include "chrome/browser/nacl_host/nacl_browser.h" |
| 15 #include "chrome/browser/renderer_host/chrome_render_message_filter.h" | 16 #include "chrome/browser/renderer_host/chrome_render_message_filter.h" |
| 16 #include "chrome/common/chrome_paths.h" | 17 #include "chrome/common/chrome_paths.h" |
| 17 #include "chrome/common/extensions/extension.h" | 18 #include "chrome/common/extensions/extension.h" |
| 18 #include "chrome/common/extensions/extension_file_util.h" | 19 #include "chrome/common/extensions/extension_file_util.h" |
| 19 #include "chrome/common/extensions/manifest_handlers/shared_module_info.h" | 20 #include "chrome/common/extensions/manifest_handlers/shared_module_info.h" |
| 20 #include "chrome/common/render_messages.h" | 21 #include "chrome/common/render_messages.h" |
| 21 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
| 22 #include "content/public/browser/render_view_host.h" | 23 #include "content/public/browser/render_view_host.h" |
| 23 #include "content/public/browser/site_instance.h" | 24 #include "content/public/browser/site_instance.h" |
| 24 #include "ipc/ipc_platform_file.h" | 25 #include "ipc/ipc_platform_file.h" |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 if (target_desc == IPC::InvalidPlatformFileForTransit()) { | 124 if (target_desc == IPC::InvalidPlatformFileForTransit()) { |
| 124 NotifyRendererOfError(chrome_render_message_filter, reply_msg); | 125 NotifyRendererOfError(chrome_render_message_filter, reply_msg); |
| 125 return; | 126 return; |
| 126 } | 127 } |
| 127 | 128 |
| 128 ChromeViewHostMsg_NaClCreateTemporaryFile::WriteReplyParams( | 129 ChromeViewHostMsg_NaClCreateTemporaryFile::WriteReplyParams( |
| 129 reply_msg, target_desc); | 130 reply_msg, target_desc); |
| 130 chrome_render_message_filter->Send(reply_msg); | 131 chrome_render_message_filter->Send(reply_msg); |
| 131 } | 132 } |
| 132 | 133 |
| 134 void DoOpenNaClExecutableRegister( |
| 135 scoped_refptr<ChromeRenderMessageFilter> chrome_render_message_filter, |
| 136 base::PlatformFile file, |
| 137 base::FilePath file_path, |
| 138 IPC::Message* reply_msg) { |
| 139 // IO thread owns the NaClBrowser singleton. |
| 140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 141 |
| 142 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); |
| 143 uint64_t nonce = nacl_browser->PutFilePath(file_path); |
| 144 |
| 145 IPC::PlatformFileForTransit file_desc = IPC::GetFileHandleForProcess( |
| 146 file, |
| 147 chrome_render_message_filter->peer_handle(), |
| 148 true /* close_source */); |
| 149 |
| 150 ChromeViewHostMsg_OpenNaClExecutable::WriteReplyParams( |
| 151 reply_msg, file_desc, nonce); |
| 152 chrome_render_message_filter->Send(reply_msg); |
| 153 } |
| 154 |
| 133 // Convert the file URL into a file path in the extension directory. | 155 // Convert the file URL into a file path in the extension directory. |
| 134 // This function is security sensitive. Be sure to check with a security | 156 // This function is security sensitive. Be sure to check with a security |
| 135 // person before you modify it. | 157 // person before you modify it. |
| 136 bool GetExtensionFilePath( | 158 bool GetExtensionFilePath( |
| 137 scoped_refptr<ExtensionInfoMap> extension_info_map, | 159 scoped_refptr<ExtensionInfoMap> extension_info_map, |
| 138 const GURL& file_url, | 160 const GURL& file_url, |
| 139 base::FilePath* file_path) { | 161 base::FilePath* file_path) { |
| 140 // Check that the URL is recognized by the extension system. | 162 // Check that the URL is recognized by the extension system. |
| 141 const extensions::Extension* extension = | 163 const extensions::Extension* extension = |
| 142 extension_info_map->extensions().GetExtensionOrAppByURL( | 164 extension_info_map->extensions().GetExtensionOrAppByURL( |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 const GURL& file_url, | 211 const GURL& file_url, |
| 190 IPC::Message* reply_msg) { | 212 IPC::Message* reply_msg) { |
| 191 DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); | 213 DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
| 192 | 214 |
| 193 base::FilePath file_path; | 215 base::FilePath file_path; |
| 194 if (!GetExtensionFilePath(extension_info_map, file_url, &file_path)) { | 216 if (!GetExtensionFilePath(extension_info_map, file_url, &file_path)) { |
| 195 NotifyRendererOfError(chrome_render_message_filter, reply_msg); | 217 NotifyRendererOfError(chrome_render_message_filter, reply_msg); |
| 196 return; | 218 return; |
| 197 } | 219 } |
| 198 | 220 |
| 199 // Get a file descriptor. On Windows, we need 'GENERIC_EXECUTE' in order to | 221 base::PlatformFile file; |
| 200 // memory map the executable. | 222 nacl::OpenNaClExecutableImpl(file_path, &file); |
| 201 // IMPORTANT: This file descriptor must not have write access - that could | 223 if (file != base::kInvalidPlatformFileValue) { |
| 202 // allow a sandbox escape. | 224 BrowserThread::PostTask( |
| 203 base::PlatformFileError error_code; | 225 BrowserThread::IO, FROM_HERE, |
| 204 base::PlatformFile file = base::CreatePlatformFile( | 226 base::Bind( |
| 205 file_path, | 227 &DoOpenNaClExecutableRegister, |
| 206 base::PLATFORM_FILE_OPEN | | 228 chrome_render_message_filter, |
| 207 base::PLATFORM_FILE_READ | | 229 file, file_path, reply_msg)); |
| 208 base::PLATFORM_FILE_EXECUTE, // Windows only flag. | 230 } else { |
| 209 NULL, | |
| 210 &error_code); | |
| 211 if (error_code != base::PLATFORM_FILE_OK) { | |
| 212 NotifyRendererOfError(chrome_render_message_filter, reply_msg); | 231 NotifyRendererOfError(chrome_render_message_filter, reply_msg); |
| 213 return; | 232 return; |
| 214 } | 233 } |
| 215 // Check that the file does not reference a directory. Returning a descriptor | |
| 216 // to an extension directory could allow a sandbox escape. | |
| 217 base::PlatformFileInfo file_info; | |
| 218 if (!base::GetPlatformFileInfo(file, &file_info) || file_info.is_directory) | |
| 219 { | |
| 220 NotifyRendererOfError(chrome_render_message_filter, reply_msg); | |
| 221 return; | |
| 222 } | |
| 223 | |
| 224 IPC::PlatformFileForTransit file_desc = IPC::GetFileHandleForProcess( | |
| 225 file, | |
| 226 chrome_render_message_filter->peer_handle(), | |
| 227 true /* close_source */); | |
| 228 | |
| 229 ChromeViewHostMsg_OpenNaClExecutable::WriteReplyParams( | |
| 230 reply_msg, file_path, file_desc); | |
| 231 chrome_render_message_filter->Send(reply_msg); | |
| 232 } | 234 } |
| 233 | 235 |
| 234 } // namespace | 236 } // namespace |
| 235 | 237 |
| 236 namespace nacl_file_host { | 238 namespace nacl_file_host { |
| 237 | 239 |
| 238 void GetReadonlyPnaclFd( | 240 void GetReadonlyPnaclFd( |
| 239 scoped_refptr<ChromeRenderMessageFilter> chrome_render_message_filter, | 241 scoped_refptr<ChromeRenderMessageFilter> chrome_render_message_filter, |
| 240 const std::string& filename, | 242 const std::string& filename, |
| 241 IPC::Message* reply_msg) { | 243 IPC::Message* reply_msg) { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 base::Bind( | 338 base::Bind( |
| 337 &DoOpenNaClExecutableOnThreadPool, | 339 &DoOpenNaClExecutableOnThreadPool, |
| 338 chrome_render_message_filter, | 340 chrome_render_message_filter, |
| 339 extension_info_map, | 341 extension_info_map, |
| 340 file_url, reply_msg))) { | 342 file_url, reply_msg))) { |
| 341 NotifyRendererOfError(chrome_render_message_filter, reply_msg); | 343 NotifyRendererOfError(chrome_render_message_filter, reply_msg); |
| 342 } | 344 } |
| 343 } | 345 } |
| 344 | 346 |
| 345 } // namespace nacl_file_host | 347 } // namespace nacl_file_host |
| OLD | NEW |