From d57290f6bd8bb0ab2aba4eb0212e914cea63abef Mon Sep 17 00:00:00 2001 From: Timon Wong Date: Wed, 1 May 2013 13:34:56 +0800 Subject: [PATCH] MDict: Fix checksum calculating for plain data block --- mdictparser.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/mdictparser.cc b/mdictparser.cc index 48f565f9..9ef1f2f2 100644 --- a/mdictparser.cc +++ b/mdictparser.cc @@ -247,13 +247,20 @@ bool MdictParser::parseCompressedBlock( size_t compressedBlockSize, const char * quint32 type; quint32 checksum; type = qFromBigEndian( ( const uchar * ) compressedBlockPtr ); - checksum = qFromBigEndian( ( const uchar * )compressedBlockPtr + sizeof( type ) ); + checksum = qFromBigEndian( ( const uchar * )compressedBlockPtr + sizeof( quint32 ) ); if ( type == 0x00000000 ) { // No compression - checksum >>= 8; - if ( checksum != qFromBigEndian( dataSize - 2 ) ) + checksum &= 0xffff; + quint16 sum = 0; + for ( size_t i = 0; i < dataSize; i++ ) + { + sum += dataPtr[i]; + } + sum += 1; + + if ( checksum != sum ) { qWarning() << "MDict: parseCompressedBlock: plain: checksum not match"; return false;