am f9ce867d: Add boundary check for v4 bigram reading.

* commit 'f9ce867d805a8e102b26028831b75d5ed296838f':
  Add boundary check for v4 bigram reading.
main
Keisuke Kuroyanagi 2014-05-27 10:39:20 +00:00 committed by Android Git Automerger
commit f9d2c5c113
2 changed files with 19 additions and 3 deletions

View File

@ -23,9 +23,11 @@ namespace latinime {
const BigramEntry BigramDictContent::getBigramEntryAndAdvancePosition( const BigramEntry BigramDictContent::getBigramEntryAndAdvancePosition(
int *const bigramEntryPos) const { int *const bigramEntryPos) const {
const BufferWithExtendableBuffer *const bigramListBuffer = getContentBuffer(); const BufferWithExtendableBuffer *const bigramListBuffer = getContentBuffer();
if (*bigramEntryPos < 0 || *bigramEntryPos >= bigramListBuffer->getTailPosition()) { const int bigramEntryTailPos = (*bigramEntryPos) + getBigramEntrySize();
AKLOGE("Invalid bigram entry position. bigramEntryPos: %d, bufSize: %d", if (*bigramEntryPos < 0 || bigramEntryTailPos > bigramListBuffer->getTailPosition()) {
*bigramEntryPos, bigramListBuffer->getTailPosition()); AKLOGE("Invalid bigram entry position. bigramEntryPos: %d, bigramEntryTailPos: %d, "
"bufSize: %d", *bigramEntryPos, bigramEntryTailPos,
bigramListBuffer->getTailPosition());
ASSERT(false); ASSERT(false);
return BigramEntry(false /* hasNext */, NOT_A_PROBABILITY, return BigramEntry(false /* hasNext */, NOT_A_PROBABILITY,
Ver4DictConstants::NOT_A_TERMINAL_ID); Ver4DictConstants::NOT_A_TERMINAL_ID);

View File

@ -99,6 +99,20 @@ class BigramDictContent : public SparseTableDictContent {
return hasNext ? Ver4DictConstants::BIGRAM_HAS_NEXT_MASK : 0; return hasNext ? Ver4DictConstants::BIGRAM_HAS_NEXT_MASK : 0;
} }
int getBigramEntrySize() const {
if (mHasHistoricalInfo) {
return Ver4DictConstants::BIGRAM_FLAGS_FIELD_SIZE
+ Ver4DictConstants::TIME_STAMP_FIELD_SIZE
+ Ver4DictConstants::WORD_LEVEL_FIELD_SIZE
+ Ver4DictConstants::WORD_COUNT_FIELD_SIZE
+ Ver4DictConstants::BIGRAM_TARGET_TERMINAL_ID_FIELD_SIZE;
} else {
return Ver4DictConstants::BIGRAM_FLAGS_FIELD_SIZE
+ Ver4DictConstants::PROBABILITY_SIZE
+ Ver4DictConstants::BIGRAM_TARGET_TERMINAL_ID_FIELD_SIZE;
}
}
bool runGCBigramList(const int bigramListPos, bool runGCBigramList(const int bigramListPos,
const BigramDictContent *const sourceBigramDictContent, const int toPos, const BigramDictContent *const sourceBigramDictContent, const int toPos,
const TerminalPositionLookupTable::TerminalIdMap *const terminalIdMap, const TerminalPositionLookupTable::TerminalIdMap *const terminalIdMap,