]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/ObjectFile.cpp
ref and load images in l2o files
[l2e.git] / src / loader / ObjectFile.cpp
index 929b54a24025d01e57080593b37e28a5538a7ab7..7207eb0ed92eb66e52d252f605cb5e75c97d63be 100644 (file)
@@ -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<char *>(this);
        return reinterpret_cast<Export *>(data + exportsBegin);
@@ -85,6 +89,16 @@ External *ObjectFileHeader::ExternalsEnd() {
        return reinterpret_cast<External *>(data + externalsEnd);
 }
 
+Image *ObjectFileHeader::ImagesBegin() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Image *>(data + imagesBegin);
+}
+
+Image *ObjectFileHeader::ImagesEnd() {
+       char *data = reinterpret_cast<char *>(this);
+       return reinterpret_cast<Image *>(data + imagesEnd);
+}
+
 Object *ObjectFileHeader::ObjectsBegin() {
        char *data = reinterpret_cast<char *>(this);
        return reinterpret_cast<Object *>(data + objectsBegin);