Fix MergeContext::copied_operands_ strings moving

Summary:
MergeContext::copied_operands contain strings that MergeContext::operand_list_ Slices point to
It's possible that when MergeContext::copied_operands grow, these strings are moved and there place in memory is changed, this will cause MergeContext::operand_list_ to point to invalid memory.
fix this problem by using unique_ptr<string> instead of string

Test Plan: run tests under mac/clang

Reviewers: sdong, yiwu

Reviewed By: yiwu

Subscribers: andrewkr, dhruba

Differential Revision: https://reviews.facebook.net/D61023
main
Islam AbdelRahman 8 years ago
parent a4955b39ac
commit 16e225f70d
  1. 16
      db/merge_context.h

@ -36,9 +36,9 @@ class MergeContext {
operand_list_->push_back(operand_slice); operand_list_->push_back(operand_slice);
} else { } else {
// We need to have our own copy of the operand since it's not pinned // We need to have our own copy of the operand since it's not pinned
copied_operands_->emplace_back(operand_slice.data(), copied_operands_->emplace_back(
operand_slice.size()); new std::string(operand_slice.data(), operand_slice.size()));
operand_list_->push_back(copied_operands_->back()); operand_list_->push_back(*copied_operands_->back());
} }
} }
@ -52,9 +52,9 @@ class MergeContext {
operand_list_->push_back(operand_slice); operand_list_->push_back(operand_slice);
} else { } else {
// We need to have our own copy of the operand since it's not pinned // We need to have our own copy of the operand since it's not pinned
copied_operands_->emplace_back(operand_slice.data(), copied_operands_->emplace_back(
operand_slice.size()); new std::string(operand_slice.data(), operand_slice.size()));
operand_list_->push_back(copied_operands_->back()); operand_list_->push_back(*copied_operands_->back());
} }
} }
@ -88,7 +88,7 @@ class MergeContext {
void Initialize() { void Initialize() {
if (!operand_list_) { if (!operand_list_) {
operand_list_.reset(new std::vector<Slice>()); operand_list_.reset(new std::vector<Slice>());
copied_operands_.reset(new std::vector<std::string>()); copied_operands_.reset(new std::vector<std::unique_ptr<std::string>>());
} }
} }
@ -109,7 +109,7 @@ class MergeContext {
// List of operands // List of operands
std::unique_ptr<std::vector<Slice>> operand_list_; std::unique_ptr<std::vector<Slice>> operand_list_;
// Copy of operands that are not pinned. // Copy of operands that are not pinned.
std::unique_ptr<std::vector<std::string>> copied_operands_; std::unique_ptr<std::vector<std::unique_ptr<std::string>>> copied_operands_;
bool operands_reversed_ = true; bool operands_reversed_ = true;
}; };

Loading…
Cancel
Save