Fixed wrong assumption in Table::Open()
Summary: `Table::Open()` assumes that `size` correctly describes the size of `file`, added a check that the footer is actually the right size and for good measure added assertions to `Footer::DecodeFrom()`. This was discovered by running `valgrind ./db_test` and seeing that `Footer::DecodeFrom()` was accessing uninitialized memory. Test Plan: make clean check ran `valgrind ./db_test` and saw DBTest.NoSpace no longer complains about a conditional jump being dependent on uninitialized memory. Reviewers: dhruba, vamsi, emayanke, sheki Reviewed By: dhruba CC: leveldb Differential Revision: https://reviews.facebook.net/D7815
This commit is contained in:
parent
f881d6f226
commit
4e9d9d989f
@ -42,6 +42,9 @@ void Footer::EncodeTo(std::string* dst) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status Footer::DecodeFrom(Slice* input) {
|
Status Footer::DecodeFrom(Slice* input) {
|
||||||
|
assert(input != NULL);
|
||||||
|
assert(input->size() >= kEncodedLength);
|
||||||
|
|
||||||
const char* magic_ptr = input->data() + kEncodedLength - 8;
|
const char* magic_ptr = input->data() + kEncodedLength - 8;
|
||||||
const uint32_t magic_lo = DecodeFixed32(magic_ptr);
|
const uint32_t magic_lo = DecodeFixed32(magic_ptr);
|
||||||
const uint32_t magic_hi = DecodeFixed32(magic_ptr + 4);
|
const uint32_t magic_hi = DecodeFixed32(magic_ptr + 4);
|
||||||
|
@ -51,6 +51,13 @@ Status Table::Open(const Options& options,
|
|||||||
&footer_input, footer_space);
|
&footer_input, footer_space);
|
||||||
if (!s.ok()) return s;
|
if (!s.ok()) return s;
|
||||||
|
|
||||||
|
// Check that we actually read the whole footer from the file. It may be
|
||||||
|
// that size isn't correct.
|
||||||
|
if (footer_input.size() != Footer::kEncodedLength) {
|
||||||
|
return Status::InvalidArgument("file is too short to be an sstable");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Footer footer;
|
Footer footer;
|
||||||
s = footer.DecodeFrom(&footer_input);
|
s = footer.DecodeFrom(&footer_input);
|
||||||
if (!s.ok()) return s;
|
if (!s.ok()) return s;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user