summaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authordmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-09 21:10:31 +0000
committerdmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-09 21:10:31 +0000
commit40c4627d7584c58fb5a8b3b258892a22bd29070f (patch)
tree4c907aaa8fc8774103b07d377a587d3995fbefb3 /ipc
parentdc33991aad1eb7b2ec8b4d77e338919814f5e032 (diff)
downloadchromium_src-40c4627d7584c58fb5a8b3b258892a22bd29070f.zip
chromium_src-40c4627d7584c58fb5a8b3b258892a22bd29070f.tar.gz
chromium_src-40c4627d7584c58fb5a8b3b258892a22bd29070f.tar.bz2
Fix memory leak if user of IPC::SyncMessage never calls GetReplyDeserializer().
This isn't a problem for most real code, because SyncChannel and SyncMessageFilter do it for you. It shows up in ppapi_unittests (and presumably any other tests that rely on IPC::TestSink). Also removed some code that worked around the problem. Bonus: Allow running ppapi_unittests in tools/valgrind/chrome_tests.py. BUG=90240 TEST=valgrind trybots Review URL: http://codereview.chromium.org/7831060 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100496 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ipc')
-rw-r--r--ipc/ipc_sync_message.cc11
-rw-r--r--ipc/ipc_sync_message.h4
2 files changed, 9 insertions, 6 deletions
diff --git a/ipc/ipc_sync_message.cc b/ipc/ipc_sync_message.cc
index 21fae8f..e276263 100644
--- a/ipc/ipc_sync_message.cc
+++ b/ipc/ipc_sync_message.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -40,11 +40,12 @@ SyncMessage::SyncMessage(
WriteSyncHeader(this, header);
}
+SyncMessage::~SyncMessage() {
+}
+
MessageReplyDeserializer* SyncMessage::GetReplyDeserializer() {
- MessageReplyDeserializer* rv = deserializer_;
- DCHECK(rv);
- deserializer_ = NULL;
- return rv;
+ DCHECK(deserializer_.get());
+ return deserializer_.release();
}
void SyncMessage::EnableMessagePumping() {
diff --git a/ipc/ipc_sync_message.h b/ipc/ipc_sync_message.h
index 2c6ed8b..087df0d 100644
--- a/ipc/ipc_sync_message.h
+++ b/ipc/ipc_sync_message.h
@@ -11,6 +11,7 @@
#endif
#include <string>
#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
#include "ipc/ipc_message.h"
namespace base {
@@ -25,6 +26,7 @@ class IPC_EXPORT SyncMessage : public Message {
public:
SyncMessage(int32 routing_id, uint32 type, PriorityValue priority,
MessageReplyDeserializer* deserializer);
+ virtual ~SyncMessage();
// Call this to get a deserializer for the output parameters.
// Note that this can only be called once, and the caller is responsible
@@ -76,7 +78,7 @@ class IPC_EXPORT SyncMessage : public Message {
static bool ReadSyncHeader(const Message& msg, SyncHeader* header);
static bool WriteSyncHeader(Message* msg, const SyncHeader& header);
- MessageReplyDeserializer* deserializer_;
+ scoped_ptr<MessageReplyDeserializer> deserializer_;
base::WaitableEvent* pump_messages_event_;
};