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
// For memcpy
#include <string.h>
// For memcpy
#include <string.h>
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+#if wxUSE_ICO_CUR
+
+static bool CanReadICOOrCUR(wxInputStream *stream, wxUint16 resourceType);
+
+#endif // wxUSE_ICO_CUR
+
//-----------------------------------------------------------------------------
// wxBMPHandler
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// wxBMPHandler
//-----------------------------------------------------------------------------
bool wxICOHandler::DoCanRead(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
}
#endif // wxUSE_STREAMS
bool wxCURHandler::DoCanRead(wxInputStream& stream)
{
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
}
#endif // wxUSE_STREAMS
return decoder.GetFrameCount();
}
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
#endif // wxUSE_STREAMS
#endif // wxUSE_ICO_CUR