Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: src/core/SkPathRef.cpp

Issue 61913002: Adding error checks to SkRBuffer (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Added doc Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/core/SkPath.cpp ('k') | src/core/SkRegion.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBuffer.h" 8 #include "SkBuffer.h"
9 #include "SkOnce.h" 9 #include "SkOnce.h"
10 #include "SkPath.h" 10 #include "SkPath.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 105
106 SkPathRef* SkPathRef::CreateFromBuffer(SkRBuffer* buffer 106 SkPathRef* SkPathRef::CreateFromBuffer(SkRBuffer* buffer
107 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O 107 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O
108 , bool newFormat, int32_t oldPacked 108 , bool newFormat, int32_t oldPacked
109 #endif 109 #endif
110 ) { 110 ) {
111 SkPathRef* ref = SkNEW(SkPathRef); 111 SkPathRef* ref = SkNEW(SkPathRef);
112 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O 112 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O
113 if (newFormat) { 113 if (newFormat) {
114 #endif 114 #endif
115 int32_t packed = buffer->readU32(); 115 int32_t packed;
116 if (!buffer->readS32(&packed)) {
117 SkDELETE(ref);
118 return NULL;
119 }
116 120
117 ref->fIsFinite = (packed >> kIsFinite_SerializationShift) & 1; 121 ref->fIsFinite = (packed >> kIsFinite_SerializationShift) & 1;
118 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O 122 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO O
119 } else { 123 } else {
120 ref->fIsFinite = (oldPacked >> SkPath::kOldIsFinite_SerializationShift) & 1; 124 ref->fIsFinite = (oldPacked >> SkPath::kOldIsFinite_SerializationShift) & 1;
121 } 125 }
122 #endif 126 #endif
123 127
124 ref->fGenerationID = buffer->readU32(); 128 int32_t verbCount, pointCount, conicCount;
125 int32_t verbCount = buffer->readS32(); 129 if (!buffer->readU32(&(ref->fGenerationID)) ||
126 int32_t pointCount = buffer->readS32(); 130 !buffer->readS32(&verbCount) ||
127 int32_t conicCount = buffer->readS32(); 131 !buffer->readS32(&pointCount) ||
132 !buffer->readS32(&conicCount)) {
133 SkDELETE(ref);
134 return NULL;
135 }
136
128 ref->resetToSize(verbCount, pointCount, conicCount); 137 ref->resetToSize(verbCount, pointCount, conicCount);
129
130 SkASSERT(verbCount == ref->countVerbs()); 138 SkASSERT(verbCount == ref->countVerbs());
131 SkASSERT(pointCount == ref->countPoints()); 139 SkASSERT(pointCount == ref->countPoints());
132 SkASSERT(conicCount == ref->fConicWeights.count()); 140 SkASSERT(conicCount == ref->fConicWeights.count());
133 buffer->read(ref->verbsMemWritable(), verbCount * sizeof(uint8_t)); 141
134 buffer->read(ref->fPoints, pointCount * sizeof(SkPoint)); 142 if (!buffer->read(ref->verbsMemWritable(), verbCount * sizeof(uint8_t)) ||
135 buffer->read(ref->fConicWeights.begin(), conicCount * sizeof(SkScalar)); 143 !buffer->read(ref->fPoints, pointCount * sizeof(SkPoint)) ||
136 buffer->read(&ref->fBounds, sizeof(SkRect)); 144 !buffer->read(ref->fConicWeights.begin(), conicCount * sizeof(SkScalar)) ||
145 !buffer->read(&ref->fBounds, sizeof(SkRect))) {
146 SkDELETE(ref);
147 return NULL;
148 }
137 ref->fBoundsIsDirty = false; 149 ref->fBoundsIsDirty = false;
138 return ref; 150 return ref;
139 } 151 }
140 152
141 void SkPathRef::Rewind(SkAutoTUnref<SkPathRef>* pathRef) { 153 void SkPathRef::Rewind(SkAutoTUnref<SkPathRef>* pathRef) {
142 if ((*pathRef)->unique()) { 154 if ((*pathRef)->unique()) {
143 SkDEBUGCODE((*pathRef)->validate();) 155 SkDEBUGCODE((*pathRef)->validate();)
144 (*pathRef)->fBoundsIsDirty = true; // this also invalidates fIsFinite 156 (*pathRef)->fBoundsIsDirty = true; // this also invalidates fIsFinite
145 (*pathRef)->fVerbCnt = 0; 157 (*pathRef)->fVerbCnt = 0;
146 (*pathRef)->fPointCnt = 0; 158 (*pathRef)->fPointCnt = 0;
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 fPoints[i].fY - fBounds.fBottom < SK_ScalarNearlyZero); 342 fPoints[i].fY - fBounds.fBottom < SK_ScalarNearlyZero);
331 if (!fPoints[i].isFinite()) { 343 if (!fPoints[i].isFinite()) {
332 isFinite = false; 344 isFinite = false;
333 } 345 }
334 } 346 }
335 SkASSERT(SkToBool(fIsFinite) == isFinite); 347 SkASSERT(SkToBool(fIsFinite) == isFinite);
336 } 348 }
337 #endif 349 #endif
338 } 350 }
339 #endif 351 #endif
OLDNEW
« no previous file with comments | « src/core/SkPath.cpp ('k') | src/core/SkRegion.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698