diff options
author | Jack Grigg <jack@z.cash> | 2017-03-26 00:35:13 +1300 |
---|---|---|
committer | Jack Grigg <jack@z.cash> | 2017-05-16 18:22:16 +1200 |
commit | d63677bbb23a05feca7935c70673439705b06dca (patch) | |
tree | e08db216b94711b65a494f178dc792c7bc69c3ed /src/torcontrol.cpp | |
parent | 29f3c200780bcb669f31932ce484aee2e5a51a02 (diff) |
torcontrol: Fix ParseTorReplyMapping
- Ignore remaining input if it is an OptArguments
- Correctly handle escapes
Diffstat (limited to 'src/torcontrol.cpp')
-rw-r--r-- | src/torcontrol.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index 2e15c9e732..0d787d16e6 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -277,17 +277,19 @@ static std::map<std::string,std::string> ParseTorReplyMapping(const std::string size_t ptr=0; while (ptr < s.size()) { std::string key, value; - while (ptr < s.size() && s[ptr] != '=') { + while (ptr < s.size() && s[ptr] != '=' && s[ptr] != ' ') { key.push_back(s[ptr]); ++ptr; } if (ptr == s.size()) // unexpected end of line return std::map<std::string,std::string>(); + if (s[ptr] == ' ') // The remaining string is an OptArguments + break; ++ptr; // skip '=' if (ptr < s.size() && s[ptr] == '"') { // Quoted string ++ptr; // skip opening '"' bool escape_next = false; - while (ptr < s.size() && (!escape_next && s[ptr] != '"')) { + while (ptr < s.size() && (escape_next || s[ptr] != '"')) { escape_next = (s[ptr] == '\\'); value.push_back(s[ptr]); ++ptr; |