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

Unified Diff: ppapi/proxy/resource_message_params.cc

Issue 11312017: Avoid leaking SerializedHandles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: ppapi/proxy/resource_message_params.cc
diff --git a/ppapi/proxy/resource_message_params.cc b/ppapi/proxy/resource_message_params.cc
index 6d3fa02f465236e903b54445ca1c8700cce15aa2..5d927c52883c40e79bc6dfc5c196944b24388628 100644
--- a/ppapi/proxy/resource_message_params.cc
+++ b/ppapi/proxy/resource_message_params.cc
@@ -4,21 +4,37 @@
#include "ppapi/proxy/resource_message_params.h"
+#include "base/logging.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/proxy/ppapi_messages.h"
namespace ppapi {
namespace proxy {
+ResourceMessageParams::SerializedHandles::SerializedHandles()
+ : should_close(false) {
+}
+
+ResourceMessageParams::SerializedHandles::~SerializedHandles() {
+ if (should_close) {
+ for (std::vector<SerializedHandle>::iterator iter = data.begin();
+ iter != data.end(); ++iter) {
+ iter->Close();
+ }
+ }
+}
+
ResourceMessageParams::ResourceMessageParams()
: pp_resource_(0),
- sequence_(0) {
+ sequence_(0),
+ handles_(new SerializedHandles()) {
}
ResourceMessageParams::ResourceMessageParams(PP_Resource resource,
int32_t sequence)
: pp_resource_(resource),
- sequence_(sequence) {
+ sequence_(sequence),
+ handles_(new SerializedHandles()) {
}
ResourceMessageParams::~ResourceMessageParams() {
@@ -27,51 +43,54 @@ ResourceMessageParams::~ResourceMessageParams() {
void ResourceMessageParams::Serialize(IPC::Message* msg) const {
IPC::ParamTraits<PP_Resource>::Write(msg, pp_resource_);
IPC::ParamTraits<int32_t>::Write(msg, sequence_);
- IPC::ParamTraits<std::vector<SerializedHandle> >::Write(msg, handles_);
+ IPC::ParamTraits<std::vector<SerializedHandle> >::Write(msg, handles_->data);
}
bool ResourceMessageParams::Deserialize(const IPC::Message* msg,
PickleIterator* iter) {
+ DCHECK(handles_->data.empty());
+ handles_->should_close = true;
return IPC::ParamTraits<PP_Resource>::Read(msg, iter, &pp_resource_) &&
IPC::ParamTraits<int32_t>::Read(msg, iter, &sequence_) &&
IPC::ParamTraits<std::vector<SerializedHandle> >::Read(
- msg, iter, &handles_);
+ msg, iter, &handles_->data);
}
-const SerializedHandle* ResourceMessageParams::GetHandleOfTypeAtIndex(
+SerializedHandle ResourceMessageParams::TakeHandleOfTypeAtIndex(
size_t index,
SerializedHandle::Type type) const {
- if (handles_.size() <= index)
- return NULL;
- if (handles_[index].type() != type)
- return NULL;
- return &handles_[index];
+ SerializedHandle handle;
+ if (index < handles_->data.size() && handles_->data[index].type() == type) {
+ handle = handles_->data[index];
+ handles_->data[index] = SerializedHandle();
+ }
+ return handle;
}
-bool ResourceMessageParams::GetSharedMemoryHandleAtIndex(
+bool ResourceMessageParams::TakeSharedMemoryHandleAtIndex(
size_t index,
base::SharedMemoryHandle* handle) const {
- const SerializedHandle* serialized = GetHandleOfTypeAtIndex(
+ SerializedHandle serialized = TakeHandleOfTypeAtIndex(
index, SerializedHandle::SHARED_MEMORY);
- if (!serialized)
+ if (!serialized.is_shmem())
return false;
- *handle = serialized->shmem();
+ *handle = serialized.shmem();
return true;
}
-bool ResourceMessageParams::GetSocketHandleAtIndex(
+bool ResourceMessageParams::TakeSocketHandleAtIndex(
size_t index,
IPC::PlatformFileForTransit* handle) const {
- const SerializedHandle* serialized = GetHandleOfTypeAtIndex(
+ SerializedHandle serialized = TakeHandleOfTypeAtIndex(
index, SerializedHandle::SOCKET);
- if (!serialized)
+ if (!serialized.is_socket())
return false;
- *handle = serialized->descriptor();
+ *handle = serialized.descriptor();
return true;
}
-void ResourceMessageParams::AppendHandle(const SerializedHandle& handle) {
- handles_.push_back(handle);
+void ResourceMessageParams::AppendHandle(const SerializedHandle& handle) const {
+ handles_->data.push_back(handle);
}
ResourceMessageCallParams::ResourceMessageCallParams()

Powered by Google App Engine
This is Rietveld 408576698