Merge bitcoin/bitcoin#23538: Remove strtol in torcontrol

fa186eb7f45a9d420503f96ff3a5f753afb75dec Remove strtol in torcontrol (MarcoFalke)

Pull request description:

  The sequence of octal chars is fully validated before calling `strtol`, so it can be replaced by a simple loop. This removes the last "locale depended" `strtol` call. Also, removes some unused includes.

ACKs for top commit:
  laanwj:
    Code review and tested ACK fa186eb7f45a9d420503f96ff3a5f753afb75dec

Tree-SHA512: aafa4c68046e5ec48824c4f2c18e4920e5fe1d1fa03a8a297b2f40d0a1967cd0dad3554352519073a1620714e958ed5133cbc6b70bedcc508a423551d829f80e
This commit is contained in:
W. J. van der Laan 2021-11-25 11:39:44 +01:00
commit 791dd1f41e
No known key found for this signature in database
GPG Key ID: 1E4AED62986CD25D
2 changed files with 11 additions and 10 deletions

View File

@ -22,19 +22,17 @@
#include <deque> #include <deque>
#include <functional> #include <functional>
#include <set> #include <set>
#include <stdlib.h>
#include <vector> #include <vector>
#include <boost/signals2/signal.hpp>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include <boost/algorithm/string/split.hpp>
#include <event2/bufferevent.h>
#include <event2/buffer.h> #include <event2/buffer.h>
#include <event2/util.h> #include <event2/bufferevent.h>
#include <event2/event.h> #include <event2/event.h>
#include <event2/thread.h> #include <event2/thread.h>
#include <event2/util.h>
/** Default control port */ /** Default control port */
const std::string DEFAULT_TOR_CONTROL = "127.0.0.1:9051"; const std::string DEFAULT_TOR_CONTROL = "127.0.0.1:9051";
@ -277,9 +275,15 @@ std::map<std::string,std::string> ParseTorReplyMapping(const std::string &s)
if (j == 3 && value[i] > '3') { if (j == 3 && value[i] > '3') {
j--; j--;
} }
escaped_value.push_back(strtol(value.substr(i, j).c_str(), nullptr, 8)); const auto end{i + j};
uint8_t val{0};
while (i < end) {
val *= 8;
val += value[i++] - '0';
}
escaped_value.push_back(char(val));
// Account for automatic incrementing at loop end // Account for automatic incrementing at loop end
i += j - 1; --i;
} else { } else {
escaped_value.push_back(value[i]); escaped_value.push_back(value[i]);
} }

View File

@ -37,15 +37,12 @@ export LC_ALL=C
# See https://doc.qt.io/qt-5/qcoreapplication.html#locale-settings and # See https://doc.qt.io/qt-5/qcoreapplication.html#locale-settings and
# https://stackoverflow.com/a/34878283 for more details. # https://stackoverflow.com/a/34878283 for more details.
# TODO: Reduce KNOWN_VIOLATIONS by replacing uses of locale dependent stoul/strtol with locale
# independent ToIntegral<T>(...) or the ParseInt*() functions.
# TODO: Reduce KNOWN_VIOLATIONS by replacing uses of locale dependent snprintf with strprintf. # TODO: Reduce KNOWN_VIOLATIONS by replacing uses of locale dependent snprintf with strprintf.
KNOWN_VIOLATIONS=( KNOWN_VIOLATIONS=(
"src/dbwrapper.cpp:.*vsnprintf" "src/dbwrapper.cpp:.*vsnprintf"
"src/test/dbwrapper_tests.cpp:.*snprintf" "src/test/dbwrapper_tests.cpp:.*snprintf"
"src/test/fuzz/locale.cpp" "src/test/fuzz/locale.cpp"
"src/test/fuzz/string.cpp" "src/test/fuzz/string.cpp"
"src/torcontrol.cpp:.*strtol"
) )
REGEXP_IGNORE_EXTERNAL_DEPENDENCIES="^src/(crypto/ctaes/|leveldb/|secp256k1/|minisketch/|tinyformat.h|univalue/)" REGEXP_IGNORE_EXTERNAL_DEPENDENCIES="^src/(crypto/ctaes/|leveldb/|secp256k1/|minisketch/|tinyformat.h|univalue/)"