| Index: src/codec/SkCodec_wbmp.cpp
|
| diff --git a/src/codec/SkCodec_wbmp.cpp b/src/codec/SkCodec_wbmp.cpp
|
| index 900ab6f7017c8781ca82bd2a7707569fd807ce59..8f8763fb90e0f0256506c12e82c54c04ab570ce2 100644
|
| --- a/src/codec/SkCodec_wbmp.cpp
|
| +++ b/src/codec/SkCodec_wbmp.cpp
|
| @@ -29,6 +29,11 @@ static inline void setup_color_table(SkColorType colorType,
|
| }
|
| }
|
|
|
| +static bool read_byte(SkStream* stream, uint8_t* data)
|
| +{
|
| + return stream->read(data, 1) == 1;
|
| +}
|
| +
|
| // http://en.wikipedia.org/wiki/Variable-length_quantity
|
| static bool read_mbf(SkStream* stream, uint64_t* value) {
|
| uint64_t n = 0;
|
| @@ -49,11 +54,17 @@ static bool read_mbf(SkStream* stream, uint64_t* value) {
|
| }
|
|
|
| static bool read_header(SkStream* stream, SkISize* size) {
|
| - uint64_t width, height;
|
| - uint16_t data;
|
| - if (stream->read(&data, 2) != 2 || data != 0) {
|
| - return false;
|
| + {
|
| + uint8_t data;
|
| + if (!read_byte(stream, &data) || data != 0) { // unknown type
|
| + return false;
|
| + }
|
| + if (!read_byte(stream, &data) || (data & 0x9F)) { // skip fixed header
|
| + return false;
|
| + }
|
| }
|
| +
|
| + uint64_t width, height;
|
| if (!read_mbf(stream, &width) || width > 0xFFFF || !width) {
|
| return false;
|
| }
|
|
|