From 4d62cf902feaf5288f7438b1005a9e6aa299462e Mon Sep 17 00:00:00 2001 From: megamage Date: Thu, 12 Mar 2009 14:48:44 -0600 Subject: [7443] Better error reporting at DBC files extraction in ad.exe. No functionlity chnages in normal work case. Author: VladimirMangos --HG-- branch : trunk --- contrib/extractor/System.cpp | 21 ++++++++++++++++++--- contrib/extractor/ad.exe | Bin 162816 -> 163840 bytes contrib/extractor/dbcfile.cpp | 31 ++++++++++++++++++++++--------- 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 index 8300b697cef..208eb2da030 100644 Binary files a/contrib/extractor/ad.exe and b/contrib/extractor/ad.exe differ 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 -- cgit v1.2.3