Index: src/codec/SkRawCodec.cpp |
diff --git a/src/codec/SkRawCodec.cpp b/src/codec/SkRawCodec.cpp |
index 524a438d2905023d60de3183df0ac6358aa73f2e..337aa79785e37b4ca649ee6464d167a6c44b2729 100644 |
--- a/src/codec/SkRawCodec.cpp |
+++ b/src/codec/SkRawCodec.cpp |
@@ -199,6 +199,24 @@ public: |
virtual SkMemoryStream* transferBuffer(size_t offset, size_t size) = 0; |
}; |
+class SkSizeLimitedDynamicMemoryWStream : public SkDynamicMemoryWStream { |
+public: |
+ virtual ~SkSizeLimitedDynamicMemoryWStream() {} |
+ |
+ bool write(const void* buffer, size_t size) override { |
+ size_t newSize; |
+ if (!safe_add_to_size_t(this->bytesWritten(), size, &newSize) || |
scroggo
2016/03/09 16:32:45
If we limit to 10,240,000, do we still need to che
yujieqin
2016/03/09 17:40:30
I still prefer to check here, because there is not
|
+ newSize > kMaxStreamSize) { |
scroggo
2016/03/09 16:32:45
nit: this lines up with the line below. Would be b
yujieqin
2016/03/09 17:40:30
Done.
|
+ return false; |
scroggo
2016/03/09 16:32:45
Should we print some kind of error message? It see
yujieqin
2016/03/09 17:40:30
added a SkCodecPrintf
|
+ } |
+ return SkDynamicMemoryWStream::write(buffer, size); |
scroggo
2016/03/09 16:32:45
typically in Skia, we use a typedef INHERITED to r
yujieqin
2016/03/09 17:40:30
Done.
|
+ } |
+ |
+private: |
+ const size_t kMaxStreamSize = 100 * 1024 * 1024; // 100MB |
+}; |
+ |
+// Note: the maximum buffer size is 100MB (limited by SkSizeLimitedDynamicMemoryWStream). |
class SkRawBufferedStream : public SkRawStream { |
public: |
// Will take the ownership of the stream. |
@@ -301,7 +319,8 @@ private: |
SkAutoTDelete<SkStream> fStream; |
bool fWholeStreamRead; |
- SkDynamicMemoryWStream fStreamBuffer; |
+ // Use a size-limited stream to avoid holding too huge buffer. |
+ SkSizeLimitedDynamicMemoryWStream fStreamBuffer; |
const size_t kReadToEnd = 0; |
}; |