aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkStream.h8
-rw-r--r--src/core/SkStream.cpp18
-rw-r--r--tests/StreamTest.cpp19
3 files changed, 40 insertions, 5 deletions
diff --git a/include/core/SkStream.h b/include/core/SkStream.h
index 8f0548e606..7ec3117f50 100644
--- a/include/core/SkStream.h
+++ b/include/core/SkStream.h
@@ -188,7 +188,13 @@ public:
/** if copyData is true, the stream makes a private copy of the data
*/
SkMemoryStream(const void* data, size_t length, bool copyData = false);
- SkMemoryStream(SkData *data);
+
+ /**
+ * Use the specified data as the memory for this stream. The stream will
+ * call ref() on the data (assuming it is not null).
+ */
+ SkMemoryStream(SkData*);
+
virtual ~SkMemoryStream();
/** Resets the stream to the specified data and length,
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index 2851e5fec3..f173b9e8c6 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -299,9 +299,13 @@ SkMemoryStream::SkMemoryStream(const void* src, size_t size, bool copyData) {
fOffset = 0;
}
-SkMemoryStream::SkMemoryStream(SkData *data) {
- fData = SkSafeRef(data);
- fOffset = 0;
+SkMemoryStream::SkMemoryStream(SkData* data) {
+ if (NULL == data) {
+ fData = SkData::NewEmpty();
+ } else {
+ fData = data;
+ fData->ref();
+ }
}
SkMemoryStream::~SkMemoryStream() {
@@ -326,7 +330,13 @@ SkData* SkMemoryStream::copyToData() const {
}
SkData* SkMemoryStream::setData(SkData* data) {
- SkRefCnt_SafeAssign(fData, data);
+ fData->unref();
+ if (NULL == data) {
+ fData = SkData::NewEmpty();
+ } else {
+ fData = data;
+ fData->ref();
+ }
return data;
}
diff --git a/tests/StreamTest.cpp b/tests/StreamTest.cpp
index b5e3cd98b8..ed51aa7baf 100644
--- a/tests/StreamTest.cpp
+++ b/tests/StreamTest.cpp
@@ -130,10 +130,29 @@ static void TestPackedUInt(skiatest::Reporter* reporter) {
}
}
+// Test that setting an SkMemoryStream to a NULL data does not result in a crash when calling
+// methods that access fData.
+static void TestDereferencingData(SkMemoryStream* memStream) {
+ memStream->read(NULL, 0);
+ memStream->getMemoryBase();
+ SkAutoDataUnref data(memStream->copyToData());
+}
+
+static void TestNullData() {
+ SkData* nullData = NULL;
+ SkMemoryStream memStream(nullData);
+ TestDereferencingData(&memStream);
+
+ memStream.setData(nullData);
+ TestDereferencingData(&memStream);
+
+}
+
static void TestStreams(skiatest::Reporter* reporter) {
TestRStream(reporter);
TestWStream(reporter);
TestPackedUInt(reporter);
+ TestNullData();
}
#include "TestClassDef.h"