Chromium Code Reviews| 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" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 } | 142 } |
| 143 | 143 |
| 144 void SkValidatingReadBuffer::readPath(SkPath* path) { | 144 void SkValidatingReadBuffer::readPath(SkPath* path) { |
| 145 const size_t size = path->readFromMemory(fReader.peek()); | 145 const size_t size = path->readFromMemory(fReader.peek()); |
| 146 fError = fError || (SkAlign4(size) != size); | 146 fError = fError || (SkAlign4(size) != size); |
| 147 if (!fError) { | 147 if (!fError) { |
| 148 (void)this->skip(size); | 148 (void)this->skip(size); |
| 149 } | 149 } |
| 150 } | 150 } |
| 151 | 151 |
| 152 uint32_t SkValidatingReadBuffer::readByteArray(void* value) { | 152 bool SkValidatingReadBuffer::readByteArray(void* value, size_t size) { |
| 153 const uint32_t length = this->readUInt(); | 153 const uint32_t length = this->getArrayCount(); |
| 154 fError = fError || (size != length); | |
| 155 (void)this->skip(sizeof(uint32_t)); // Skip array count | |
|
sugoi1
2013/10/30 18:14:32
Here, the reason why I changed readUInt() for :
1
| |
| 154 const void* ptr = this->skip(SkAlign4(length)); | 156 const void* ptr = this->skip(SkAlign4(length)); |
| 155 if (!fError) { | 157 if (!fError) { |
| 156 memcpy(value, ptr, length); | 158 memcpy(value, ptr, length); |
| 157 return length; | 159 return true; |
| 158 } | 160 } |
| 159 return 0; | 161 return false; |
| 160 } | 162 } |
| 161 | 163 |
| 162 uint32_t SkValidatingReadBuffer::readColorArray(SkColor* colors) { | 164 bool SkValidatingReadBuffer::readColorArray(SkColor* colors, size_t size) { |
| 163 const uint32_t count = this->readUInt(); | 165 const uint32_t count = this->getArrayCount(); |
| 164 const uint32_t byteLength = count * sizeof(SkColor); | 166 const size_t byteLength = count * sizeof(SkColor); |
| 167 fError = fError || (size != byteLength); | |
| 168 (void)this->skip(sizeof(uint32_t)); // Skip array count | |
| 165 const void* ptr = this->skip(SkAlign4(byteLength)); | 169 const void* ptr = this->skip(SkAlign4(byteLength)); |
| 166 if (!fError) { | 170 if (!fError) { |
| 167 memcpy(colors, ptr, byteLength); | 171 memcpy(colors, ptr, byteLength); |
| 168 return count; | 172 return true; |
| 169 } | 173 } |
| 170 return 0; | 174 return false; |
| 171 } | 175 } |
| 172 | 176 |
| 173 uint32_t SkValidatingReadBuffer::readIntArray(int32_t* values) { | 177 bool SkValidatingReadBuffer::readIntArray(int32_t* values, size_t size) { |
| 174 const uint32_t count = this->readUInt(); | 178 const uint32_t count = this->getArrayCount(); |
| 175 const uint32_t byteLength = count * sizeof(int32_t); | 179 const size_t byteLength = count * sizeof(int32_t); |
| 180 fError = fError || (size != byteLength); | |
| 181 (void)this->skip(sizeof(uint32_t)); // Skip array count | |
| 176 const void* ptr = this->skip(SkAlign4(byteLength)); | 182 const void* ptr = this->skip(SkAlign4(byteLength)); |
| 177 if (!fError) { | 183 if (!fError) { |
| 178 memcpy(values, ptr, byteLength); | 184 memcpy(values, ptr, byteLength); |
| 179 return count; | 185 return true; |
| 180 } | 186 } |
| 181 return 0; | 187 return false; |
| 182 } | 188 } |
| 183 | 189 |
| 184 uint32_t SkValidatingReadBuffer::readPointArray(SkPoint* points) { | 190 bool SkValidatingReadBuffer::readPointArray(SkPoint* points, size_t size) { |
| 185 const uint32_t count = this->readUInt(); | 191 const uint32_t count = this->getArrayCount(); |
| 186 const uint32_t byteLength = count * sizeof(SkPoint); | 192 const size_t byteLength = count * sizeof(SkPoint); |
| 193 fError = fError || (size != byteLength); | |
| 194 (void)this->skip(sizeof(uint32_t)); // Skip array count | |
| 187 const void* ptr = this->skip(SkAlign4(byteLength)); | 195 const void* ptr = this->skip(SkAlign4(byteLength)); |
| 188 if (!fError) { | 196 if (!fError) { |
| 189 memcpy(points, ptr, byteLength); | 197 memcpy(points, ptr, byteLength); |
| 190 return count; | 198 return true; |
| 191 } | 199 } |
| 192 return 0; | 200 return false; |
| 193 } | 201 } |
| 194 | 202 |
| 195 uint32_t SkValidatingReadBuffer::readScalarArray(SkScalar* values) { | 203 bool SkValidatingReadBuffer::readScalarArray(SkScalar* values, size_t size) { |
| 196 const uint32_t count = this->readUInt(); | 204 const uint32_t count = this->getArrayCount(); |
| 197 const uint32_t byteLength = count * sizeof(SkScalar); | 205 const size_t byteLength = count * sizeof(SkScalar); |
| 206 fError = fError || (size != byteLength); | |
| 207 (void)this->skip(sizeof(uint32_t)); // Skip array count | |
| 198 const void* ptr = this->skip(SkAlign4(byteLength)); | 208 const void* ptr = this->skip(SkAlign4(byteLength)); |
| 199 if (!fError) { | 209 if (!fError) { |
| 200 memcpy(values, ptr, byteLength); | 210 memcpy(values, ptr, byteLength); |
| 201 return count; | 211 return true; |
| 202 } | 212 } |
| 203 return 0; | 213 return false; |
| 204 } | 214 } |
| 205 | 215 |
| 206 uint32_t SkValidatingReadBuffer::getArrayCount() { | 216 uint32_t SkValidatingReadBuffer::getArrayCount() { |
| 207 return *(uint32_t*)fReader.peek(); | 217 return *(uint32_t*)fReader.peek(); |
| 208 } | 218 } |
| 209 | 219 |
| 210 void SkValidatingReadBuffer::readBitmap(SkBitmap* bitmap) { | 220 void SkValidatingReadBuffer::readBitmap(SkBitmap* bitmap) { |
| 211 const int width = this->readInt(); | 221 const int width = this->readInt(); |
| 212 const int height = this->readInt(); | 222 const int height = this->readInt(); |
| 213 const size_t length = this->readUInt(); | 223 const size_t length = this->readUInt(); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 254 delete obj; | 264 delete obj; |
| 255 obj = NULL; | 265 obj = NULL; |
| 256 } | 266 } |
| 257 } else { | 267 } else { |
| 258 // we must skip the remaining data | 268 // we must skip the remaining data |
| 259 this->skip(sizeRecorded); | 269 this->skip(sizeRecorded); |
| 260 SkASSERT(false); | 270 SkASSERT(false); |
| 261 } | 271 } |
| 262 return obj; | 272 return obj; |
| 263 } | 273 } |
| OLD | NEW |