Fix potential memory leak of scratch buffer (#6879)
Summary: If `req.scratch` is an internally allocated buffer, but `raw_block_contents` is not constructed to own `req.scratch`, then `req.scratch` will be leaked. Pull Request resolved: https://github.com/facebook/rocksdb/pull/6879 Test Plan: make asan_check Reviewed By: anand1976 Differential Revision: D21728498 Pulled By: cheng-chang fbshipit-source-id: 8fc6a4f2543918c565ddc16ecfad1807eb9a42cf
This commit is contained in:
parent
bd68bfb41b
commit
82a82c76e7
@ -1717,7 +1717,8 @@ void BlockBasedTable::RetrieveMultipleBlocks(
|
|||||||
FSReadRequest& req = read_reqs[req_idx];
|
FSReadRequest& req = read_reqs[req_idx];
|
||||||
Status s = req.status;
|
Status s = req.status;
|
||||||
if (s.ok()) {
|
if (s.ok()) {
|
||||||
if (req.result.size() != req.len) {
|
if ((req.result.size() != req.len) ||
|
||||||
|
(req_offset + block_size(handle) > req.result.size())) {
|
||||||
s = Status::Corruption(
|
s = Status::Corruption(
|
||||||
"truncated block read from " + rep_->file->file_name() +
|
"truncated block read from " + rep_->file->file_name() +
|
||||||
" offset " + ToString(handle.offset()) + ", expected " +
|
" offset " + ToString(handle.offset()) + ", expected " +
|
||||||
@ -1726,15 +1727,6 @@ void BlockBasedTable::RetrieveMultipleBlocks(
|
|||||||
}
|
}
|
||||||
|
|
||||||
BlockContents raw_block_contents;
|
BlockContents raw_block_contents;
|
||||||
size_t cur_read_end = req_offset + block_size(handle);
|
|
||||||
if (cur_read_end > req.result.size()) {
|
|
||||||
s = Status::Corruption(
|
|
||||||
"truncated block read from " + rep_->file->file_name() + " offset " +
|
|
||||||
ToString(handle.offset()) + ", expected " + ToString(req.len) +
|
|
||||||
" bytes, got " + ToString(req.result.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s.ok()) {
|
|
||||||
if (!use_shared_buffer) {
|
if (!use_shared_buffer) {
|
||||||
// We allocated a buffer for this block. Give ownership of it to
|
// We allocated a buffer for this block. Give ownership of it to
|
||||||
// BlockContents so it can free the memory
|
// BlockContents so it can free the memory
|
||||||
@ -1750,11 +1742,11 @@ void BlockBasedTable::RetrieveMultipleBlocks(
|
|||||||
raw_block_contents =
|
raw_block_contents =
|
||||||
BlockContents(Slice(req.result.data() + req_offset, handle.size()));
|
BlockContents(Slice(req.result.data() + req_offset, handle.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
raw_block_contents.is_raw_block = true;
|
raw_block_contents.is_raw_block = true;
|
||||||
#endif
|
#endif
|
||||||
if (options.verify_checksums) {
|
|
||||||
|
if (s.ok() && options.verify_checksums) {
|
||||||
PERF_TIMER_GUARD(block_checksum_time);
|
PERF_TIMER_GUARD(block_checksum_time);
|
||||||
const char* data = req.result.data();
|
const char* data = req.result.data();
|
||||||
uint32_t expected =
|
uint32_t expected =
|
||||||
@ -1769,7 +1761,6 @@ void BlockBasedTable::RetrieveMultipleBlocks(
|
|||||||
handle.size() + 1, expected);
|
handle.size() + 1, expected);
|
||||||
TEST_SYNC_POINT_CALLBACK("RetrieveMultipleBlocks:VerifyChecksum", &s);
|
TEST_SYNC_POINT_CALLBACK("RetrieveMultipleBlocks:VerifyChecksum", &s);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (s.ok()) {
|
if (s.ok()) {
|
||||||
// When the blocks share the same underlying buffer (scratch or direct io
|
// When the blocks share the same underlying buffer (scratch or direct io
|
||||||
|
Loading…
Reference in New Issue
Block a user