diff options
author | dmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-09 21:10:31 +0000 |
---|---|---|
committer | dmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-09 21:10:31 +0000 |
commit | 40c4627d7584c58fb5a8b3b258892a22bd29070f (patch) | |
tree | 4c907aaa8fc8774103b07d377a587d3995fbefb3 /ipc | |
parent | dc33991aad1eb7b2ec8b4d77e338919814f5e032 (diff) | |
download | chromium_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.cc | 11 | ||||
-rw-r--r-- | ipc/ipc_sync_message.h | 4 |
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_; }; |