| Index: ipc/ipc_message_attachment_set.cc
|
| diff --git a/ipc/ipc_message_attachment_set.cc b/ipc/ipc_message_attachment_set.cc
|
| index 4e27ad2ecd1b01cc023af87261b51ee58f96e733..dd881c5843f1090c210134ab3821c20e85da75bf 100644
|
| --- a/ipc/ipc_message_attachment_set.cc
|
| +++ b/ipc/ipc_message_attachment_set.cc
|
| @@ -8,12 +8,12 @@
|
| #include "base/logging.h"
|
| #include "base/posix/eintr_wrapper.h"
|
| #include "ipc/ipc_message_attachment.h"
|
| -#include "ipc/ipc_platform_file_attachment.h"
|
|
|
| #if defined(OS_POSIX)
|
| #include <sys/types.h>
|
| #include <sys/stat.h>
|
| #include <unistd.h>
|
| +#include "ipc/ipc_platform_file_attachment_posix.h"
|
| #endif // OS_POSIX
|
|
|
| namespace IPC {
|
| @@ -49,9 +49,18 @@ unsigned MessageAttachmentSet::size() const {
|
| return static_cast<unsigned>(attachments_.size());
|
| }
|
|
|
| -void MessageAttachmentSet::AddAttachment(
|
| +bool MessageAttachmentSet::AddAttachment(
|
| scoped_refptr<MessageAttachment> attachment) {
|
| +#if defined(OS_POSIX)
|
| + if (attachment->GetType() != MessageAttachment::TYPE_PLATFORM_FILE ||
|
| + num_descriptors() == kMaxDescriptorsPerMessage) {
|
| + DLOG(WARNING) << "Cannot add file descriptor. MessageAttachmentSet full.";
|
| + return false;
|
| + }
|
| +#endif
|
| +
|
| attachments_.push_back(attachment);
|
| + return true;
|
| }
|
|
|
| scoped_refptr<MessageAttachment> MessageAttachmentSet::GetAttachmentAt(
|
| @@ -95,55 +104,6 @@ scoped_refptr<MessageAttachment> MessageAttachmentSet::GetAttachmentAt(
|
|
|
| #if defined(OS_POSIX)
|
|
|
| -bool MessageAttachmentSet::AddToBorrow(base::PlatformFile fd) {
|
| - DCHECK_EQ(consumed_descriptor_highwater_, 0u);
|
| -
|
| - if (num_descriptors() == kMaxDescriptorsPerMessage) {
|
| - DLOG(WARNING) << "Cannot add file descriptor. MessageAttachmentSet full.";
|
| - return false;
|
| - }
|
| -
|
| - AddAttachment(new internal::PlatformFileAttachment(fd));
|
| - return true;
|
| -}
|
| -
|
| -bool MessageAttachmentSet::AddToOwn(base::ScopedFD fd) {
|
| - DCHECK_EQ(consumed_descriptor_highwater_, 0u);
|
| -
|
| - if (num_descriptors() == kMaxDescriptorsPerMessage) {
|
| - DLOG(WARNING) << "Cannot add file descriptor. MessageAttachmentSet full.";
|
| - return false;
|
| - }
|
| -
|
| - AddAttachment(new internal::PlatformFileAttachment(fd.get()));
|
| - owned_descriptors_.push_back(new base::ScopedFD(fd.Pass()));
|
| - DCHECK(num_descriptors() <= kMaxDescriptorsPerMessage);
|
| - return true;
|
| -}
|
| -
|
| -base::PlatformFile MessageAttachmentSet::TakeDescriptorAt(unsigned index) {
|
| - scoped_refptr<MessageAttachment> attachment = GetAttachmentAt(index);
|
| - if (!attachment)
|
| - return -1;
|
| -
|
| - base::PlatformFile file = internal::GetPlatformFile(attachment);
|
| -
|
| - // TODO(morrita): In production, attachments_.size() should be same as
|
| - // owned_descriptors_.size() as all read descriptors are owned by Message.
|
| - // We have to do this because unit test breaks this assumption. It should be
|
| - // changed to exercise with own-able descriptors.
|
| - for (ScopedVector<base::ScopedFD>::const_iterator i =
|
| - owned_descriptors_.begin();
|
| - i != owned_descriptors_.end(); ++i) {
|
| - if ((*i)->get() == file) {
|
| - ignore_result((*i)->release());
|
| - break;
|
| - }
|
| - }
|
| -
|
| - return file;
|
| -}
|
| -
|
| void MessageAttachmentSet::PeekDescriptors(base::PlatformFile* buffer) const {
|
| for (size_t i = 0; i != attachments_.size(); ++i)
|
| buffer[i] = internal::GetPlatformFile(attachments_[i]);
|
| @@ -162,15 +122,16 @@ bool MessageAttachmentSet::ContainsDirectoryDescriptor() const {
|
|
|
| void MessageAttachmentSet::CommitAll() {
|
| attachments_.clear();
|
| - owned_descriptors_.clear();
|
| consumed_descriptor_highwater_ = 0;
|
| }
|
|
|
| void MessageAttachmentSet::ReleaseFDsToClose(
|
| std::vector<base::PlatformFile>* fds) {
|
| - for (ScopedVector<base::ScopedFD>::iterator i = owned_descriptors_.begin();
|
| - i != owned_descriptors_.end(); ++i) {
|
| - fds->push_back((*i)->release());
|
| + for (size_t i = 0; i < attachments_.size(); ++i) {
|
| + internal::PlatformFileAttachment* file =
|
| + static_cast<internal::PlatformFileAttachment*>(attachments_[i].get());
|
| + if (file->Owns())
|
| + fds->push_back(file->TakePlatformFile());
|
| }
|
|
|
| CommitAll();
|
| @@ -183,11 +144,9 @@ void MessageAttachmentSet::AddDescriptorsToOwn(const base::PlatformFile* buffer,
|
| DCHECK_EQ(consumed_descriptor_highwater_, 0u);
|
|
|
| attachments_.reserve(count);
|
| - owned_descriptors_.reserve(count);
|
| - for (unsigned i = 0; i < count; ++i) {
|
| - AddAttachment(new internal::PlatformFileAttachment(buffer[i]));
|
| - owned_descriptors_.push_back(new base::ScopedFD(buffer[i]));
|
| - }
|
| + for (unsigned i = 0; i < count; ++i)
|
| + AddAttachment(
|
| + new internal::PlatformFileAttachment(base::ScopedFD(buffer[i])));
|
| }
|
|
|
| #endif // OS_POSIX
|
|
|