Summary:
In InternalGet, BlockReader returns an Iterator which is legitimately freed at the end of the 'else' scope. BUT there is a break statement in between and must be freed there too!
The best solution would be to move to unique_ptr and let it handle. Changed it to a unique_ptr.
Test Plan: valgrind ./db_test;make all check
Reviewers: dhruba, haobo
Reviewed By: dhruba
CC: leveldb
Differential Revision: https://reviews.facebook.net/D12681
break;
} else {
bool didIO = false;
- Iterator* block_iter = BlockReader(this, options, iiter->value(),
- &didIO);
+ std::unique_ptr<Iterator> block_iter(
+ BlockReader(this, options, iiter->value(), &didIO));
if (options.read_tier && block_iter->status().IsIncomplete()) {
// couldn't get block from block_cache
}
}
s = block_iter->status();
- delete block_iter;
}
}
if (s.ok()) {