diff --git a/ArcFormats/WebP/ImageWEBP.cs b/ArcFormats/WebP/ImageWEBP.cs index e86909fa..46571560 100644 --- a/ArcFormats/WebP/ImageWEBP.cs +++ b/ArcFormats/WebP/ImageWEBP.cs @@ -64,11 +64,9 @@ namespace GameRes.Formats.Google { if (0x46464952 != stream.Signature) // 'RIFF' return null; + if (!stream.ReadHeader (12).AsciiEqual (8, "WEBP")) + return null; var header = new byte[0x10]; - if (8 != stream.Read (header, 0, 8)) - return null; - if (!Binary.AsciiEqual (header, 4, "WEBP")) - return null; bool found_vp8x = false; var info = new WebPMetaData(); int chunk_size; diff --git a/ArcFormats/WebP/Lossless.cs b/ArcFormats/WebP/Lossless.cs index 3cfdc843..88cbf449 100644 --- a/ArcFormats/WebP/Lossless.cs +++ b/ArcFormats/WebP/Lossless.cs @@ -1614,7 +1614,7 @@ namespace GameRes.Formats.Google { ulong val_; // pre-fetched bits byte[] buf_; // input byte buffer - uint len_; // buffer length + uint end_pos_; // buffer length uint pos_; // byte position in buf_ int bit_pos_; // current bit-reading position in val_ bool eos_; // true if a bit was read past the end of buffer @@ -1632,11 +1632,11 @@ namespace GameRes.Formats.Google /// Returns true if there was an attempt at reading bit past the end of /// the buffer. Doesn't set br->eos_ flag. /// - private bool IsEndOfStream { get { return eos_ || ((pos_ == len_) && (bit_pos_ > LBITS)); } } + private bool IsEndOfStream { get { return eos_ || ((pos_ == end_pos_) && (bit_pos_ > LBITS)); } } public void Init (byte[] input, int start, uint length) { - len_ = length; + end_pos_ = (uint)start + length; val_ = 0; bit_pos_ = 0; eos_ = false; @@ -1665,7 +1665,7 @@ namespace GameRes.Formats.Google { other.val_ = val_; other.buf_ = buf_; - other.len_ = len_; + other.end_pos_ = end_pos_; other.pos_ = pos_; other.bit_pos_ = bit_pos_; other.eos_ = eos_; @@ -1677,9 +1677,9 @@ namespace GameRes.Formats.Google public void SetBuffer (byte[] buffer, uint length) { buf_ = buffer; - len_ = length; - // pos_ > len_ should be considered a param error. - eos_ = (pos_ > len_) || IsEndOfStream; + end_pos_ = length; + // pos_ > end_pos_ should be considered a param error. + eos_ = (pos_ > end_pos_) || IsEndOfStream; } /// @@ -1742,7 +1742,7 @@ namespace GameRes.Formats.Google void DoFillBitWindow () { - if (pos_ + sizeof(ulong) < len_) + if (pos_ + sizeof(ulong) < end_pos_) { val_ >>= WBITS; bit_pos_ -= WBITS; @@ -1755,7 +1755,7 @@ namespace GameRes.Formats.Google void ShiftBytes () { - while (bit_pos_ >= 8 && pos_ < len_) + while (bit_pos_ >= 8 && pos_ < end_pos_) { val_ >>= 8; val_ |= ((ulong)buf_[pos_]) << (LBITS - 8);