Index: src/core/SkBuffer.h |
diff --git a/src/core/SkBuffer.h b/src/core/SkBuffer.h |
index 96333899078ddde233790b6355296b08d762a550..1a4c6c281c32634dd055abdc765c44af470698c7 100644 |
--- a/src/core/SkBuffer.h |
+++ b/src/core/SkBuffer.h |
@@ -56,7 +56,7 @@ public: |
/** Read the specified number of bytes from the data pointer. If buffer is not |
null, copy those bytes into buffer. |
*/ |
- void read(void* buffer, size_t size) { |
+ virtual void read(void* buffer, size_t size) { |
if (size) { |
this->readNoSizeCheck(buffer, size); |
} |
@@ -74,7 +74,7 @@ public: |
uint8_t readU8() { uint8_t x; read(&x, 1); return x; } |
bool readBool() { return this->readU8() != 0; } |
-private: |
+protected: |
void readNoSizeCheck(void* buffer, size_t size); |
const char* fData; |
@@ -82,6 +82,28 @@ private: |
const char* fStop; |
}; |
+/** \class SkRBufferWithSizeCheck |
+ |
+ Same as SkRBuffer, except that a size check is performed before the read operation and an |
+ error is set if the read operation is attempting to read past the end of the data. |
+*/ |
+class SkRBufferWithSizeCheck : public SkRBuffer { |
+public: |
+ SkRBufferWithSizeCheck(const void* data, size_t size) : SkRBuffer(data, size), fError(false) {} |
+ |
+ /** Read the specified number of bytes from the data pointer. If buffer is not |
+ null and the number of bytes to read does not overflow this object's data, |
+ copy those bytes into buffer. |
+ */ |
+ virtual void read(void* buffer, size_t size) SK_OVERRIDE; |
+ |
+ /** Returns whether or not a read operation attempted to read past the end of the data. |
+ */ |
+ bool isValid() const { return !fError; } |
+private: |
+ bool fError; |
+}; |
+ |
/** \class SkWBuffer |
Light weight class for writing data to a memory block. |