aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-03-12 17:53:53 +0000
committerGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-03-12 17:53:53 +0000
commitc04987ff731e35227de2a3a1e03d5c93ab1a1327 (patch)
tree8bc2e4e72a86921a7d7bab4077e342d7813427a3 /src
parentf44957e7699d1b884c8b977804328257d94235b6 (diff)
Fixed unitialized memory access bug in r8106
git-svn-id: http://skia.googlecode.com/svn/trunk@8115 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/core/SkPictureRecord.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index 6ecc0aad8e..421c2bd960 100644
--- a/src/core/SkPictureRecord.cpp
+++ b/src/core/SkPictureRecord.cpp
@@ -243,11 +243,12 @@ struct CommandInfo {
*/
static bool match(SkWriter32* writer, uint32_t offset,
int* pattern, CommandInfo* result, int numCommands) {
- SkASSERT(offset <= writer->size());
+ SkASSERT(offset < writer->size());
uint32_t curOffset = offset;
uint32_t curSize = 0;
- for (int i = 0; i < numCommands; ++i) {
+ int numMatched;
+ for (numMatched = 0; numMatched < numCommands && curOffset < writer->size(); ++numMatched) {
DrawType op = peek_op_and_size(writer, curOffset, &curSize);
while (NOOP == op && curOffset < writer->size()) {
curOffset += curSize;
@@ -258,22 +259,26 @@ static bool match(SkWriter32* writer, uint32_t offset,
return false; // ran out of byte stream
}
- if (kDRAW_BITMAP_FLAVOR == pattern[i]) {
+ if (kDRAW_BITMAP_FLAVOR == pattern[numMatched]) {
if (DRAW_BITMAP != op && DRAW_BITMAP_MATRIX != op &&
DRAW_BITMAP_NINE != op && DRAW_BITMAP_RECT_TO_RECT != op) {
return false;
}
- } else if (op != pattern[i]) {
+ } else if (op != pattern[numMatched]) {
return false;
}
- result[i].fActualOp = op;
- result[i].fOffset = curOffset;
- result[i].fSize = curSize;
+ result[numMatched].fActualOp = op;
+ result[numMatched].fOffset = curOffset;
+ result[numMatched].fSize = curSize;
curOffset += curSize;
}
+ if (numMatched != numCommands) {
+ return false;
+ }
+
curOffset += curSize;
if (curOffset < writer->size()) {
// Something else between the last command and the end of the stream