X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FObjectFile.cpp;h=7207eb0ed92eb66e52d252f605cb5e75c97d63be;hb=0e7b9eca67383e45e04aa419cb783c92722f7801;hp=929b54a24025d01e57080593b37e28a5538a7ab7;hpb=8c8061a4f8b88410d6d93c039afe6affc4b69cf2;p=l2e.git diff --git a/src/loader/ObjectFile.cpp b/src/loader/ObjectFile.cpp index 929b54a..7207eb0 100644 --- a/src/loader/ObjectFile.cpp +++ b/src/loader/ObjectFile.cpp @@ -33,38 +33,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 + && end >= begin + && end <= fsize; +} + Export *ObjectFileHeader::ExportsBegin() { char *data = reinterpret_cast(this); return reinterpret_cast(data + exportsBegin); @@ -85,6 +89,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);