X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FObjectFile.cpp;h=76cc98266c1214b31395a419db68700cea97285a;hb=refs%2Fheads%2Flinker;hp=929b54a24025d01e57080593b37e28a5538a7ab7;hpb=8c8061a4f8b88410d6d93c039afe6affc4b69cf2;p=l2e.git diff --git a/src/loader/ObjectFile.cpp b/src/loader/ObjectFile.cpp index 929b54a..76cc982 100644 --- a/src/loader/ObjectFile.cpp +++ b/src/loader/ObjectFile.cpp @@ -13,10 +13,14 @@ ObjectFileHeader::ObjectFileHeader() , exportsEnd(0) , externalsBegin(0) , externalsEnd(0) +, imagesBegin(0) +, imagesEnd(0) , objectsBegin(0) , objectsEnd(0) , arraysBegin(0) -, arraysEnd(0) { +, arraysEnd(0) +, scriptsBegin(0) +, scriptsEnd(0) { ident[0] = 'L'; ident[1] = '2'; ident[2] = 'E'; @@ -33,38 +37,42 @@ void ObjectFileHeader::IntegrityCheck(unsigned int fsize) const { if (versionId != FORMAT_ID) { throw runtime_error("format ID mismatch"); } - if (exportsBegin < sizeof(ObjectFileHeader) - || exportsBegin > fsize) { + if (!CheckSection(exportsBegin, exportsEnd, fsize)) { throw runtime_error("exports section out of bounds"); } - if (exportsEnd < exportsBegin - || exportsEnd > fsize - || (exportsEnd - exportsBegin) % sizeof(Export) != 0) { + if ((exportsEnd - exportsBegin) % sizeof(Export) != 0) { throw runtime_error("bogus exports section end"); } - if (externalsBegin < sizeof(ObjectFileHeader) - || externalsBegin >= fsize) { + if (!CheckSection(externalsBegin, externalsEnd, fsize)) { throw runtime_error("externals section out of bounds"); } - if (externalsEnd < externalsBegin - || externalsEnd > fsize - || (externalsEnd - externalsBegin) % sizeof(External) != 0) { + if ((externalsEnd - externalsBegin) % sizeof(External) != 0) { throw runtime_error("bogus externals section end"); } - if (objectsBegin < sizeof(ObjectFileHeader) - || objectsBegin >= fsize - || objectsEnd < objectsBegin - || objectsEnd > fsize) { + 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 (arraysBegin < sizeof(ObjectFileHeader) - || arraysBegin >= fsize - || arraysEnd < arraysBegin - || arraysEnd > fsize) { + 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); @@ -85,6 +93,16 @@ External *ObjectFileHeader::ExternalsEnd() { 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); @@ -105,6 +123,16 @@ Array *ObjectFileHeader::ArraysEnd() { return reinterpret_cast(data + arraysEnd); } +Script *ObjectFileHeader::ScriptsBegin() { + char *data = reinterpret_cast(this); + return reinterpret_cast