OLD | NEW |
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 "SkBitmap.h" | 8 #include "SkBitmap.h" |
9 #include "SkErrorInternals.h" | 9 #include "SkErrorInternals.h" |
10 #include "SkValidatingReadBuffer.h" | 10 #include "SkValidatingReadBuffer.h" |
11 #include "SkStream.h" | 11 #include "SkStream.h" |
12 #include "SkTypeface.h" | 12 #include "SkTypeface.h" |
13 | 13 |
14 SkValidatingReadBuffer::SkValidatingReadBuffer(const void* data, size_t size) : | 14 SkValidatingReadBuffer::SkValidatingReadBuffer(const void* data, size_t size) : |
15 fError(false) { | 15 fError(false) { |
16 this->setMemory(data, size); | 16 this->setMemory(data, size); |
17 this->setFlags(SkFlattenableReadBuffer::kValidation_Flag); | 17 this->setFlags(SkFlattenableReadBuffer::kValidation_Flag); |
18 } | 18 } |
19 | 19 |
20 SkValidatingReadBuffer::~SkValidatingReadBuffer() { | 20 SkValidatingReadBuffer::~SkValidatingReadBuffer() { |
21 } | 21 } |
22 | 22 |
23 void SkValidatingReadBuffer::validate(bool isValid) { | 23 bool SkValidatingReadBuffer::validate(bool isValid) { |
24 if (!fError && !isValid) { | 24 if (!fError && !isValid) { |
25 // When an error is found, send the read cursor to the end of the stream | 25 // When an error is found, send the read cursor to the end of the stream |
26 fReader.skip(fReader.available()); | 26 fReader.skip(fReader.available()); |
27 fError = true; | 27 fError = true; |
28 } | 28 } |
| 29 return !fError; |
29 } | 30 } |
30 | 31 |
31 void SkValidatingReadBuffer::setMemory(const void* data, size_t size) { | 32 void SkValidatingReadBuffer::setMemory(const void* data, size_t size) { |
32 this->validate(IsPtrAlign4(data) && (SkAlign4(size) == size)); | 33 this->validate(IsPtrAlign4(data) && (SkAlign4(size) == size)); |
33 if (!fError) { | 34 if (!fError) { |
34 fReader.setMemory(data, size); | 35 fReader.setMemory(data, size); |
35 } | 36 } |
36 } | 37 } |
37 | 38 |
38 const void* SkValidatingReadBuffer::skip(size_t size) { | 39 const void* SkValidatingReadBuffer::skip(size_t size) { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 | 115 |
115 void SkValidatingReadBuffer::readPoint(SkPoint* point) { | 116 void SkValidatingReadBuffer::readPoint(SkPoint* point) { |
116 point->fX = fReader.readScalar(); | 117 point->fX = fReader.readScalar(); |
117 point->fY = fReader.readScalar(); | 118 point->fY = fReader.readScalar(); |
118 } | 119 } |
119 | 120 |
120 void SkValidatingReadBuffer::readMatrix(SkMatrix* matrix) { | 121 void SkValidatingReadBuffer::readMatrix(SkMatrix* matrix) { |
121 size_t size = 0; | 122 size_t size = 0; |
122 if (!fError) { | 123 if (!fError) { |
123 size = matrix->readFromMemory(fReader.peek(), fReader.available()); | 124 size = matrix->readFromMemory(fReader.peek(), fReader.available()); |
124 this->validate((SkAlign4(size) != size) || (0 == size)); | 125 this->validate((SkAlign4(size) == size) && (0 != size)); |
125 } | 126 } |
126 if (!fError) { | 127 if (!fError) { |
127 (void)this->skip(size); | 128 (void)this->skip(size); |
128 } | 129 } |
129 } | 130 } |
130 | 131 |
131 void SkValidatingReadBuffer::readIRect(SkIRect* rect) { | 132 void SkValidatingReadBuffer::readIRect(SkIRect* rect) { |
132 const void* ptr = this->skip(sizeof(SkIRect)); | 133 const void* ptr = this->skip(sizeof(SkIRect)); |
133 if (!fError) { | 134 if (!fError) { |
134 memcpy(rect, ptr, sizeof(SkIRect)); | 135 memcpy(rect, ptr, sizeof(SkIRect)); |
135 } | 136 } |
136 } | 137 } |
137 | 138 |
138 void SkValidatingReadBuffer::readRect(SkRect* rect) { | 139 void SkValidatingReadBuffer::readRect(SkRect* rect) { |
139 const void* ptr = this->skip(sizeof(SkRect)); | 140 const void* ptr = this->skip(sizeof(SkRect)); |
140 if (!fError) { | 141 if (!fError) { |
141 memcpy(rect, ptr, sizeof(SkRect)); | 142 memcpy(rect, ptr, sizeof(SkRect)); |
142 } | 143 } |
143 } | 144 } |
144 | 145 |
145 void SkValidatingReadBuffer::readRegion(SkRegion* region) { | 146 void SkValidatingReadBuffer::readRegion(SkRegion* region) { |
146 size_t size = 0; | 147 size_t size = 0; |
147 if (!fError) { | 148 if (!fError) { |
148 size = region->readFromMemory(fReader.peek(), fReader.available()); | 149 size = region->readFromMemory(fReader.peek(), fReader.available()); |
149 this->validate((SkAlign4(size) != size) || (0 == size)); | 150 this->validate((SkAlign4(size) == size) && (0 != size)); |
150 } | 151 } |
151 if (!fError) { | 152 if (!fError) { |
152 (void)this->skip(size); | 153 (void)this->skip(size); |
153 } | 154 } |
154 } | 155 } |
155 | 156 |
156 void SkValidatingReadBuffer::readPath(SkPath* path) { | 157 void SkValidatingReadBuffer::readPath(SkPath* path) { |
157 size_t size = 0; | 158 size_t size = 0; |
158 if (!fError) { | 159 if (!fError) { |
159 size = path->readFromMemory(fReader.peek(), fReader.available()); | 160 size = path->readFromMemory(fReader.peek(), fReader.available()); |
160 this->validate((SkAlign4(size) != size) || (0 == size)); | 161 this->validate((SkAlign4(size) == size) && (0 != size)); |
161 } | 162 } |
162 if (!fError) { | 163 if (!fError) { |
163 (void)this->skip(size); | 164 (void)this->skip(size); |
164 } | 165 } |
165 } | 166 } |
166 | 167 |
167 bool SkValidatingReadBuffer::readArray(void* value, size_t size, size_t elementS
ize) { | 168 bool SkValidatingReadBuffer::readArray(void* value, size_t size, size_t elementS
ize) { |
168 const uint32_t count = this->getArrayCount(); | 169 const uint32_t count = this->getArrayCount(); |
169 this->validate(size == count); | 170 this->validate(size == count); |
170 (void)this->skip(sizeof(uint32_t)); // Skip array count | 171 (void)this->skip(sizeof(uint32_t)); // Skip array count |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 delete obj; | 256 delete obj; |
256 obj = NULL; | 257 obj = NULL; |
257 } | 258 } |
258 } else { | 259 } else { |
259 // we must skip the remaining data | 260 // we must skip the remaining data |
260 this->skip(sizeRecorded); | 261 this->skip(sizeRecorded); |
261 SkASSERT(false); | 262 SkASSERT(false); |
262 } | 263 } |
263 return obj; | 264 return obj; |
264 } | 265 } |
OLD | NEW |