fix ANI loading; check for errors when calling Read()
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58101 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -236,10 +236,12 @@ bool wxANIDecoder::Load( wxInputStream& stream )
|
|||||||
m_info.Clear();
|
m_info.Clear();
|
||||||
|
|
||||||
// we have a riff file:
|
// we have a riff file:
|
||||||
while ( stream.IsOk() )
|
while ( !stream.Eof() )
|
||||||
{
|
{
|
||||||
// we always have a data size:
|
// we always have a data size:
|
||||||
stream.Read(&datalen, 4);
|
if (!stream.Read(&datalen, 4))
|
||||||
|
return false;
|
||||||
|
|
||||||
datalen = wxINT32_SWAP_ON_BE(datalen);
|
datalen = wxINT32_SWAP_ON_BE(datalen);
|
||||||
|
|
||||||
//data should be padded to make even number of bytes
|
//data should be padded to make even number of bytes
|
||||||
@@ -248,7 +250,8 @@ bool wxANIDecoder::Load( wxInputStream& stream )
|
|||||||
// now either data or a FCC:
|
// now either data or a FCC:
|
||||||
if ( (FCC1 == riff32) || (FCC1 == list32) )
|
if ( (FCC1 == riff32) || (FCC1 == list32) )
|
||||||
{
|
{
|
||||||
stream.Read(&FCC2, 4);
|
if (!stream.Read(&FCC2, 4))
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
else if ( FCC1 == anih32 )
|
else if ( FCC1 == anih32 )
|
||||||
{
|
{
|
||||||
@@ -259,7 +262,8 @@ bool wxANIDecoder::Load( wxInputStream& stream )
|
|||||||
return false; // already parsed an ani header?
|
return false; // already parsed an ani header?
|
||||||
|
|
||||||
struct wxANIHeader header;
|
struct wxANIHeader header;
|
||||||
stream.Read(&header, sizeof(wxANIHeader));
|
if (!stream.Read(&header, sizeof(wxANIHeader)))
|
||||||
|
return false;
|
||||||
header.AdjustEndianness();
|
header.AdjustEndianness();
|
||||||
|
|
||||||
// we should have a global frame size
|
// we should have a global frame size
|
||||||
@@ -284,7 +288,8 @@ bool wxANIDecoder::Load( wxInputStream& stream )
|
|||||||
wxASSERT(m_info.GetCount() == m_nFrames);
|
wxASSERT(m_info.GetCount() == m_nFrames);
|
||||||
for (unsigned int i=0; i<m_nFrames; i++)
|
for (unsigned int i=0; i<m_nFrames; i++)
|
||||||
{
|
{
|
||||||
stream.Read(&FCC2, 4);
|
if (!stream.Read(&FCC2, 4))
|
||||||
|
return false;
|
||||||
m_info[i].m_delay = wxINT32_SWAP_ON_BE(FCC2) * 1000 / 60;
|
m_info[i].m_delay = wxINT32_SWAP_ON_BE(FCC2) * 1000 / 60;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -297,7 +302,8 @@ bool wxANIDecoder::Load( wxInputStream& stream )
|
|||||||
wxASSERT(m_info.GetCount() == m_nFrames);
|
wxASSERT(m_info.GetCount() == m_nFrames);
|
||||||
for (unsigned int i=0; i<m_nFrames; i++)
|
for (unsigned int i=0; i<m_nFrames; i++)
|
||||||
{
|
{
|
||||||
stream.Read(&FCC2, 4);
|
if (!stream.Read(&FCC2, 4))
|
||||||
|
return false;
|
||||||
m_info[i].m_imageIndex = wxINT32_SWAP_ON_BE(FCC2);
|
m_info[i].m_imageIndex = wxINT32_SWAP_ON_BE(FCC2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -318,9 +324,14 @@ bool wxANIDecoder::Load( wxInputStream& stream )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// try to read next data chunk:
|
// try to read next data chunk:
|
||||||
if ( !stream.Read(&FCC1, 4) )
|
if ( !stream.Read(&FCC1, 4) && !stream.Eof())
|
||||||
|
{
|
||||||
|
// we didn't reach the EOF! An other kind of error has occurred...
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
//else: proceed with the parsing of the next header block or
|
||||||
|
// exiting this loop (if stream.Eof() == true)
|
||||||
|
}
|
||||||
|
|
||||||
if (m_nFrames==0)
|
if (m_nFrames==0)
|
||||||
return false;
|
return false;
|
||||||
|
Reference in New Issue
Block a user