summaryrefslogtreecommitdiffstats
path: root/ppapi
diff options
context:
space:
mode:
authordmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-01 05:58:38 +0000
committerdmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-01 05:58:38 +0000
commit2b498344ae34277f3967d0d2b302861bcd1299b5 (patch)
tree8f9a655c259a1379a8021f23c1faf3fdd278aae5 /ppapi
parent721b7aad7498a2c96cfa4dfb825f0be9994757a6 (diff)
downloadchromium_src-2b498344ae34277f3967d0d2b302861bcd1299b5.zip
chromium_src-2b498344ae34277f3967d0d2b302861bcd1299b5.tar.gz
chromium_src-2b498344ae34277f3967d0d2b302861bcd1299b5.tar.bz2
PPAPI: Fix WebSocket Var ref leak receiving binary
BUG=173503 Review URL: https://chromiumcodereview.appspot.com/12096099 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180093 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi')
-rw-r--r--ppapi/proxy/websocket_resource.cc6
-rw-r--r--ppapi/shared_impl/var_tracker.cc13
-rw-r--r--ppapi/shared_impl/var_tracker.h6
-rw-r--r--ppapi/tests/test_case.h2
-rw-r--r--ppapi/tests/test_websocket.cc1
5 files changed, 20 insertions, 8 deletions
diff --git a/ppapi/proxy/websocket_resource.cc b/ppapi/proxy/websocket_resource.cc
index c45de90..7439826 100644
--- a/ppapi/proxy/websocket_resource.cc
+++ b/ppapi/proxy/websocket_resource.cc
@@ -423,10 +423,10 @@ void WebSocketResource::OnPluginMsgReceiveBinaryReply(
return;
// Append received data to queue.
- scoped_refptr<Var> message_var(ArrayBufferVar::FromPPVar(
- PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
+ scoped_refptr<Var> message_var(
+ PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferVar(
message.size(),
- &message.front())));
+ &message.front()));
received_messages_.push(message_var);
if (!TrackedCallback::IsPending(receive_callback_))
diff --git a/ppapi/shared_impl/var_tracker.cc b/ppapi/shared_impl/var_tracker.cc
index 8214a30..d515cf7 100644
--- a/ppapi/shared_impl/var_tracker.cc
+++ b/ppapi/shared_impl/var_tracker.cc
@@ -186,13 +186,18 @@ PP_Var VarTracker::MakeArrayBufferPPVar(uint32 size_in_bytes) {
PP_Var VarTracker::MakeArrayBufferPPVar(uint32 size_in_bytes,
const void* data) {
- DCHECK(CalledOnValidThread());
+ ArrayBufferVar* array_buffer = MakeArrayBufferVar(size_in_bytes, data);
+ return array_buffer ? array_buffer->GetPPVar() : PP_MakeNull();
+}
- scoped_refptr<ArrayBufferVar> array_buffer(CreateArrayBuffer(size_in_bytes));
+ArrayBufferVar* VarTracker::MakeArrayBufferVar(uint32 size_in_bytes,
+ const void* data) {
+ DCHECK(CalledOnValidThread());
+ ArrayBufferVar* array_buffer(CreateArrayBuffer(size_in_bytes));
if (!array_buffer)
- return PP_MakeNull();
+ return NULL;
memcpy(array_buffer->Map(), data, size_in_bytes);
- return array_buffer->GetPPVar();
+ return array_buffer;
}
std::vector<PP_Var> VarTracker::GetLiveVars() {
diff --git a/ppapi/shared_impl/var_tracker.h b/ppapi/shared_impl/var_tracker.h
index b873250..1d0c0d6 100644
--- a/ppapi/shared_impl/var_tracker.h
+++ b/ppapi/shared_impl/var_tracker.h
@@ -73,6 +73,12 @@ class PPAPI_SHARED_EXPORT VarTracker
// Same as above, but copy the contents of |data| in to the new array buffer.
PP_Var MakeArrayBufferPPVar(uint32 size_in_bytes, const void* data);
+ // Create an ArrayBuffer and copy the contents of |data| in to it. The
+ // returned object has 0 reference count in the tracker, and like all
+ // RefCounted objects, has a 0 initial internal reference count. (You should
+ // usually immediately put this in a scoped_refptr).
+ ArrayBufferVar* MakeArrayBufferVar(uint32 size_in_bytes, const void* data);
+
// Return a vector containing all PP_Vars that are in the tracker. This is
// to help implement PPB_Testing_Dev.GetLiveVars and should generally not be
// used in production code. The PP_Vars are returned in no particular order,
diff --git a/ppapi/tests/test_case.h b/ppapi/tests/test_case.h
index b06f941..b63309f 100644
--- a/ppapi/tests/test_case.h
+++ b/ppapi/tests/test_case.h
@@ -313,7 +313,7 @@ class TestCaseFactory {
instance_->pp_instance()) != objects) \
error_message = MakeFailureMessage(__FILE__, __LINE__, \
"reference leak check"); \
- instance_->LogTest(#name, error_message); \
+ instance_->LogTest(#name, CheckResourcesAndVars(error_message)); \
}
// Helper macros for checking values in tests, and returning a location
diff --git a/ppapi/tests/test_websocket.cc b/ppapi/tests/test_websocket.cc
index d5dc486..acbad3e 100644
--- a/ppapi/tests/test_websocket.cc
+++ b/ppapi/tests/test_websocket.cc
@@ -464,6 +464,7 @@ std::string TestWebSocket::TestValidConnect() {
PP_Var extensions = websocket_interface_->GetExtensions(ws);
ASSERT_TRUE(AreEqualWithString(extensions, ""));
core_interface_->ReleaseResource(ws);
+ ReleaseVar(extensions);
PASS();
}