Index: src/codec/SkCodec_libico.cpp |
diff --git a/src/codec/SkCodec_libico.cpp b/src/codec/SkCodec_libico.cpp |
index 2adfa9cfde6157c97920fd59c2f9650094f3f549..6a62ed88666254b13466629d3ec85aeb20953dce 100644 |
--- a/src/codec/SkCodec_libico.cpp |
+++ b/src/codec/SkCodec_libico.cpp |
@@ -33,6 +33,9 @@ bool SkIcoCodec::IsIco(SkStream* stream) { |
* Reads enough of the stream to determine the image format |
*/ |
SkCodec* SkIcoCodec::NewFromStream(SkStream* stream) { |
+ // Ensure that we do not leak the input stream |
+ SkAutoTDelete<SkStream> inputStream(stream); |
+ |
// Header size constants |
static const uint32_t kIcoDirectoryBytes = 6; |
static const uint32_t kIcoDirEntryBytes = 16; |
@@ -40,7 +43,7 @@ SkCodec* SkIcoCodec::NewFromStream(SkStream* stream) { |
// Read the directory header |
SkAutoTDeleteArray<uint8_t> dirBuffer( |
SkNEW_ARRAY(uint8_t, kIcoDirectoryBytes)); |
- if (stream->read(dirBuffer.get(), kIcoDirectoryBytes) != |
+ if (inputStream.get()->read(dirBuffer.get(), kIcoDirectoryBytes) != |
kIcoDirectoryBytes) { |
SkDebugf("Error: unable to read ico directory header.\n"); |
return NULL; |
@@ -56,7 +59,7 @@ SkCodec* SkIcoCodec::NewFromStream(SkStream* stream) { |
// Ensure that we can read all of indicated directory entries |
SkAutoTDeleteArray<uint8_t> entryBuffer( |
SkNEW_ARRAY(uint8_t, numImages*kIcoDirEntryBytes)); |
- if (stream->read(entryBuffer.get(), numImages*kIcoDirEntryBytes) != |
+ if (inputStream.get()->read(entryBuffer.get(), numImages*kIcoDirEntryBytes) != |
numImages*kIcoDirEntryBytes) { |
SkDebugf("Error: unable to read ico directory entries.\n"); |
return NULL; |
@@ -121,14 +124,15 @@ SkCodec* SkIcoCodec::NewFromStream(SkStream* stream) { |
// If we cannot skip, assume we have reached the end of the stream and |
// stop trying to make codecs |
- if (stream->skip(offset - bytesRead) != offset - bytesRead) { |
+ if (inputStream.get()->skip(offset - bytesRead) != offset - bytesRead) { |
SkDebugf("Warning: could not skip to ico offset.\n"); |
break; |
} |
bytesRead = offset; |
// Create a new stream for the embedded codec |
- SkAutoTUnref<SkData> data(SkData::NewFromStream(stream, size)); |
+ SkAutoTUnref<SkData> data( |
+ SkData::NewFromStream(inputStream.get(), size)); |
if (NULL == data.get()) { |
SkDebugf("Warning: could not create embedded stream.\n"); |
break; |