| 7271 | } |
| 7272 | |
| 7273 | static bool ReconstructTileOffsets(OffsetData& offset_data, |
| 7274 | const EXRHeader* exr_header, |
| 7275 | const unsigned char* head, const unsigned char* marker, const size_t size, |
| 7276 | bool isMultiPartFile, |
| 7277 | bool isDeep) { |
| 7278 | int numXLevels = offset_data.num_x_levels; |
| 7279 | for (unsigned int l = 0; l < offset_data.offsets.size(); ++l) { |
| 7280 | for (unsigned int dy = 0; dy < offset_data.offsets[l].size(); ++dy) { |
| 7281 | for (unsigned int dx = 0; dx < offset_data.offsets[l][dy].size(); ++dx) { |
| 7282 | tinyexr::tinyexr_uint64 tileOffset = tinyexr::tinyexr_uint64(marker - head); |
| 7283 | |
| 7284 | |
| 7285 | if (isMultiPartFile) { |
| 7286 | if ((marker + sizeof(int)) >= (head + size)) { |
| 7287 | return false; |
| 7288 | } |
| 7289 | |
| 7290 | //int partNumber; |
| 7291 | marker += sizeof(int); |
| 7292 | } |
| 7293 | |
| 7294 | if ((marker + 4 * sizeof(int)) >= (head + size)) { |
| 7295 | return false; |
| 7296 | } |
| 7297 | |
| 7298 | int tileX; |
| 7299 | memcpy(&tileX, marker, sizeof(int)); |
| 7300 | tinyexr::swap4(&tileX); |
| 7301 | marker += sizeof(int); |
| 7302 | |
| 7303 | int tileY; |
| 7304 | memcpy(&tileY, marker, sizeof(int)); |
| 7305 | tinyexr::swap4(&tileY); |
| 7306 | marker += sizeof(int); |
| 7307 | |
| 7308 | int levelX; |
| 7309 | memcpy(&levelX, marker, sizeof(int)); |
| 7310 | tinyexr::swap4(&levelX); |
| 7311 | marker += sizeof(int); |
| 7312 | |
| 7313 | int levelY; |
| 7314 | memcpy(&levelY, marker, sizeof(int)); |
| 7315 | tinyexr::swap4(&levelY); |
| 7316 | marker += sizeof(int); |
| 7317 | |
| 7318 | if (isDeep) { |
| 7319 | if ((marker + 2 * sizeof(tinyexr::tinyexr_int64)) >= (head + size)) { |
| 7320 | return false; |
| 7321 | } |
| 7322 | tinyexr::tinyexr_int64 packed_offset_table_size; |
| 7323 | memcpy(&packed_offset_table_size, marker, sizeof(tinyexr::tinyexr_int64)); |
| 7324 | tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64*>(&packed_offset_table_size)); |
| 7325 | marker += sizeof(tinyexr::tinyexr_int64); |
| 7326 | |
| 7327 | tinyexr::tinyexr_int64 packed_sample_size; |
| 7328 | memcpy(&packed_sample_size, marker, sizeof(tinyexr::tinyexr_int64)); |
| 7329 | tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64*>(&packed_sample_size)); |
| 7330 | marker += sizeof(tinyexr::tinyexr_int64); |
no test coverage detected