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

Side by Side Diff: components/nacl/renderer/ppb_nacl_private_impl.cc

Issue 249183004: Implement open_resource in non-SFI mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "components/nacl/renderer/ppb_nacl_private_impl.h" 5 #include "components/nacl/renderer/ppb_nacl_private_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/containers/scoped_ptr_hash_map.h" 10 #include "base/containers/scoped_ptr_hash_map.h"
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 } 157 }
158 158
159 private: 159 private:
160 int num_remaining_calls_; 160 int num_remaining_calls_;
161 PP_CompletionCallback callback_; 161 PP_CompletionCallback callback_;
162 int32_t result_; 162 int32_t result_;
163 163
164 DISALLOW_COPY_AND_ASSIGN(ChannelConnectedCallback); 164 DISALLOW_COPY_AND_ASSIGN(ChannelConnectedCallback);
165 }; 165 };
166 166
167 // Thin adapter from PP_ManifestService to ManifestServiceChannel::Delegate. 167 // Thin adapter from PPP_ManifestService to ManifestServiceChannel::Delegate.
168 // Note that user_data is managed by the caller of LaunchSelLdr. Please see 168 // Note that user_data is managed by the caller of LaunchSelLdr. Please see
169 // also PP_ManifestService's comment for more details about resource 169 // also PP_ManifestService's comment for more details about resource
170 // management. 170 // management.
171 class ManifestServiceProxy : public ManifestServiceChannel::Delegate { 171 class ManifestServiceProxy : public ManifestServiceChannel::Delegate {
172 public: 172 public:
173 ManifestServiceProxy(const PP_ManifestService* manifest_service, 173 ManifestServiceProxy(const PPP_ManifestService* manifest_service,
174 void* user_data) 174 void* user_data)
175 : manifest_service_(*manifest_service), 175 : manifest_service_(*manifest_service),
176 user_data_(user_data) { 176 user_data_(user_data) {
177 } 177 }
178 178
179 virtual ~ManifestServiceProxy() { 179 virtual ~ManifestServiceProxy() {
180 Quit(); 180 Quit();
181 } 181 }
182 182
183 virtual void StartupInitializationComplete() OVERRIDE { 183 virtual void StartupInitializationComplete() OVERRIDE {
184 if (!user_data_) 184 if (!user_data_)
185 return; 185 return;
186 186
187 if (!PP_ToBool( 187 if (!PP_ToBool(
188 manifest_service_.StartupInitializationComplete(user_data_))) { 188 manifest_service_.StartupInitializationComplete(user_data_))) {
189 user_data_ = NULL; 189 user_data_ = NULL;
190 } 190 }
191 } 191 }
192 192
193 virtual void OpenResource(
194 const std::string& key,
195 const ManifestServiceChannel::OpenResourceCallback& callback) OVERRIDE {
196 if (!user_data_)
197 return;
198
199 // The allocated callback will be freed in DidOpenResource, which is always
200 // called regardless whether OpenResource() succeeds or fails.
201 if (!PP_ToBool(manifest_service_.OpenResource(
202 user_data_,
203 key.c_str(),
204 DidOpenResource,
205 new ManifestServiceChannel::OpenResourceCallback(callback)))) {
206 user_data_ = NULL;
207 }
208 }
209
193 private: 210 private:
211 static void DidOpenResource(void* user_data, PP_FileHandle file_handle) {
212 scoped_ptr<ManifestServiceChannel::OpenResourceCallback> callback(
213 static_cast<ManifestServiceChannel::OpenResourceCallback*>(user_data));
214 callback->Run(file_handle);
215 }
216
194 void Quit() { 217 void Quit() {
195 if (!user_data_) 218 if (!user_data_)
196 return; 219 return;
197 220
198 bool result = PP_ToBool(manifest_service_.Quit(user_data_)); 221 bool result = PP_ToBool(manifest_service_.Quit(user_data_));
199 DCHECK(!result); 222 DCHECK(!result);
200 user_data_ = NULL; 223 user_data_ = NULL;
201 } 224 }
202 225
203 PP_ManifestService manifest_service_; 226 PPP_ManifestService manifest_service_;
204 void* user_data_; 227 void* user_data_;
205 DISALLOW_COPY_AND_ASSIGN(ManifestServiceProxy); 228 DISALLOW_COPY_AND_ASSIGN(ManifestServiceProxy);
206 }; 229 };
207 230
208 // Launch NaCl's sel_ldr process. 231 // Launch NaCl's sel_ldr process.
209 void LaunchSelLdr(PP_Instance instance, 232 void LaunchSelLdr(PP_Instance instance,
210 const char* alleged_url, 233 const char* alleged_url,
211 PP_Bool uses_irt, 234 PP_Bool uses_irt,
212 PP_Bool uses_ppapi, 235 PP_Bool uses_ppapi,
213 PP_Bool uses_nonsfi_mode, 236 PP_Bool uses_nonsfi_mode,
214 PP_Bool enable_ppapi_dev, 237 PP_Bool enable_ppapi_dev,
215 PP_Bool enable_dyncode_syscalls, 238 PP_Bool enable_dyncode_syscalls,
216 PP_Bool enable_exception_handling, 239 PP_Bool enable_exception_handling,
217 PP_Bool enable_crash_throttling, 240 PP_Bool enable_crash_throttling,
218 const PP_ManifestService* manifest_service_interface, 241 const PPP_ManifestService* manifest_service_interface,
219 void* manifest_service_user_data, 242 void* manifest_service_user_data,
220 void* imc_handle, 243 void* imc_handle,
221 struct PP_Var* error_message, 244 struct PP_Var* error_message,
222 PP_CompletionCallback callback) { 245 PP_CompletionCallback callback) {
223 CHECK(ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()-> 246 CHECK(ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->
224 BelongsToCurrentThread()); 247 BelongsToCurrentThread());
225 248
226 // Create the manifest service proxy here, so on error case, it will be 249 // Create the manifest service proxy here, so on error case, it will be
227 // destructed (without passing it to ManifestServiceChannel), and QUIT 250 // destructed (without passing it to ManifestServiceChannel), and QUIT
228 // will be called in its destructor so that the caller of this function 251 // will be called in its destructor so that the caller of this function
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 new TrustedPluginChannel( 343 new TrustedPluginChannel(
321 launch_result.trusted_ipc_channel_handle, 344 launch_result.trusted_ipc_channel_handle,
322 connected_callback, 345 connected_callback,
323 content::RenderThread::Get()->GetShutdownEvent())); 346 content::RenderThread::Get()->GetShutdownEvent()));
324 load_manager->set_trusted_plugin_channel(trusted_plugin_channel.Pass()); 347 load_manager->set_trusted_plugin_channel(trusted_plugin_channel.Pass());
325 } else { 348 } else {
326 connected_callback.Run(PP_ERROR_FAILED); 349 connected_callback.Run(PP_ERROR_FAILED);
327 } 350 }
328 351
329 // Stash the manifest service handle as well. 352 // Stash the manifest service handle as well.
353 // For security hardening, disable the IPCs for open_resource() when they
354 // aren't needed. PNaCl doesn't expose open_resource(), and the new
355 // open_resource() IPCs are currently only used for Non-SFI NaCl so far,
356 // not SFI NaCl. Note that enable_dyncode_syscalls is true if and only if
357 // the plugin is a non-PNaCl plugin.
330 if (load_manager && 358 if (load_manager &&
359 enable_dyncode_syscalls &&
360 uses_nonsfi_mode &&
331 IsValidChannelHandle( 361 IsValidChannelHandle(
332 launch_result.manifest_service_ipc_channel_handle)) { 362 launch_result.manifest_service_ipc_channel_handle)) {
333 scoped_ptr<ManifestServiceChannel> manifest_service_channel( 363 scoped_ptr<ManifestServiceChannel> manifest_service_channel(
334 new ManifestServiceChannel( 364 new ManifestServiceChannel(
335 launch_result.manifest_service_ipc_channel_handle, 365 launch_result.manifest_service_ipc_channel_handle,
336 connected_callback, 366 connected_callback,
337 manifest_service_proxy.Pass(), 367 manifest_service_proxy.Pass(),
338 content::RenderThread::Get()->GetShutdownEvent())); 368 content::RenderThread::Get()->GetShutdownEvent()));
339 load_manager->set_manifest_service_channel( 369 load_manager->set_manifest_service_channel(
340 manifest_service_channel.Pass()); 370 manifest_service_channel.Pass());
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 &DownloadManifestToBuffer 1033 &DownloadManifestToBuffer
1004 }; 1034 };
1005 1035
1006 } // namespace 1036 } // namespace
1007 1037
1008 const PPB_NaCl_Private* GetNaClPrivateInterface() { 1038 const PPB_NaCl_Private* GetNaClPrivateInterface() {
1009 return &nacl_interface; 1039 return &nacl_interface;
1010 } 1040 }
1011 1041
1012 } // namespace nacl 1042 } // namespace nacl
OLDNEW
« no previous file with comments | « components/nacl/renderer/manifest_service_channel.cc ('k') | ppapi/api/private/ppb_nacl_private.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698