From f39452e81fe77649b8fd1f0898d42418ac267bdd Mon Sep 17 00:00:00 2001 From: Islam AbdelRahman Date: Thu, 17 Nov 2016 12:02:40 -0800 Subject: [PATCH] Fix heap use after free ASAN/Valgrind Summary: Dont use c_str() of temp std::string in RocksLuaCompactionFilter::Name() Closes https://github.com/facebook/rocksdb/pull/1535 Differential Revision: D4199094 Pulled By: IslamAbdelRahman fbshipit-source-id: e56ce62 --- .../utilities/lua/rocks_lua_compaction_filter.h | 4 +++- utilities/lua/rocks_lua_compaction_filter.cc | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/rocksdb/utilities/lua/rocks_lua_compaction_filter.h b/include/rocksdb/utilities/lua/rocks_lua_compaction_filter.h index e80aa5448..78c2e197c 100644 --- a/include/rocksdb/utilities/lua/rocks_lua_compaction_filter.h +++ b/include/rocksdb/utilities/lua/rocks_lua_compaction_filter.h @@ -161,7 +161,8 @@ class RocksLuaCompactionFilter : public rocksdb::CompactionFilter { explicit RocksLuaCompactionFilter(const RocksLuaCompactionFilterOptions& opt) : options_(opt), lua_state_wrapper_(opt.lua_script, opt.libraries), - error_count_(0) {} + error_count_(0), + name_("") {} virtual bool Filter(int level, const Slice& key, const Slice& existing_value, std::string* new_value, @@ -180,6 +181,7 @@ class RocksLuaCompactionFilter : public rocksdb::CompactionFilter { RocksLuaCompactionFilterOptions options_; LuaStateWrapper lua_state_wrapper_; mutable int error_count_; + mutable std::string name_; }; } // namespace lua diff --git a/utilities/lua/rocks_lua_compaction_filter.cc b/utilities/lua/rocks_lua_compaction_filter.cc index 47541a88b..381c3db37 100644 --- a/utilities/lua/rocks_lua_compaction_filter.cc +++ b/utilities/lua/rocks_lua_compaction_filter.cc @@ -134,7 +134,9 @@ bool RocksLuaCompactionFilter::Filter(int level, const Slice& key, } const char* RocksLuaCompactionFilter::Name() const { - std::string name = ""; + if (name_ != "") { + return name_.c_str(); + } auto* lua_state = lua_state_wrapper_.GetLuaState(); // push the right function into the lua stack lua_getglobal(lua_state, kNameFunctionName.c_str()); @@ -146,7 +148,7 @@ const char* RocksLuaCompactionFilter::Name() const { lua_tostring(lua_state, -1)); // pops out the lua error from stack lua_pop(lua_state, 1); - return name.c_str(); + return name_.c_str(); } // check the return value @@ -159,10 +161,10 @@ const char* RocksLuaCompactionFilter::Name() const { const size_t name_size = lua_strlen(lua_state, -1); assert(name_buf[name_size] == '\0'); assert(strlen(name_buf) <= name_size); - name = name_buf; + name_ = name_buf; } lua_pop(lua_state, 1); - return name.c_str(); + return name_.c_str(); } /* Not yet supported