diff options
author | 2013-10-23 17:06:21 +0000 | |
---|---|---|
committer | 2013-10-23 17:06:21 +0000 | |
commit | c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cf (patch) | |
tree | 6a0bb372e8e3dfe22909629962e95d9c11ece4a9 /include/core/SkFlattenableBuffers.h | |
parent | 759befb72c558202de65a480c44d7b27428ec312 (diff) |
Initial error handling code
I made it as simple as possible. The impact seems minimal and it should do what's necessary to make this code secure.
BUG=
Committed: http://code.google.com/p/skia/source/detail?r=11247
R=reed@google.com, scroggo@google.com, djsollen@google.com, sugoi@google.com, bsalomon@google.com, mtklein@google.com, senorblanco@google.com, senorblanco@chromium.org
Author: sugoi@chromium.org
Review URL: https://codereview.chromium.org/23021015
git-svn-id: http://skia.googlecode.com/svn/trunk@11922 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include/core/SkFlattenableBuffers.h')
-rw-r--r-- | include/core/SkFlattenableBuffers.h | 86 |
1 files changed, 38 insertions, 48 deletions
diff --git a/include/core/SkFlattenableBuffers.h b/include/core/SkFlattenableBuffers.h index d71f7c025b..6e44550be5 100644 --- a/include/core/SkFlattenableBuffers.h +++ b/include/core/SkFlattenableBuffers.h @@ -24,7 +24,6 @@ class SkOrderedWriteBuffer; class SkPath; class SkPixelRef; struct SkRect; -class SkRefCnt; class SkRegion; class SkStream; class SkString; @@ -32,19 +31,6 @@ class SkTypeface; class SkUnitMapper; class SkWStream; -enum SkEffectType { - kColorFilter_SkEffectType, - kDrawLooper_SkEffectType, - kImageFilter_SkEffectType, - kMaskFilter_SkEffectType, - kPathEffect_SkEffectType, - kPixelRef_SkEffectType, - kRasterizer_SkEffectType, - kShader_SkEffectType, - kUnitMapper_SkEffectType, - kXfermode_SkEffectType, -}; - class SkFlattenableReadBuffer { public: SkFlattenableReadBuffer(); @@ -57,14 +43,20 @@ public: kCrossProcess_Flag = 1 << 0, kScalarIsFloat_Flag = 1 << 1, kPtrIs64Bit_Flag = 1 << 2, + /** The kValidation_Flag is used to force stream validations (by making + * sure that no operation reads past the end of the stream, for example) + * and error handling if any reading operation yields an invalid value. + */ + kValidation_Flag = 1 << 3, }; void setFlags(uint32_t flags) { fFlags = flags; } uint32_t getFlags() const { return fFlags; } - bool isCrossProcess() const { return SkToBool(fFlags & kCrossProcess_Flag); } + bool isCrossProcess() const { return SkToBool(fFlags & (kCrossProcess_Flag | kValidation_Flag)); } bool isScalarFloat() const { return SkToBool(fFlags & kScalarIsFloat_Flag); } bool isPtr64Bit() const { return SkToBool(fFlags & kPtrIs64Bit_Flag); } + bool isValidating() const { return SkToBool(fFlags & kValidation_Flag); } // primitives virtual bool readBool() = 0; @@ -79,38 +71,24 @@ public: virtual void readString(SkString* string) = 0; virtual void* readEncodedString(size_t* length, SkPaint::TextEncoding encoding) = 0; - virtual SkFlattenable* readFlattenable(SkEffectType) = 0; - - SkColorFilter* readColorFilter() { - return (SkColorFilter*)this->readFlattenable(kColorFilter_SkEffectType); - } - SkDrawLooper* readDrawLooper() { - return (SkDrawLooper*)this->readFlattenable(kDrawLooper_SkEffectType); - } - SkImageFilter* readImageFilter() { - return (SkImageFilter*)this->readFlattenable(kImageFilter_SkEffectType); - } - SkMaskFilter* readMaskFilter() { - return (SkMaskFilter*)this->readFlattenable(kMaskFilter_SkEffectType); - } - SkPathEffect* readPathEffect() { - return (SkPathEffect*)this->readFlattenable(kPathEffect_SkEffectType); - } - SkPixelRef* readPixelRef() { - return (SkPixelRef*)this->readFlattenable(kPixelRef_SkEffectType); - } - SkRasterizer* readRasterizer() { - return (SkRasterizer*)this->readFlattenable(kRasterizer_SkEffectType); - } - SkShader* readShader() { - return (SkShader*)this->readFlattenable(kShader_SkEffectType); - } - SkUnitMapper* readUnitMapper() { - return (SkUnitMapper*)this->readFlattenable(kUnitMapper_SkEffectType); - } - SkXfermode* readXfermode() { - return (SkXfermode*)this->readFlattenable(kXfermode_SkEffectType); - } + /** + @param type This parameter is only used when using SkValidatingReadBuffer. It will verify + that the object about to be deserialized is of the given type or early return + NULL otherwise. The type provided here is the type of the base class of the + object to deserialize. + */ + virtual SkFlattenable* readFlattenable(SkFlattenable::Type type) = 0; + + SkColorFilter* readColorFilter(); + SkDrawLooper* readDrawLooper(); + SkImageFilter* readImageFilter(); + SkMaskFilter* readMaskFilter(); + SkPathEffect* readPathEffect(); + SkPixelRef* readPixelRef(); + SkRasterizer* readRasterizer(); + SkShader* readShader(); + SkUnitMapper* readUnitMapper(); + SkXfermode* readXfermode(); // common data structures virtual void readPoint(SkPoint* point) = 0; @@ -153,7 +131,10 @@ public: return SkData::NewFromMalloc(buffer, len); } + virtual void validate(bool isValid) {} + private: + template <typename T> T* readFlattenableT(); uint32_t fFlags; }; @@ -205,13 +186,22 @@ public: enum Flags { kCrossProcess_Flag = 0x01, + /** The kValidation_Flag is used here to make sure the write operation + * is symmetric with the read operation using the equivalent flag + * SkFlattenableReadBuffer::kValidation_Flag. + */ + kValidation_Flag = 0x02, }; uint32_t getFlags() const { return fFlags; } void setFlags(uint32_t flags) { fFlags = flags; } bool isCrossProcess() const { - return SkToBool(fFlags & kCrossProcess_Flag); + return SkToBool(fFlags & (kCrossProcess_Flag | kValidation_Flag)); + } + + bool isValidating() const { + return SkToBool(fFlags & kValidation_Flag); } bool persistTypeface() const { return (fFlags & kCrossProcess_Flag) != 0; } |