From c06a240a1a957b54a53bee7bd1236036494d37fc Mon Sep 17 00:00:00 2001 From: Francesco Chemolli Date: Mon, 20 Jul 2015 15:48:30 +0200 Subject: [PATCH] Avoid possible leak in Rock::SwapDir::getOptionTree() (CID 740433) --- src/fs/rock/RockSwapDir.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/fs/rock/RockSwapDir.cc b/src/fs/rock/RockSwapDir.cc index 294e7b5cc8..9bb40e899c 100644 --- a/src/fs/rock/RockSwapDir.cc +++ b/src/fs/rock/RockSwapDir.cc @@ -405,11 +405,18 @@ Rock::SwapDir::parseSize(const bool reconfig) ConfigOption * Rock::SwapDir::getOptionTree() const { - ConfigOptionVector *vector = dynamic_cast(::SwapDir::getOptionTree()); - assert(vector); - vector->options.push_back(new ConfigOptionAdapter(*const_cast(this), &SwapDir::parseSizeOption, &SwapDir::dumpSizeOption)); - vector->options.push_back(new ConfigOptionAdapter(*const_cast(this), &SwapDir::parseTimeOption, &SwapDir::dumpTimeOption)); - vector->options.push_back(new ConfigOptionAdapter(*const_cast(this), &SwapDir::parseRateOption, &SwapDir::dumpRateOption)); + ConfigOption *copt = ::SwapDir::getOptionTree(); + ConfigOptionVector *vector = dynamic_cast(copt); + if (vector) { + // if copt is actually a ConfigOptionVector + vector->options.push_back(new ConfigOptionAdapter(*const_cast(this), &SwapDir::parseSizeOption, &SwapDir::dumpSizeOption)); + vector->options.push_back(new ConfigOptionAdapter(*const_cast(this), &SwapDir::parseTimeOption, &SwapDir::dumpTimeOption)); + vector->options.push_back(new ConfigOptionAdapter(*const_cast(this), &SwapDir::parseRateOption, &SwapDir::dumpRateOption)); + } else { + // we don't know how to handle copt, as it's not a ConfigOptionVector. + // free it (and return nullptr) + delete copt; + } return vector; } -- 2.47.3