| Index: src/core/SkPathRef.cpp
|
| diff --git a/src/core/SkPathRef.cpp b/src/core/SkPathRef.cpp
|
| index cf4e8ffba20477e471f53c454ebced02be523523..49a04999ac201e831363b37a0fdc0b666500bd72 100644
|
| --- a/src/core/SkPathRef.cpp
|
| +++ b/src/core/SkPathRef.cpp
|
| @@ -9,6 +9,7 @@
|
| #include "SkOncePtr.h"
|
| #include "SkPath.h"
|
| #include "SkPathRef.h"
|
| +#include <limits>
|
|
|
| //////////////////////////////////////////////////////////////////////////////
|
| SkPathRef::Editor::Editor(SkAutoTUnref<SkPathRef>* pathRef,
|
| @@ -136,11 +137,16 @@ SkPathRef* SkPathRef::CreateFromBuffer(SkRBuffer* buffer) {
|
| bool isRRect = (packed >> kIsRRect_SerializationShift) & 1;
|
|
|
| int32_t verbCount, pointCount, conicCount;
|
| + ptrdiff_t maxPtrDiff = std::numeric_limits<ptrdiff_t>::max();
|
| if (!buffer->readU32(&(ref->fGenerationID)) ||
|
| !buffer->readS32(&verbCount) ||
|
| verbCount < 0 ||
|
| + static_cast<uint32_t>(verbCount) > maxPtrDiff/sizeof(uint8_t) ||
|
| !buffer->readS32(&pointCount) ||
|
| pointCount < 0 ||
|
| + static_cast<uint32_t>(pointCount) > maxPtrDiff/sizeof(SkPoint) ||
|
| + sizeof(uint8_t) * verbCount + sizeof(SkPoint) * pointCount >
|
| + static_cast<size_t>(maxPtrDiff) ||
|
| !buffer->readS32(&conicCount) ||
|
| conicCount < 0) {
|
| delete ref;
|
|
|