device.lseek((firstDataBlock + 1) * blockSize, SEEK_SET);
device.read(group_desc.data(), (descBlockCount * blockSize));
- unsigned int cnt = 0;
+ unsigned int cnt = blockNbytes << 3;
unsigned int blkItr = firstDataBlock;
// this structure just is used for easy type-casting.
}
for (unsigned int i = 0; i < groupDescCount; i++) {
- data block_bitmap(blockSize);
-
unsigned int blk = (((struct odeExtGroupDesc *)(((unsigned char *)(group_desc.data())) + i * ODE_EXT2_MIN_DESC_SIZE))->blockBitmap);
- device.lseek(blk * blockSize, SEEK_SET);
- device.read(block_bitmap.data(), blockSize);
- cnt = blockNbytes << 3;
- memcpy(bitmap.data() + (blkItr >> 3), block_bitmap.data(), (cnt + 7) >> 3);
- blkItr += blockNbytes << 3;
+ try {
+ data block_bitmap(blockSize);
+ device.lseek(blk * blockSize, SEEK_SET);
+ device.read(block_bitmap.data(), blockSize);
+
+ memcpy(bitmap.data() + (blkItr >> 3), block_bitmap.data(), (cnt + 7) >> 3);
+ } catch (runtime::Exception &e) {
+ WARN("Block " + std::to_string(blk) + " is missing");
+ memset(bitmap.data() + (blkItr >> 3), 0, (cnt + 7) >> 3);
+ }
+ blkItr += cnt;
}
device.close();