|
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;
|