X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9d1c7e8474ac6501f6ed39549b91c86eca9aae23..12b5f4b4d2d8a07962da7ba3b78c8c1ec2634a67:/src/common/gifdecod.cpp?ds=sidebyside diff --git a/src/common/gifdecod.cpp b/src/common/gifdecod.cpp index 569b3e77ae..0a2dad2724 100644 --- a/src/common/gifdecod.cpp +++ b/src/common/gifdecod.cpp @@ -191,7 +191,7 @@ bool wxGIFDecoder::ConvertToImage(unsigned int frame, wxImage *image) const // Get data for current frame -wxSize wxGIFDecoder::GetFrameSize(unsigned int frame) const +wxSize wxGIFDecoder::GetFrameSize(unsigned int frame) const { return wxSize(GetFrame(frame)->w, GetFrame(frame)->h); } @@ -580,7 +580,8 @@ bool wxGIFDecoder::CanRead(wxInputStream &stream) const if ( !stream.Read(buf, WXSIZEOF(buf)) ) return false; - stream.SeekI(-(wxFileOffset)WXSIZEOF(buf), wxFromCurrent); + if (stream.SeekI(-(wxFileOffset)WXSIZEOF(buf), wxFromCurrent) == wxInvalidOffset) + return false; // this happens e.g. for non-seekable streams return memcmp(buf, "GIF", WXSIZEOF(buf)) == 0; } @@ -598,7 +599,7 @@ bool wxGIFDecoder::CanRead(wxInputStream &stream) const wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream) { unsigned int global_ncolors = 0; - int bits, interl, transparent, i; + int bits, interl, i; wxAnimationDisposal disposal; long size; long delay; @@ -660,7 +661,7 @@ wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream) } // transparent colour, disposal method and delay default to unused - transparent = -1; + int transparent = -1; disposal = wxANIM_UNSPECIFIED; delay = -1; @@ -710,8 +711,7 @@ wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream) delay = 10 * (buf[2] + 256 * buf[3]); // read transparent colour index, if used - if (buf[1] & 0x01) - transparent = buf[4]; + transparent = buf[1] & 0x01 ? buf[4] : -1; // read disposal method disposal = (wxAnimationDisposal)(((buf[1] & 0x1C) >> 2) - 1); @@ -721,12 +721,12 @@ wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream) { while ((i = (unsigned char)stream.GetC()) != 0) { - if (stream.Eof() || (stream.LastRead() == 0)) + if (stream.Eof() || (stream.LastRead() == 0) || + stream.SeekI(i, wxFromCurrent) == wxInvalidOffset) { done = true; break; } - stream.SeekI(i, wxFromCurrent); } } } @@ -757,8 +757,8 @@ wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream) pimg->w = buf[4] + 256 * buf[5]; pimg->h = buf[6] + 256 * buf[7]; - if ( anim && ((pimg->w == 0) || (pimg->w > (unsigned int)m_szAnimation.GetWidth()) || - (pimg->h == 0) || (pimg->h > (unsigned int)m_szAnimation.GetHeight())) ) + if ( anim && ((pimg->w == 0) || (pimg->w > (unsigned int)m_szAnimation.GetWidth()) || + (pimg->h == 0) || (pimg->h > (unsigned int)m_szAnimation.GetHeight())) ) return wxGIF_INVFORMAT; interl = ((buf[8] & 0x40)? 1 : 0); @@ -835,12 +835,12 @@ wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream) // skip all data while ((i = (unsigned char)stream.GetC()) != 0) { - if (stream.Eof() || (stream.LastRead() == 0)) + if (stream.Eof() || (stream.LastRead() == 0) || + stream.SeekI(i, wxFromCurrent) == wxInvalidOffset) { Destroy(); return wxGIF_INVFORMAT; } - stream.SeekI(i, wxFromCurrent); } } else if (type == 0x2C) @@ -859,7 +859,11 @@ wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream) { unsigned int local_ncolors = 2 << (buf[8] & 0x07); wxFileOffset numBytes = 3 * local_ncolors; - stream.SeekI(numBytes, wxFromCurrent); + if (stream.SeekI(numBytes, wxFromCurrent) == wxInvalidOffset) + { + Destroy(); + return wxGIF_INVFORMAT; + } } // initial code size @@ -873,12 +877,12 @@ wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream) // skip all data while ((i = (unsigned char)stream.GetC()) != 0) { - if (stream.Eof() || (stream.LastRead() == 0)) + if (stream.Eof() || (stream.LastRead() == 0) || + stream.SeekI(i, wxFromCurrent) == wxInvalidOffset) { Destroy(); return wxGIF_INVFORMAT; } - stream.SeekI(i, wxFromCurrent); } } else if ((type != 0x3B) && (type != 00)) // testing