prevent nullptr dereference in table reader error case
Summary: A user encountered segfault on the call to `CacheDependencies()`, probably because `NewIndexIterator()` failed before populating `*index_entry`. Let's avoid the call in that case. Closes https://github.com/facebook/rocksdb/pull/2939 Differential Revision: D5928611 Pulled By: ajkr fbshipit-source-id: 484be453dbb00e5e160e9c6a1bc933df7d80f574
This commit is contained in:
parent
6a541afcc4
commit
c2f6e45aa3
@ -813,15 +813,19 @@ Status BlockBasedTable::Open(const ImmutableCFOptions& ioptions,
|
|||||||
CachableEntry<IndexReader> index_entry;
|
CachableEntry<IndexReader> index_entry;
|
||||||
unique_ptr<InternalIterator> iter(
|
unique_ptr<InternalIterator> iter(
|
||||||
new_table->NewIndexIterator(ReadOptions(), nullptr, &index_entry));
|
new_table->NewIndexIterator(ReadOptions(), nullptr, &index_entry));
|
||||||
index_entry.value->CacheDependencies(pin);
|
|
||||||
if (pin) {
|
|
||||||
rep->index_entry = std::move(index_entry);
|
|
||||||
} else {
|
|
||||||
index_entry.Release(table_options.block_cache.get());
|
|
||||||
}
|
|
||||||
s = iter->status();
|
s = iter->status();
|
||||||
|
|
||||||
if (s.ok()) {
|
if (s.ok()) {
|
||||||
|
// This is the first call to NewIndexIterator() since we're in Open().
|
||||||
|
// On success it should give us ownership of the `CachableEntry` by
|
||||||
|
// populating `index_entry`.
|
||||||
|
assert(index_entry.value != nullptr);
|
||||||
|
index_entry.value->CacheDependencies(pin);
|
||||||
|
if (pin) {
|
||||||
|
rep->index_entry = std::move(index_entry);
|
||||||
|
} else {
|
||||||
|
index_entry.Release(table_options.block_cache.get());
|
||||||
|
}
|
||||||
|
|
||||||
// Hack: Call GetFilter() to implicitly add filter to the block_cache
|
// Hack: Call GetFilter() to implicitly add filter to the block_cache
|
||||||
auto filter_entry = new_table->GetFilter();
|
auto filter_entry = new_table->GetFilter();
|
||||||
if (filter_entry.value != nullptr) {
|
if (filter_entry.value != nullptr) {
|
||||||
|
Loading…
Reference in New Issue
Block a user