[thin_restore] restore_emitter now checks the mappings against the data device length.

This commit is contained in:
Joe Thornber 2013-06-18 14:18:39 +01:00
parent df016f07a7
commit acd197ed6f

View File

@ -48,7 +48,7 @@ namespace {
uint64_t nr_data_blocks, uint64_t nr_data_blocks,
optional<uint64_t> metadata_snap) { optional<uint64_t> metadata_snap) {
in_superblock_ = true; in_superblock_ = true;
nr_data_blocks_ = nr_data_blocks;
superblock &sb = md_->sb_; superblock &sb = md_->sb_;
memcpy(&sb.uuid_, &uuid, sizeof(&sb.uuid_)); memcpy(&sb.uuid_, &uuid, sizeof(&sb.uuid_));
sb.time_ = time; sb.time_ = time;
@ -116,6 +116,13 @@ namespace {
if (!current_device_) if (!current_device_)
throw runtime_error("not in device"); throw runtime_error("not in device");
if (data_block >= nr_data_blocks_) {
std::ostringstream out;
out << "mapping beyond end of data device (" << data_block
<< " >= " << nr_data_blocks_ << ")";
throw std::runtime_error(out.str());
}
uint64_t key[1] = {origin_block}; uint64_t key[1] = {origin_block};
mapping_tree_detail::block_time bt; mapping_tree_detail::block_time bt;
bt.block_ = data_block; bt.block_ = data_block;
@ -139,6 +146,7 @@ namespace {
metadata::ptr md_; metadata::ptr md_;
bool in_superblock_; bool in_superblock_;
block_address nr_data_blocks_;
optional<uint32_t> current_device_; optional<uint32_t> current_device_;
single_mapping_tree::ptr current_mapping_; single_mapping_tree::ptr current_mapping_;
single_mapping_tree::ptr empty_mapping_; single_mapping_tree::ptr empty_mapping_;