X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FObjectFile.cpp;h=929b54a24025d01e57080593b37e28a5538a7ab7;hb=8c8061a4f8b88410d6d93c039afe6affc4b69cf2;hp=4cb886223c80150216cdad339bdbc59312bcbafe;hpb=0f30d8254ff8b9e63795960ec031577cf68fbf95;p=l2e.git diff --git a/src/loader/ObjectFile.cpp b/src/loader/ObjectFile.cpp index 4cb8862..929b54a 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,114 @@ 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) { 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 (exportsBegin < sizeof(ObjectFileHeader) + || exportsBegin > fsize) { + throw runtime_error("exports section out of bounds"); + } + if (exportsEnd < exportsBegin + || exportsEnd > fsize + || (exportsEnd - exportsBegin) % sizeof(Export) != 0) { + throw runtime_error("bogus exports section end"); + } + if (externalsBegin < sizeof(ObjectFileHeader) + || externalsBegin >= fsize) { + throw runtime_error("externals section out of bounds"); + } + if (externalsEnd < externalsBegin + || externalsEnd > fsize + || (externalsEnd - externalsBegin) % sizeof(External) != 0) { + throw runtime_error("bogus externals section end"); + } + if (objectsBegin < sizeof(ObjectFileHeader) + || objectsBegin >= fsize + || objectsEnd < objectsBegin + || objectsEnd > fsize) { + throw runtime_error("objects section out of bounds"); + } + if (arraysBegin < sizeof(ObjectFileHeader) + || arraysBegin >= fsize + || arraysEnd < arraysBegin + || arraysEnd > fsize) { + throw runtime_error("arrays section out of bounds"); + } +} + +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); +} + +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); +} + + +char *Object::RawObject() { + return reinterpret_cast(this) + sizeof(Object); +} + +Object *Object::Next() { + return reinterpret_cast(RawObject() + size); +} + + +char *Array::Data() { + return reinterpret_cast(this) + sizeof(Array); +} +Array *Array::Next() { + return reinterpret_cast(Data() + size); } }