X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FObjectFile.cpp;h=76cc98266c1214b31395a419db68700cea97285a;hb=refs%2Fheads%2Flinker;hp=4cb886223c80150216cdad339bdbc59312bcbafe;hpb=553fb21593a9c95e37e3be98ad0e4b97bc4ff11b;p=l2e.git diff --git a/src/loader/ObjectFile.cpp b/src/loader/ObjectFile.cpp index 4cb8862..76cc982 100644 --- a/src/loader/ObjectFile.cpp +++ b/src/loader/ObjectFile.cpp @@ -1,12 +1,10 @@ -/* - * ObjectFile.cpp - * - * Created on: Sep 15, 2012 - * Author: holy - */ - #include "ObjectFile.h" +#include + +using std::runtime_error; + + namespace loader { ObjectFileHeader::ObjectFileHeader() @@ -15,40 +13,150 @@ ObjectFileHeader::ObjectFileHeader() , exportsEnd(0) , externalsBegin(0) , externalsEnd(0) -, exportStringsBegin(0) -, exportStringsEnd(0) -, externalStringsBegin(0) -, externalStringsEnd(0) , imagesBegin(0) , imagesEnd(0) , objectsBegin(0) -, objectsEnd(0) { +, objectsEnd(0) +, arraysBegin(0) +, arraysEnd(0) +, scriptsBegin(0) +, scriptsEnd(0) { ident[0] = 'L'; ident[1] = '2'; ident[2] = 'E'; ident[3] = '\n'; } -LoadedObjectFile::LoadedObjectFile() -: allocPtr(0) -, fileHeader(0) -, typeOffsetsBegin(0) -, typeOffsetsEnd(0) -, exportsBegin(0) -, exportsEnd(0) -, externalsBegin(0) -, externalsEnd(0) -, exportStringsBegin(0) -, exportStringsEnd(0) -, externalStringsBegin(0) -, externalStringsEnd(0) -, imagesBegin(0) -, imagesEnd(0) -, objectsBegin(0) -, objectsEnd(0) -, surfaces(0) -, surfaceCount(0) { +void ObjectFileHeader::IntegrityCheck(unsigned int fsize) const { + if (ident[0] != 'L' + || ident[1] != '2' + || ident[2] != 'E' + || ident[3] != '\n') { + throw runtime_error("magic bytes mismatch"); + } + if (versionId != FORMAT_ID) { + throw runtime_error("format ID mismatch"); + } + if (!CheckSection(exportsBegin, exportsEnd, fsize)) { + throw runtime_error("exports section out of bounds"); + } + if ((exportsEnd - exportsBegin) % sizeof(Export) != 0) { + throw runtime_error("bogus exports section end"); + } + if (!CheckSection(externalsBegin, externalsEnd, fsize)) { + throw runtime_error("externals section out of bounds"); + } + if ((externalsEnd - externalsBegin) % sizeof(External) != 0) { + throw runtime_error("bogus externals section end"); + } + if (!CheckSection(imagesBegin, imagesEnd, fsize)) { + throw runtime_error("images section out of bounds"); + } + if ((imagesEnd - imagesBegin) % sizeof(Image) != 0) { + throw runtime_error("bogus images section end"); + } + if (!CheckSection(objectsBegin, objectsEnd, fsize)) { + throw runtime_error("objects section out of bounds"); + } + if (!CheckSection(arraysBegin, arraysEnd, fsize)) { + throw runtime_error("arrays section out of bounds"); + } +} + +bool ObjectFileHeader::CheckSection( + unsigned int begin, + unsigned int end, + unsigned int fsize) const { + return begin >= sizeof(ObjectFileHeader) + && (begin < fsize || begin == end) + && end >= begin + && end <= fsize; +} + +Export *ObjectFileHeader::ExportsBegin() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + exportsBegin); +} + +Export *ObjectFileHeader::ExportsEnd() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + exportsEnd); +} + +External *ObjectFileHeader::ExternalsBegin() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + externalsBegin); +} + +External *ObjectFileHeader::ExternalsEnd() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + externalsEnd); +} + +Image *ObjectFileHeader::ImagesBegin() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + imagesBegin); +} + +Image *ObjectFileHeader::ImagesEnd() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + imagesEnd); +} + +Object *ObjectFileHeader::ObjectsBegin() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + objectsBegin); +} + +Object *ObjectFileHeader::ObjectsEnd() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + objectsEnd); +} + +Array *ObjectFileHeader::ArraysBegin() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + arraysBegin); +} + +Array *ObjectFileHeader::ArraysEnd() { + char *data = reinterpret_cast(this); + return reinterpret_cast(data + arraysEnd); +} + +Script *ObjectFileHeader::ScriptsBegin() { + char *data = reinterpret_cast(this); + return reinterpret_cast