diff options
-rw-r--r-- | include/core/SkStream.h | 8 | ||||
-rw-r--r-- | src/core/SkStream.cpp | 18 | ||||
-rw-r--r-- | tests/StreamTest.cpp | 19 |
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" |