aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeisuke Kuroyanagi <ksk@google.com>2014-02-21 01:38:36 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2014-02-21 01:38:36 -0800
commitacf61fbdf5eb01f99ed651df74f28e433de58ffb (patch)
treea8279317354a1d4fdd5b4ce7d69a502f2de3ea7d
parent5041d9267e263dfd9373554c5ef41b6218e69ebc (diff)
parent9cfa8417dacb1d3efc687c8b9c5a7f141f5f7746 (diff)
downloadlatinime-acf61fbdf5eb01f99ed651df74f28e433de58ffb.tar.gz
latinime-acf61fbdf5eb01f99ed651df74f28e433de58ffb.tar.xz
latinime-acf61fbdf5eb01f99ed651df74f28e433de58ffb.zip
am 9cfa8417: Merge "Add boundary check for ver2 dict reading."
* commit '9cfa8417dacb1d3efc687c8b9c5a7f141f5f7746': Add boundary check for ver2 dict reading.
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
index 212f2ef39..84a6ccf33 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
@@ -87,9 +87,24 @@ int PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount(
int lastCandidatePtNodePos = 0;
// Let's loop through PtNodes in this PtNode array searching for either the terminal
// or one of its ascendants.
+ if (pos < 0 || pos >= mDictBufferSize) {
+ AKLOGE("PtNode array position is invalid. pos: %d, dict size: %d",
+ pos, mDictBufferSize);
+ mIsCorrupted = true;
+ ASSERT(false);
+ *outUnigramProbability = NOT_A_PROBABILITY;
+ return 0;
+ }
for (int ptNodeCount = PatriciaTrieReadingUtils::getPtNodeArraySizeAndAdvancePosition(
mDictRoot, &pos); ptNodeCount > 0; --ptNodeCount) {
const int startPos = pos;
+ if (pos < 0 || pos >= mDictBufferSize) {
+ AKLOGE("PtNode position is invalid. pos: %d, dict size: %d", pos, mDictBufferSize);
+ mIsCorrupted = true;
+ ASSERT(false);
+ *outUnigramProbability = NOT_A_PROBABILITY;
+ return 0;
+ }
const PatriciaTrieReadingUtils::NodeFlags flags =
PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(mDictRoot, &pos);
const int character = PatriciaTrieReadingUtils::getCodePointAndAdvancePosition(