diff options
-rw-r--r-- | contrib/extractor/System.cpp | 21 | ||||
-rw-r--r-- | contrib/extractor/ad.exe | bin | 162816 -> 163840 bytes | |||
-rw-r--r-- | contrib/extractor/dbcfile.cpp | 31 | ||||
-rw-r--r-- | contrib/extractor/dbcfile.h | 2 |
4 files changed, 41 insertions, 13 deletions
diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp index 2696c7b1a2b..75cc5ba92e4 100644 --- a/contrib/extractor/System.cpp +++ b/contrib/extractor/System.cpp @@ -153,7 +153,12 @@ uint32 ReadMapDBC() { printf("Read Map.dbc file... "); DBCFile dbc("DBFilesClient\\Map.dbc"); - dbc.open(); + + if(!dbc.open()) + { + printf("Fatal error: Invalid Map.dbc file format!\n"); + exit(1); + } size_t map_count = dbc.getRecordCount(); map_ids = new map_id[map_count]; @@ -170,7 +175,12 @@ void ReadAreaTableDBC() { printf("Read AreaTable.dbc file..."); DBCFile dbc("DBFilesClient\\AreaTable.dbc"); - dbc.open(); + + if(!dbc.open()) + { + printf("Fatal error: Invalid AreaTable.dbc file format!\n"); + exit(1); + } size_t area_count = dbc.getRecordCount(); size_t maxid = dbc.getMaxId(); @@ -189,7 +199,12 @@ void ReadLiquidTypeTableDBC() { printf("Read LiquidType.dbc file..."); DBCFile dbc("DBFilesClient\\LiquidType.dbc"); - dbc.open(); + if(!dbc.open()) + { + printf("Fatal error: Invalid LiquidType.dbc file format!\n"); + exit(1); + } + size_t LiqType_count = dbc.getRecordCount(); size_t LiqType_maxid = dbc.getMaxId(); LiqType = new uint16[LiqType_maxid + 1]; diff --git a/contrib/extractor/ad.exe b/contrib/extractor/ad.exe Binary files differindex 8300b697cef..208eb2da030 100644 --- a/contrib/extractor/ad.exe +++ b/contrib/extractor/ad.exe diff --git a/contrib/extractor/dbcfile.cpp b/contrib/extractor/dbcfile.cpp index dbe379d27f7..dd58ac1b4a6 100644 --- a/contrib/extractor/dbcfile.cpp +++ b/contrib/extractor/dbcfile.cpp @@ -9,29 +9,42 @@ DBCFile::DBCFile(const std::string &filename): { } -void DBCFile::open() +bool DBCFile::open() { MPQFile f(filename.c_str()); char header[4]; unsigned int na,nb,es,ss; - f.read(header,4); // Number of records - assert(header[0]=='W' && header[1]=='D' && header[2]=='B' && header[3] == 'C'); - f.read(&na,4); // Number of records - f.read(&nb,4); // Number of fields - f.read(&es,4); // Size of a record - f.read(&ss,4); // String size + if(f.read(header,4)!=4) // Number of records + return false; + + if(header[0]!='W' || header[1]!='D' || header[2]!='B' || header[3]!='C') + return false; + + if(f.read(&na,4)!=4) // Number of records + return false; + if(f.read(&nb,4)!=4) // Number of fields + return false; + if(f.read(&es,4)!=4) // Size of a record + return false; + if(f.read(&ss,4)!=4) // String size + return false; recordSize = es; recordCount = na; fieldCount = nb; stringSize = ss; - assert(fieldCount*4 == recordSize); + if(fieldCount*4 != recordSize) + return false; data = new unsigned char[recordSize*recordCount+stringSize]; stringTable = data + recordSize*recordCount; - f.read(data,recordSize*recordCount+stringSize); + + size_t data_size = recordSize*recordCount+stringSize; + if(f.read(data,data_size)!=data_size) + return false; f.close(); + return true; } DBCFile::~DBCFile() { diff --git a/contrib/extractor/dbcfile.h b/contrib/extractor/dbcfile.h index 7d709e80948..aef61df7aaa 100644 --- a/contrib/extractor/dbcfile.h +++ b/contrib/extractor/dbcfile.h @@ -10,7 +10,7 @@ public: ~DBCFile(); // Open database. It must be openened before it can be used. - void open(); + bool open(); // Database exceptions class Exception |