diff options
author | Max Kellermann <max@musicpd.org> | 2020-11-04 16:22:40 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2020-11-04 16:34:38 +0100 |
commit | b0002e3b73e2d09a9eb0d815f86342dc96918ef5 (patch) | |
tree | ddef49e17fbecf26c4fde14595bdd435f1afec8f /src | |
parent | 27c589da975a4448960feb99a3b9774c116dc066 (diff) |
filter/chain: copy the child name
filter_chain_parse() passes a temporary string pointer which results
in a use-after-free in the PreparedChainFilter::Child::Open() error
message.
Diffstat (limited to 'src')
-rw-r--r-- | src/filter/plugins/ChainFilterPlugin.cxx | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/filter/plugins/ChainFilterPlugin.cxx b/src/filter/plugins/ChainFilterPlugin.cxx index 878a4f2cb..604a8344d 100644 --- a/src/filter/plugins/ChainFilterPlugin.cxx +++ b/src/filter/plugins/ChainFilterPlugin.cxx @@ -28,6 +28,7 @@ #include <cassert> #include <list> #include <memory> +#include <string> class ChainFilter final : public Filter { struct Child { @@ -72,7 +73,7 @@ private: class PreparedChainFilter final : public PreparedFilter { struct Child { - const char *name; + const std::string name; std::unique_ptr<PreparedFilter> filter; Child(const char *_name, @@ -105,7 +106,7 @@ PreparedChainFilter::Child::Open(const AudioFormat &prev_audio_format) if (conv_audio_format != prev_audio_format) throw FormatRuntimeError("Audio format not supported by filter '%s': %s", - name, + name.c_str(), ToString(prev_audio_format).c_str()); return new_filter; |