Index: src/codec/SkWebpCodec.cpp |
diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp |
index 3c61b937622097d5e1c5be483770a6fb2336543a..e8449f826a9232359b483ff430eedd5bbe366a1a 100644 |
--- a/src/codec/SkWebpCodec.cpp |
+++ b/src/codec/SkWebpCodec.cpp |
@@ -20,16 +20,11 @@ |
#include "webp/decode.h" |
#include "webp/encode.h" |
-bool SkWebpCodec::IsWebp(SkStream* stream) { |
+bool SkWebpCodec::IsWebp(const char* bytes, size_t bytesRead) { |
// WEBP starts with the following: |
// RIFFXXXXWEBPVP |
// Where XXXX is unspecified. |
- const char LENGTH = 14; |
- char bytes[LENGTH]; |
- if (stream->read(&bytes, LENGTH) != LENGTH) { |
- return false; |
- } |
- return !memcmp(bytes, "RIFF", 4) && !memcmp(&bytes[8], "WEBPVP", 6); |
+ return bytesRead >= 14 && !memcmp(bytes, "RIFF", 4) && !memcmp(&bytes[8], "WEBPVP", 6); |
} |
static const size_t WEBP_VP8_HEADER_SIZE = 30; |
@@ -39,7 +34,11 @@ static const size_t WEBP_VP8_HEADER_SIZE = 30; |
// bytes again. |
static bool webp_parse_header(SkStream* stream, SkImageInfo* info) { |
unsigned char buffer[WEBP_VP8_HEADER_SIZE]; |
- if (!stream->peek(buffer, WEBP_VP8_HEADER_SIZE)) { |
+ const size_t bytesPeeked = stream->peek(buffer, WEBP_VP8_HEADER_SIZE); |
+ if (bytesPeeked != WEBP_VP8_HEADER_SIZE) { |
scroggo
2015/12/01 22:33:49
I should probably add a test for this. I forgot to
scroggo
2015/12/04 22:15:04
Added tests for this.
|
+ // Use read + rewind as a backup |
+ if (stream->read(buffer, WEBP_VP8_HEADER_SIZE) != WEBP_VP8_HEADER_SIZE |
+ || !stream->rewind()) |
return false; |
} |