From: Francesco Chemolli Date: Mon, 20 Jul 2015 13:48:30 +0000 (+0200) Subject: Avoid possible leak in Rock::SwapDir::getOptionTree() (CID 740433) X-Git-Tag: merge-candidate-3-v1~42 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c06a240a1a957b54a53bee7bd1236036494d37fc;p=thirdparty%2Fsquid.git Avoid possible leak in Rock::SwapDir::getOptionTree() (CID 740433) --- 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; }