Fix memory leak in table.cc

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
This commit is contained in:
Mayank Agarwal 2013-09-02 15:17:03 -07:00
parent b1d09f1a51
commit 352f0636ef

View File

@ -421,8 +421,8 @@ Status Table::InternalGet(const ReadOptions& options, const Slice& k,
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
@ -440,7 +440,6 @@ Status Table::InternalGet(const ReadOptions& options, const Slice& k,
}
}
s = block_iter->status();
delete block_iter;
}
}
if (s.ok()) {