From 8df5fd1116b93c08614c05790d5c3d905ed64b82 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 21 Apr 2017 13:22:51 +1200 Subject: [PATCH] Correctly handle three-digit octals with leading digit 4-7 --- src/test/torcontrol_tests.cpp | 2 +- src/torcontrol.cpp | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/test/torcontrol_tests.cpp b/src/test/torcontrol_tests.cpp index 2a4457721..5624c818c 100644 --- a/src/test/torcontrol_tests.cpp +++ b/src/test/torcontrol_tests.cpp @@ -147,7 +147,7 @@ BOOST_AUTO_TEST_CASE(util_ParseTorReplyMapping) "Foo=\"Bar\\nBaz\\t\" Spam=\"\\rEggs\" Octals=\"\\1a\\11\\17\\18\\81\\377\\378\\400\" Final=Check", { {"Foo", "Bar\nBaz\t"}, {"Spam", "\rEggs"}, - {"Octals", "\1a\11\17\1" "881\377\37" "8400"}, + {"Octals", "\1a\11\17\1" "881\377\37" "8\40" "0"}, {"Final", "Check"}, }); CheckParseTorReplyMapping( diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index 446d4402a..a5cd1b7c6 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -329,13 +329,14 @@ static std::map ParseTorReplyMapping(const std::string // octal digit if encountered sooner. for (j = 1; j < 3 && (i+j) < value.size() && '0' <= value[i+j] && value[i+j] <= '7'; ++j) {} // Tor restricts first digit to 0-3 for three-digit octals. - if (j < 3 || ('0' <= value[i] && value[i] <= '3')) { - escaped_value.push_back(strtol(value.substr(i, j).c_str(), NULL, 8)); - // Account for automatic incrementing at loop end - i += j - 1; - } else { - escaped_value.push_back(value[i]); + // A leading digit of 4-7 would therefore be interpreted as + // a two-digit octal. + if (j == 3 && value[i] > '3') { + j--; } + escaped_value.push_back(strtol(value.substr(i, j).c_str(), NULL, 8)); + // Account for automatic incrementing at loop end + i += j - 1; } else { escaped_value.push_back(value[i]); }