From 3c636755607919bc99b2219683a402660740f0db Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 7 Jul 2021 04:02:07 +0300 Subject: cam: options: Avoid copies of OptionvValue and KeyValueParser::Options The OptionValue toKeyValues() and toArray() functions return a copy of the values. This is unnecessary, and can cause use-after-free issues when taking references to the return values. Return references instead to optimize the implementation and avoid issues. The behaviour of the two functions is now undefined in case of an option type mismatch. The current implementation catches this with an assertion. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham Reviewed-by: Jacopo Mondi --- src/cam/options.cpp | 24 ++++++++++++------------ src/cam/options.h | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/cam/options.cpp b/src/cam/options.cpp index 481ac189..6e0d802c 100644 --- a/src/cam/options.cpp +++ b/src/cam/options.cpp @@ -638,27 +638,27 @@ std::string OptionValue::toString() const /** * \brief Retrieve the value as a key-value list - * \return The option value as a KeyValueParser::Options, or an empty list if - * the value type isn't ValueType::ValueKeyValue + * + * The behaviour is undefined if the value type isn't ValueType::ValueKeyValue. + * + * \return The option value as a KeyValueParser::Options */ -KeyValueParser::Options OptionValue::toKeyValues() const +const KeyValueParser::Options &OptionValue::toKeyValues() const { - if (type_ != ValueKeyValue) - return KeyValueParser::Options(); - + assert(type_ == ValueKeyValue); return keyValues_; } /** * \brief Retrieve the value as an array - * \return The option value as a std::vector of OptionValue, or an empty vector - * if the value type isn't ValueType::ValueArray + * + * The behaviour is undefined if the value type isn't ValueType::ValueArray. + * + * \return The option value as a std::vector of OptionValue */ -std::vector OptionValue::toArray() const +const std::vector &OptionValue::toArray() const { - if (type_ != ValueArray) - return std::vector{}; - + assert(type_ == ValueArray); return array_; } diff --git a/src/cam/options.h b/src/cam/options.h index 83c409ae..0047b4f2 100644 --- a/src/cam/options.h +++ b/src/cam/options.h @@ -142,8 +142,8 @@ public: int toInteger() const; std::string toString() const; - KeyValueParser::Options toKeyValues() const; - std::vector toArray() const; + const KeyValueParser::Options &toKeyValues() const; + const std::vector &toArray() const; const OptionsParser::Options &children() const; -- cgit v1.2.1