From e9be5dabf256c18a5575d1394e481e4f21ece97d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 7 Aug 2018 17:02:56 -0500 Subject: [PATCH] kv/KeyValueDB: return const char* from MergeOperator::name() This avoids a c_str() on a temporary string later down the line, which avoids a use-after-free. Fixes: http://tracker.ceph.com/issues/26875 Signed-off-by: Sage Weil --- src/kv/KeyValueDB.h | 2 +- src/kv/RocksDBStore.cc | 2 +- src/os/bluestore/BitmapFreelistManager.cc | 2 +- src/os/bluestore/BlueStore.cc | 2 +- src/test/objectstore/test_kv.cc | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/kv/KeyValueDB.h b/src/kv/KeyValueDB.h index a3fbe2fd54050..097fe12827804 100644 --- a/src/kv/KeyValueDB.h +++ b/src/kv/KeyValueDB.h @@ -447,7 +447,7 @@ public: const char *rdata, size_t rlen, std::string *new_value) = 0; /// We use each operator name and each prefix to construct the overall RocksDB operator name for consistency check at open time. - virtual string name() const = 0; + virtual const char *name() const = 0; virtual ~MergeOperator() {} }; diff --git a/src/kv/RocksDBStore.cc b/src/kv/RocksDBStore.cc index a19d84de73569..e2fef5d3823de 100644 --- a/src/kv/RocksDBStore.cc +++ b/src/kv/RocksDBStore.cc @@ -128,7 +128,7 @@ public: explicit MergeOperatorLinker(const std::shared_ptr &o) : mop(o) {} const char *Name() const override { - return mop->name().c_str(); + return mop->name(); } bool Merge(const rocksdb::Slice& key, diff --git a/src/os/bluestore/BitmapFreelistManager.cc b/src/os/bluestore/BitmapFreelistManager.cc index 5270dbc9e2010..27af4c75c4aae 100644 --- a/src/os/bluestore/BitmapFreelistManager.cc +++ b/src/os/bluestore/BitmapFreelistManager.cc @@ -35,7 +35,7 @@ struct XorMergeOperator : public KeyValueDB::MergeOperator { } // We use each operator name and each prefix to construct the // overall RocksDB operator name for consistency check at open time. - string name() const override { + const char *name() const override { return "bitwise_xor"; } }; diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 42318ab811143..2b2386509f19a 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -560,7 +560,7 @@ struct Int64ArrayMergeOperator : public KeyValueDB::MergeOperator { } // We use each operator name and each prefix to construct the // overall RocksDB operator name for consistency check at open time. - string name() const override { + const char *name() const override { return "int64_array"; } }; diff --git a/src/test/objectstore/test_kv.cc b/src/test/objectstore/test_kv.cc index 407cee5d929ca..c47a29299bc43 100644 --- a/src/test/objectstore/test_kv.cc +++ b/src/test/objectstore/test_kv.cc @@ -208,7 +208,7 @@ struct AppendMOP : public KeyValueDB::MergeOperator { } // We use each operator name and each prefix to construct the // overall RocksDB operator name for consistency check at open time. - string name() const override { + const char *name() const override { return "Append"; } }; -- 2.39.5