(CRangeCoder.Decode): fixed buffers length checks.

This commit is contained in:
morkt 2015-06-21 20:41:43 +04:00
parent 1fad53c137
commit 598b50750b

View File

@ -144,8 +144,8 @@ namespace GameRes.Formats.Kogado
{ {
byte[] m_pSrcBuffer; byte[] m_pSrcBuffer;
byte[] m_pDestBuffer; byte[] m_pDestBuffer;
uint m_dwSrcLength; uint m_dwSrcEnd;
uint m_dwDestLength; uint m_dwDestEnd;
uint m_dwSrcIndex; uint m_dwSrcIndex;
uint m_dwDestIndex; uint m_dwDestIndex;
RangeCoder m_rc = new RangeCoder(); RangeCoder m_rc = new RangeCoder();
@ -216,13 +216,13 @@ namespace GameRes.Formats.Kogado
m_dwSrcIndex = m_dwDestIndex = 0; m_dwSrcIndex = m_dwDestIndex = 0;
m_pSrcBuffer = src; m_pSrcBuffer = src;
m_pDestBuffer = dest; m_pDestBuffer = dest;
m_dwSrcLength = srcsize; m_dwSrcEnd = srcsize;
m_dwDestLength = destsize; m_dwDestEnd = destsize;
//this->InitQSModel(); //this->InitQSModel();
this->StartEncoding(); this->StartEncoding();
while ( m_dwSrcIndex < m_dwSrcLength ) { while ( m_dwSrcIndex < m_dwSrcEnd ) {
if ( !this->GetSrcByteImpl( &ch_byte ) ) if ( !this->GetSrcByteImpl( &ch_byte ) )
return false; return false;
qsgetfreq( &m_qsm, ch_byte, &syfreq, &ltfreq ); qsgetfreq( &m_qsm, ch_byte, &syfreq, &ltfreq );
@ -253,20 +253,19 @@ namespace GameRes.Formats.Kogado
m_dwDestIndex = dst_index; m_dwDestIndex = dst_index;
m_pSrcBuffer = src; m_pSrcBuffer = src;
m_pDestBuffer = dst; m_pDestBuffer = dst;
m_dwSrcLength = src_size; m_dwSrcEnd = src_index + src_size;
m_dwDestLength = dst_size; m_dwDestEnd = dst_index + dst_size;
StartDecoding(); StartDecoding();
while (m_dwSrcIndex < m_dwSrcLength) while (m_dwSrcIndex < m_dwSrcEnd)
{ {
ltfreq = (int)DecodeCulshift (12); ltfreq = (int)DecodeCulshift (12);
ch = m_qsm.GetSym (ltfreq); ch = m_qsm.GetSym (ltfreq);
if (256 == ch) // check for end-of-file if (256 == ch) // check for end-of-file
break; break;
if (m_dwDestIndex >= m_dwDestLength) if (!SetDestByteImpl ((byte)ch))
return 0; return 0;
SetDestByteImpl ((byte)ch);
m_qsm.GetFreq (ch, out syfreq, out ltfreq); m_qsm.GetFreq (ch, out syfreq, out ltfreq);
DecodeUpdate (syfreq, ltfreq, 1 << 12); DecodeUpdate (syfreq, ltfreq, 1 << 12);
m_qsm.Update (ch); m_qsm.Update (ch);
@ -274,7 +273,7 @@ namespace GameRes.Formats.Kogado
m_qsm.GetFreq (256, out syfreq, out ltfreq); m_qsm.GetFreq (256, out syfreq, out ltfreq);
DecodeUpdate (syfreq, ltfreq, 1 << 12); DecodeUpdate (syfreq, ltfreq, 1 << 12);
DoneDecoding(); DoneDecoding();
return m_dwDestIndex; return m_dwDestIndex-dst_index;
} }
/* /*
// Encode -------------------------------------------------------- // Encode --------------------------------------------------------
@ -417,7 +416,7 @@ namespace GameRes.Formats.Kogado
// I/O ----------------------------------------------------------- // I/O -----------------------------------------------------------
bool GetSrcByteImpl (out byte pData) bool GetSrcByteImpl (out byte pData)
{ {
if (m_dwSrcIndex >= m_dwSrcLength) if (m_dwSrcIndex >= m_dwSrcEnd)
{ {
pData = 0; pData = 0;
return false; return false;
@ -428,7 +427,7 @@ namespace GameRes.Formats.Kogado
bool SetDestByteImpl (byte byData) bool SetDestByteImpl (byte byData)
{ {
if (m_dwDestIndex >= m_dwDestLength) if (m_dwDestIndex >= m_dwDestEnd)
return false; return false;
m_pDestBuffer[m_dwDestIndex++] = byData; m_pDestBuffer[m_dwDestIndex++] = byData;
return true; return true;