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

Side by Side Diff: components/nacl/loader/nacl_ipc_adapter.cc

Issue 728113002: obsolete: SFI NaCl: Batch-open resource files (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 6 years, 1 month 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
« no previous file with comments | « components/nacl/loader/nacl_ipc_adapter.h ('k') | components/nacl/loader/nacl_listener.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/loader/nacl_ipc_adapter.h" 5 #include "components/nacl/loader/nacl_ipc_adapter.h"
6 6
7 #include <limits.h> 7 #include <limits.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 621
622 // Write empty file tokens. 622 // Write empty file tokens.
623 new_msg->WriteUInt64(0); // token_lo 623 new_msg->WriteUInt64(0); // token_lo
624 new_msg->WriteUInt64(0); // token_hi 624 new_msg->WriteUInt64(0); // token_hi
625 return new_msg.Pass(); 625 return new_msg.Pass();
626 } 626 }
627 627
628 void NaClIPCAdapter::OnFileTokenResolved(const IPC::Message& orig_msg, 628 void NaClIPCAdapter::OnFileTokenResolved(const IPC::Message& orig_msg,
629 IPC::PlatformFileForTransit ipc_fd, 629 IPC::PlatformFileForTransit ipc_fd,
630 base::FilePath file_path) { 630 base::FilePath file_path) {
631 base::AutoLock lock(lock_);
632 OnFileTokenResolvedLocked(orig_msg, ipc_fd, file_path);
633 }
634
635 void NaClIPCAdapter::OnFileTokenResolvedLocked(
636 const IPC::Message& orig_msg,
637 IPC::PlatformFileForTransit ipc_fd,
638 base::FilePath file_path) {
639 lock_.AssertAcquired();
631 // The path where an invalid ipc_fd is returned isn't currently 640 // The path where an invalid ipc_fd is returned isn't currently
632 // covered by any tests. 641 // covered by any tests.
633 if (ipc_fd == IPC::InvalidPlatformFileForTransit()) { 642 if (ipc_fd == IPC::InvalidPlatformFileForTransit()) {
634 // The file token didn't resolve successfully, so we give the 643 // The file token didn't resolve successfully, so we give the
635 // original FD to the client without making a validated NaClDesc. 644 // original FD to the client without making a validated NaClDesc.
636 // However, we must rewrite the message to clear the file tokens. 645 // However, we must rewrite the message to clear the file tokens.
637 PickleIterator iter = IPC::SyncMessage::GetDataIterator(&orig_msg); 646 PickleIterator iter = IPC::SyncMessage::GetDataIterator(&orig_msg);
638 ppapi::proxy::SerializedHandle sh; 647 ppapi::proxy::SerializedHandle sh;
639 648
640 // We know that this can be read safely; see the original read in 649 // We know that this can be read safely; see the original read in
641 // OnMessageReceived(). 650 // OnMessageReceived().
642 CHECK(IPC::ReadParam(&orig_msg, &iter, &sh)); 651 CHECK(IPC::ReadParam(&orig_msg, &iter, &sh));
643 scoped_ptr<IPC::Message> new_msg = CreateOpenResourceReply(orig_msg, sh); 652 scoped_ptr<IPC::Message> new_msg = CreateOpenResourceReply(orig_msg, sh);
644 653
645 scoped_ptr<NaClDescWrapper> desc_wrapper(new NaClDescWrapper( 654 scoped_ptr<NaClDescWrapper> desc_wrapper(new NaClDescWrapper(
646 NaClDescIoDescFromHandleAllocCtor( 655 NaClDescIoDescFromHandleAllocCtor(
647 #if defined(OS_WIN) 656 #if defined(OS_WIN)
648 sh.descriptor(), 657 sh.descriptor(),
649 #else 658 #else
650 sh.descriptor().fd, 659 sh.descriptor().fd,
651 #endif 660 #endif
652 NACL_ABI_O_RDONLY))); 661 NACL_ABI_O_RDONLY)));
653 662
654 scoped_refptr<RewrittenMessage> rewritten_msg(new RewrittenMessage); 663 scoped_refptr<RewrittenMessage> rewritten_msg(new RewrittenMessage);
655 rewritten_msg->AddDescriptor(desc_wrapper.release()); 664 rewritten_msg->AddDescriptor(desc_wrapper.release());
656 { 665 SaveMessage(*new_msg, rewritten_msg.get());
657 base::AutoLock lock(lock_); 666 cond_var_.Signal();
658 SaveMessage(*new_msg, rewritten_msg.get());
659 cond_var_.Signal();
660 }
661 return; 667 return;
662 } 668 }
663 669
664 // The file token was sucessfully resolved. 670 // The file token was sucessfully resolved.
665 std::string file_path_str = file_path.AsUTF8Unsafe(); 671 std::string file_path_str = file_path.AsUTF8Unsafe();
666 base::PlatformFile handle = 672 base::PlatformFile handle =
667 IPC::PlatformFileForTransitToPlatformFile(ipc_fd); 673 IPC::PlatformFileForTransitToPlatformFile(ipc_fd);
668 // The file token was resolved successfully, so we populate the new 674 // The file token was resolved successfully, so we populate the new
669 // NaClDesc with that information. 675 // NaClDesc with that information.
670 char* alloc_file_path = static_cast<char*>( 676 char* alloc_file_path = static_cast<char*>(
(...skipping 14 matching lines...) Expand all
685 static_cast<uint32_t>(file_path_str.length()); 691 static_cast<uint32_t>(file_path_str.length());
686 NaClSetFileOriginInfo(desc_wrapper->desc(), &info); 692 NaClSetFileOriginInfo(desc_wrapper->desc(), &info);
687 NaClRichFileInfoDtor(&info); 693 NaClRichFileInfoDtor(&info);
688 694
689 ppapi::proxy::SerializedHandle sh; 695 ppapi::proxy::SerializedHandle sh;
690 sh.set_file_handle(ipc_fd, PP_FILEOPENFLAG_READ, 0); 696 sh.set_file_handle(ipc_fd, PP_FILEOPENFLAG_READ, 0);
691 scoped_ptr<IPC::Message> new_msg = CreateOpenResourceReply(orig_msg, sh); 697 scoped_ptr<IPC::Message> new_msg = CreateOpenResourceReply(orig_msg, sh);
692 scoped_refptr<RewrittenMessage> rewritten_msg(new RewrittenMessage); 698 scoped_refptr<RewrittenMessage> rewritten_msg(new RewrittenMessage);
693 699
694 rewritten_msg->AddDescriptor(desc_wrapper.release()); 700 rewritten_msg->AddDescriptor(desc_wrapper.release());
695 { 701 SaveMessage(*new_msg, rewritten_msg.get());
696 base::AutoLock lock(lock_); 702 cond_var_.Signal();
697 SaveMessage(*new_msg, rewritten_msg.get());
698 cond_var_.Signal();
699 }
700 } 703 }
701 704
702 void NaClIPCAdapter::OnChannelConnected(int32 peer_pid) { 705 void NaClIPCAdapter::OnChannelConnected(int32 peer_pid) {
703 } 706 }
704 707
705 void NaClIPCAdapter::OnChannelError() { 708 void NaClIPCAdapter::OnChannelError() {
706 CloseChannel(); 709 CloseChannel();
707 } 710 }
708 711
709 NaClIPCAdapter::~NaClIPCAdapter() { 712 NaClIPCAdapter::~NaClIPCAdapter() {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 // here before we drop the message. 773 // here before we drop the message.
771 return false; 774 return false;
772 } 775 }
773 776
774 // Scan all untrusted messages. 777 // Scan all untrusted messages.
775 scoped_ptr<IPC::Message> new_msg; 778 scoped_ptr<IPC::Message> new_msg;
776 locked_data_.nacl_msg_scanner_.ScanUntrustedMessage(*msg, &new_msg); 779 locked_data_.nacl_msg_scanner_.ScanUntrustedMessage(*msg, &new_msg);
777 if (new_msg) 780 if (new_msg)
778 msg.reset(new_msg.release()); 781 msg.reset(new_msg.release());
779 782
783 // Handle PpapiHostMsg_OpenResource locally without sending an IPC to the
784 // renderer when possible.
785 PpapiHostMsg_OpenResource::Schema::SendParam send_params;
786 if (!open_resource_cb_.is_null() &&
787 (msg->type() == PpapiHostMsg_OpenResource::ID) &&
788 PpapiHostMsg_OpenResource::ReadSendParam(msg.get(), &send_params)) {
789 const std::string key = send_params.a;
790 if (open_resource_cb_.Run(
791 *msg.get(), key,
792 base::Bind(&NaClIPCAdapter::OnFileTokenResolvedLocked, this))) {
793 // The callback sent a reply to the untrusted side.
794 return true;
795 }
796 }
797
780 // Actual send must be done on the I/O thread. 798 // Actual send must be done on the I/O thread.
781 task_runner_->PostTask(FROM_HERE, 799 task_runner_->PostTask(FROM_HERE,
782 base::Bind(&NaClIPCAdapter::SendMessageOnIOThread, this, 800 base::Bind(&NaClIPCAdapter::SendMessageOnIOThread, this,
783 base::Passed(&msg))); 801 base::Passed(&msg)));
784 return true; 802 return true;
785 } 803 }
786 804
787 void NaClIPCAdapter::ClearToBeSent() { 805 void NaClIPCAdapter::ClearToBeSent() {
788 lock_.AssertAcquired(); 806 lock_.AssertAcquired();
789 807
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 header.flags = msg.flags(); 844 header.flags = msg.flags();
827 header.num_fds = static_cast<int>(rewritten_msg->desc_count()); 845 header.num_fds = static_cast<int>(rewritten_msg->desc_count());
828 846
829 rewritten_msg->SetData(header, msg.payload(), msg.payload_size()); 847 rewritten_msg->SetData(header, msg.payload(), msg.payload_size());
830 locked_data_.to_be_received_.push(rewritten_msg); 848 locked_data_.to_be_received_.push(rewritten_msg);
831 } 849 }
832 850
833 int TranslatePepperFileReadWriteOpenFlagsForTesting(int32_t pp_open_flags) { 851 int TranslatePepperFileReadWriteOpenFlagsForTesting(int32_t pp_open_flags) {
834 return TranslatePepperFileReadWriteOpenFlags(pp_open_flags); 852 return TranslatePepperFileReadWriteOpenFlags(pp_open_flags);
835 } 853 }
OLDNEW
« no previous file with comments | « components/nacl/loader/nacl_ipc_adapter.h ('k') | components/nacl/loader/nacl_listener.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698