diff options
Diffstat (limited to 'chrome/common')
-rw-r--r-- | chrome/common/common.scons | 2 | ||||
-rw-r--r-- | chrome/common/descriptor_set_posix.cc (renamed from chrome/common/file_descriptor_posix.cc) | 28 | ||||
-rw-r--r-- | chrome/common/descriptor_set_posix.h (renamed from chrome/common/file_descriptor_posix.h) | 37 | ||||
-rw-r--r-- | chrome/common/ipc_channel_posix.cc | 2 | ||||
-rw-r--r-- | chrome/common/ipc_channel_posix.h | 2 | ||||
-rw-r--r-- | chrome/common/ipc_message.h | 2 | ||||
-rw-r--r-- | chrome/common/ipc_message_utils.h | 12 | ||||
-rw-r--r-- | chrome/common/ipc_send_fds_test.cc | 9 | ||||
-rw-r--r-- | chrome/common/ipc_tests.cc | 2 | ||||
-rw-r--r-- | chrome/common/resource_dispatcher.cc | 3 |
10 files changed, 49 insertions, 50 deletions
diff --git a/chrome/common/common.scons b/chrome/common/common.scons index 7eca809..829da06 100644 --- a/chrome/common/common.scons +++ b/chrome/common/common.scons @@ -219,7 +219,7 @@ if not env.Bit('windows'): # TODO(port): This is temporary so we can link. input_files.Append( 'temp_scaffolding_stubs.cc', - 'file_descriptor_posix.cc', + 'descriptor_set_posix.cc', ) # TODO(port): Port these. diff --git a/chrome/common/file_descriptor_posix.cc b/chrome/common/descriptor_set_posix.cc index 7db9514..82f2899 100644 --- a/chrome/common/file_descriptor_posix.cc +++ b/chrome/common/descriptor_set_posix.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/common/file_descriptor_posix.h" +#include "chrome/common/descriptor_set_posix.h" #include "base/logging.h" @@ -29,20 +29,27 @@ DescriptorSet::~DescriptorSet() { } } -void DescriptorSet::Add(int fd) { - struct FileDescriptor sd; +bool DescriptorSet::Add(int fd) { + if (descriptors_.size() == MAX_DESCRIPTORS_PER_MESSAGE) + return false; + + struct base::FileDescriptor sd; sd.fd = fd; sd.auto_close = false; descriptors_.push_back(sd); - DCHECK(descriptors_.size() <= MAX_DESCRIPTORS_PER_MESSAGE); + return true; } -void DescriptorSet::AddAndAutoClose(int fd) { - struct FileDescriptor sd; +bool DescriptorSet::AddAndAutoClose(int fd) { + if (descriptors_.size() == MAX_DESCRIPTORS_PER_MESSAGE) + return false; + + struct base::FileDescriptor sd; sd.fd = fd; sd.auto_close = true; descriptors_.push_back(sd); DCHECK(descriptors_.size() <= MAX_DESCRIPTORS_PER_MESSAGE); + return true; } int DescriptorSet::NextDescriptor() { @@ -53,19 +60,22 @@ int DescriptorSet::NextDescriptor() { } void DescriptorSet::GetDescriptors(int* buffer) const { - for (std::vector<FileDescriptor>::const_iterator + DCHECK_EQ(next_descriptor_, 0u); + + for (std::vector<base::FileDescriptor>::const_iterator i = descriptors_.begin(); i != descriptors_.end(); ++i) { *(buffer++) = i->fd; } } void DescriptorSet::CommitAll() { - for (std::vector<FileDescriptor>::iterator + for (std::vector<base::FileDescriptor>::iterator i = descriptors_.begin(); i != descriptors_.end(); ++i) { if (i->auto_close) close(i->fd); } descriptors_.clear(); + next_descriptor_ = 0; } void DescriptorSet::SetDescriptors(const int* buffer, unsigned count) { @@ -74,7 +84,7 @@ void DescriptorSet::SetDescriptors(const int* buffer, unsigned count) { descriptors_.reserve(count); for (unsigned i = 0; i < count; ++i) { - struct FileDescriptor sd; + struct base::FileDescriptor sd; sd.fd = buffer[i]; sd.auto_close = true; descriptors_.push_back(sd); diff --git a/chrome/common/file_descriptor_posix.h b/chrome/common/descriptor_set_posix.h index 43590b0..36a0433 100644 --- a/chrome/common/file_descriptor_posix.h +++ b/chrome/common/descriptor_set_posix.h @@ -2,30 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_COMMON_FILE_DESCRIPTOR_POSIX_H_ -#define CHROME_COMMON_FILE_DESCRIPTOR_POSIX_H_ +#ifndef CHROME_COMMON_DESCRIPTOR_SET_POSIX_H_ +#define CHROME_COMMON_DESCRIPTOR_SET_POSIX_H_ #include <vector> -// ----------------------------------------------------------------------------- -// A FileDescriptor is a structure for use in IPC messages. It allows one to -// send descriptors over an IPC channel. -// -// In the Windows world, processes can peek and poke the HANDLE table of other -// processes. On POSIX, in order to transmit descriptors we need to include -// them in a control-message (a side-channel on the UNIX domain socket). -// Serialising this type adds descriptors to a vector in the IPC Message, from -// which the IPC channel can package them up for the kernel. -// ----------------------------------------------------------------------------- -struct FileDescriptor { - FileDescriptor() - : fd(-1), - auto_close(false) { } - - int fd; - // If true, close this descriptor after it has been sent. - bool auto_close; -}; +#include "base/basictypes.h" +#include "base/file_descriptor_posix.h" // ----------------------------------------------------------------------------- // A DescriptorSet is an ordered set of POSIX file descriptors. These are @@ -52,11 +35,11 @@ class DescriptorSet { // --------------------------------------------------------------------------- // Interfaces for building during message serialisation... - // Add a descriptor to the end of the set - void Add(int fd); + // Add a descriptor to the end of the set. Returns false iff the set is full. + bool Add(int fd); // Add a descriptor to the end of the set and automatically close it after - // transmission. - void AddAndAutoClose(int fd); + // transmission. Returns false iff the set is full. + bool AddAndAutoClose(int fd); // --------------------------------------------------------------------------- @@ -115,10 +98,12 @@ class DescriptorSet { // these descriptors are sent as control data. After sending, any descriptors // with a true flag are closed. If this message has been received, then these // are the descriptors which were received and all close flags are true. - std::vector<FileDescriptor> descriptors_; + std::vector<base::FileDescriptor> descriptors_; // When deserialising the message, the descriptors will be extracted // one-by-one. This contains the index of the next unused descriptor. unsigned next_descriptor_; + + DISALLOW_COPY_AND_ASSIGN(DescriptorSet); }; #endif // CHROME_COMMON_FILE_DESCRIPTOR_POSIX_H_ diff --git a/chrome/common/ipc_channel_posix.cc b/chrome/common/ipc_channel_posix.cc index b688c77..d9f44dd 100644 --- a/chrome/common/ipc_channel_posix.cc +++ b/chrome/common/ipc_channel_posix.cc @@ -28,7 +28,7 @@ #include "base/singleton.h" #include "chrome/common/chrome_counters.h" #include "chrome/common/chrome_switches.h" -#include "chrome/common/file_descriptor_posix.h" +#include "chrome/common/descriptor_set_posix.h" #include "chrome/common/ipc_message_utils.h" namespace IPC { diff --git a/chrome/common/ipc_channel_posix.h b/chrome/common/ipc_channel_posix.h index 555d463..d6ed17d 100644 --- a/chrome/common/ipc_channel_posix.h +++ b/chrome/common/ipc_channel_posix.h @@ -14,7 +14,7 @@ #include <vector> #include "base/message_loop.h" -#include "chrome/common/file_descriptor_posix.h" +#include "chrome/common/descriptor_set_posix.h" namespace IPC { diff --git a/chrome/common/ipc_message.h b/chrome/common/ipc_message.h index 0af3b44..8aedbe3 100644 --- a/chrome/common/ipc_message.h +++ b/chrome/common/ipc_message.h @@ -17,7 +17,7 @@ #define IPC_MESSAGE_LOG_ENABLED #endif #elif defined(OS_POSIX) -#include "chrome/common/file_descriptor_posix.h" +#include "chrome/common/descriptor_set_posix.h" #endif namespace IPC { diff --git a/chrome/common/ipc_message_utils.h b/chrome/common/ipc_message_utils.h index bd38df0..e7dd7e3 100644 --- a/chrome/common/ipc_message_utils.h +++ b/chrome/common/ipc_message_utils.h @@ -13,7 +13,7 @@ #include "base/string_util.h" #include "base/tuple.h" #if defined(OS_POSIX) -#include "chrome/common/file_descriptor_posix.h" +#include "chrome/common/descriptor_set_posix.h" #endif #include "chrome/common/ipc_sync_message.h" #include "chrome/common/thumbnail_score.h" @@ -668,13 +668,15 @@ struct ParamTraits<gfx::Size> { #if defined(OS_POSIX) template<> -struct ParamTraits<FileDescriptor> { - typedef FileDescriptor param_type; +struct ParamTraits<base::FileDescriptor> { + typedef base::FileDescriptor param_type; static void Write(Message* m, const param_type& p) { if (p.auto_close) { - m->descriptor_set()->AddAndAutoClose(p.fd); + if (!m->descriptor_set()->AddAndAutoClose(p.fd)) + NOTREACHED(); } else { - m->descriptor_set()->Add(p.fd); + if (!m->descriptor_set()->Add(p.fd)) + NOTREACHED(); } } static bool Read(const Message* m, void** iter, param_type* r) { diff --git a/chrome/common/ipc_send_fds_test.cc b/chrome/common/ipc_send_fds_test.cc index ca22bd5..e7cb207 100644 --- a/chrome/common/ipc_send_fds_test.cc +++ b/chrome/common/ipc_send_fds_test.cc @@ -47,10 +47,11 @@ class MyChannelDescriptorListener : public IPC::Channel::Listener { virtual void OnMessageReceived(const IPC::Message& message) { void* iter = NULL; - FileDescriptor descriptor; + base::FileDescriptor descriptor; ASSERT_TRUE( - IPC::ParamTraits<FileDescriptor>::Read(&message, &iter, &descriptor)); + IPC::ParamTraits<base::FileDescriptor>::Read( + &message, &iter, &descriptor)); VerifyAndCloseDescriptor(descriptor.fd, expected_inode_num_); MessageLoop::current()->Quit(); @@ -67,7 +68,7 @@ void TestDescriptorServer(IPC::Channel &chan, base::ProcessHandle process_handle) { ASSERT_TRUE(process_handle); - FileDescriptor descriptor; + base::FileDescriptor descriptor; const int fd = open(kDevRandomPath, O_RDONLY); ASSERT_GE(fd, 0); descriptor.auto_close = true; @@ -76,7 +77,7 @@ void TestDescriptorServer(IPC::Channel &chan, IPC::Message* message = new IPC::Message(0, // routing_id 3, // message type IPC::Message::PRIORITY_NORMAL); - IPC::ParamTraits<FileDescriptor>::Write(message, descriptor); + IPC::ParamTraits<base::FileDescriptor>::Write(message, descriptor); chan.Send(message); // Run message loop. diff --git a/chrome/common/ipc_tests.cc b/chrome/common/ipc_tests.cc index 2544e43..4b24406 100644 --- a/chrome/common/ipc_tests.cc +++ b/chrome/common/ipc_tests.cc @@ -27,7 +27,7 @@ #include "base/thread.h" #include "chrome/common/chrome_switches.h" #if defined(OS_POSIX) -#include "chrome/common/file_descriptor_posix.h" +#include "chrome/common/descriptor_set_posix.h" #endif #include "chrome/common/ipc_channel.h" #include "chrome/common/ipc_channel_proxy.h" diff --git a/chrome/common/resource_dispatcher.cc b/chrome/common/resource_dispatcher.cc index 7f64d32..e9db613 100644 --- a/chrome/common/resource_dispatcher.cc +++ b/chrome/common/resource_dispatcher.cc @@ -342,7 +342,8 @@ void ResourceDispatcher::OnReceivedData(int request_id, sender->Send( new ViewHostMsg_DataReceived_ACK(MSG_ROUTING_NONE, request_id)); - DCHECK((shm_handle && data_len > 0) || (!shm_handle && !data_len)); + const bool shm_valid = base::SharedMemory::IsHandleValid(shm_handle); + DCHECK((shm_valid && data_len > 0) || (!shm_valid && !data_len)); base::SharedMemory shared_mem(shm_handle, true); // read only PendingRequestList::iterator it = pending_requests_.find(request_id); |