From b4c470164c9e273222715eed7edb0d1334efc5f2 Mon Sep 17 00:00:00 2001 From: Dimitri Schoolwerth Date: Wed, 29 Dec 2010 12:31:37 +0000 Subject: [PATCH] Tightened icon and cursor file detection heuristics. When loading a TGA file that has an image type of uncompressed true colour it would be falsely detected as a cursor file and as an icon file if type is of uncompressed colour mapped. Lower the chance of this happening by also checking the remaining member of an ICO and CUR header which represents the number of images in the file. This member has to be non-zero (checked against all found ICO and CUR files in an XP installation). See also #12702. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66491 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/imagbmp.cpp | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/common/imagbmp.cpp b/src/common/imagbmp.cpp index 41edf784b4..bc6f47c858 100644 --- a/src/common/imagbmp.cpp +++ b/src/common/imagbmp.cpp @@ -39,6 +39,16 @@ // For memcpy #include +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +#if wxUSE_ICO_CUR + +static bool CanReadICOOrCUR(wxInputStream *stream, wxUint16 resourceType); + +#endif // wxUSE_ICO_CUR + //----------------------------------------------------------------------------- // wxBMPHandler //----------------------------------------------------------------------------- @@ -1424,12 +1434,8 @@ int wxICOHandler::DoGetImageCount(wxInputStream& stream) bool wxICOHandler::DoCanRead(wxInputStream& stream) { - unsigned char hdr[4]; - if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) // it's ok to modify the stream position here - return false; + return CanReadICOOrCUR(&stream, 1 /*for identifying an icon*/); - // hdr[2] is one for an icon and two for a cursor - return hdr[0] == '\0' && hdr[1] == '\0' && hdr[2] == '\1' && hdr[3] == '\0'; } #endif // wxUSE_STREAMS @@ -1445,12 +1451,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxCURHandler, wxICOHandler) bool wxCURHandler::DoCanRead(wxInputStream& stream) { - unsigned char hdr[4]; - if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) // it's ok to modify the stream position here - return false; - - // hdr[2] is one for an icon and two for a cursor - return hdr[0] == '\0' && hdr[1] == '\0' && hdr[2] == '\2' && hdr[3] == '\0'; + return CanReadICOOrCUR(&stream, 2 /*for identifying a cursor*/); } #endif // wxUSE_STREAMS @@ -1489,6 +1490,19 @@ int wxANIHandler::DoGetImageCount(wxInputStream& stream) return decoder.GetFrameCount(); } +static bool CanReadICOOrCUR(wxInputStream *stream, wxUint16 resourceType) +{ + ICONDIR iconDir; + if ( !stream->Read(&iconDir, sizeof(iconDir)) ) // it's ok to modify the stream position here + { + return false; + } + + return !iconDir.idReserved // reserved, must be 0 + && wxUINT16_SWAP_ON_BE(iconDir.idType) == resourceType // either 1 or 2 + && iconDir.idCount; // must contain at least one image +} + #endif // wxUSE_STREAMS #endif // wxUSE_ICO_CUR -- 2.45.2