From ed217daec5d498b79c9503269d3529c9948378b4 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 18 Jan 2012 13:54:24 +0200 Subject: Escape equal sign in plugin option values --- odb/odb.cxx | 8 ++++++++ odb/plugin.cxx | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/odb/odb.cxx b/odb/odb.cxx index e55328d..c3b8e58 100644 --- a/odb/odb.cxx +++ b/odb/odb.cxx @@ -800,6 +800,14 @@ encode_plugin_option (string const& k, string const& cv) if (!v.empty ()) { o += '='; + + // A value cannot contain '='. Encode it as the backspace + // character. + // + for (size_t i (0); i < v.size (); ++i) + if (v[i] == '=') + v[i] = '\b'; + o += v; } diff --git a/odb/plugin.cxx b/odb/plugin.cxx index dd813d8..a93fd14 100644 --- a/odb/plugin.cxx +++ b/odb/plugin.cxx @@ -194,17 +194,25 @@ plugin_init (plugin_name_args* plugin_info, plugin_gcc_version*) { plugin_argument& a (plugin_info->argv[i]); + // A value cannot contain '=' so it is passed as the backspace + // character. + // + string v (a.value != 0 ? a.value : ""); + for (size_t i (0); i < v.size (); ++i) + if (v[i] == '\b') + v[i] = '='; + // Handle service options. // if (strcmp (a.key, "svc-path") == 0) { - profile_paths_.push_back (path (a.value)); + profile_paths_.push_back (path (v)); continue; } if (strcmp (a.key, "svc-file") == 0) { - file_ = path (a.value); + file_ = path (v); continue; } @@ -214,9 +222,9 @@ plugin_init (plugin_name_args* plugin_info, plugin_gcc_version*) argv_str.push_back (opt); argv.push_back (const_cast (argv_str.back ().c_str ())); - if (a.value != 0) + if (!v.empty ()) { - argv_str.push_back (a.value); + argv_str.push_back (v); argv.push_back (const_cast (argv_str.back ().c_str ())); } } -- cgit v1.1