Peng Wu 7785580
Index: OpenCC-ver.1.0.5/src/BinaryDict.cpp
Peng Wu 7785580
===================================================================
Peng Wu 7785580
--- OpenCC-ver.1.0.5.orig/src/BinaryDict.cpp
Peng Wu 7785580
+++ OpenCC-ver.1.0.5/src/BinaryDict.cpp
Peng Wu 7785580
@@ -63,6 +63,12 @@ void BinaryDict::SerializeToFile(FILE* f
Peng Wu 7785580
 }
Peng Wu 7785580
 
Peng Wu 7785580
 BinaryDictPtr BinaryDict::NewFromFile(FILE* fp) {
Peng Wu 7785580
+  size_t offsetBound, savedOffset;
Peng Wu 7785580
+  savedOffset = ftell(fp);
Peng Wu 7785580
+  fseek(fp, 0L, SEEK_END);
Peng Wu 7785580
+  offsetBound = ftell(fp) - savedOffset;
Peng Wu 7785580
+  fseek(fp, savedOffset, SEEK_SET);
Peng Wu 7785580
+
Peng Wu 7785580
   BinaryDictPtr dict(new BinaryDict(LexiconPtr(new Lexicon)));
Peng Wu 7785580
 
Peng Wu 7785580
   // Number of items
Peng Wu 7785580
@@ -109,7 +115,7 @@ BinaryDictPtr BinaryDict::NewFromFile(FI
Peng Wu 7785580
     // Key offset
Peng Wu 7785580
     size_t keyOffset;
Peng Wu 7785580
     unitsRead = fread(&keyOffset, sizeof(size_t), 1, fp);
Peng Wu 7785580
-    if (unitsRead != 1) {
Peng Wu 7785580
+    if (unitsRead != 1 || keyOffset >= offsetBound) {
Peng Wu 7785580
       throw InvalidFormat("Invalid OpenCC binary dictionary (keyOffset)");
Peng Wu 7785580
     }
Peng Wu 7785580
     const char* key = dict->keyBuffer.c_str() + keyOffset;
Peng Wu 7785580
@@ -118,7 +124,7 @@ BinaryDictPtr BinaryDict::NewFromFile(FI
Peng Wu 7785580
     for (size_t j = 0; j < numValues; j++) {
Peng Wu 7785580
       size_t valueOffset;
Peng Wu 7785580
       unitsRead = fread(&valueOffset, sizeof(size_t), 1, fp);
Peng Wu 7785580
-      if (unitsRead != 1) {
Peng Wu 7785580
+      if (unitsRead != 1 || valueOffset >= offsetBound) {
Peng Wu 7785580
         throw InvalidFormat("Invalid OpenCC binary dictionary (valueOffset)");
Peng Wu 7785580
       }
Peng Wu 7785580
       const char* value = dict->valueBuffer.c_str() + valueOffset;