From 8ed97dd9cc8ba49c9987a4a632e82f4b6141c9d3 Mon Sep 17 00:00:00 2001 From: Alfredo Garcia Date: Mon, 13 Apr 2020 11:20:33 -0300 Subject: [PATCH 1/2] Add a new safe chars rule for node version string --- src/main.cpp | 2 +- src/utilstrencodings.cpp | 4 +++- src/utilstrencodings.h | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 50e650c55..2341752e9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5427,7 +5427,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, vRecv >> addrFrom >> nNonce; if (!vRecv.empty()) { vRecv >> LIMITED_STRING(pfrom->strSubVer, MAX_SUBVERSION_LENGTH); - pfrom->cleanSubVer = SanitizeString(pfrom->strSubVer); + pfrom->cleanSubVer = SanitizeString(pfrom->strSubVer, SAFE_CHARS_SUBVERSION); } if (!vRecv.empty()) vRecv >> pfrom->nStartingHeight; diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp index c3a25ca62..1abbde4ad 100644 --- a/src/utilstrencodings.cpp +++ b/src/utilstrencodings.cpp @@ -20,7 +20,9 @@ static const string CHARS_ALPHA_NUM = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO static const string SAFE_CHARS[] = { CHARS_ALPHA_NUM + " .,;_/:?@()", // SAFE_CHARS_DEFAULT - CHARS_ALPHA_NUM + " .,;_?@" // SAFE_CHARS_UA_COMMENT + CHARS_ALPHA_NUM + " .,;_?@", // SAFE_CHARS_UA_COMMENT + CHARS_ALPHA_NUM + " .-/:" // SAFE_CHARS_SUBVERSION + }; string SanitizeString(const string& str, int rule) diff --git a/src/utilstrencodings.h b/src/utilstrencodings.h index ce2ca034e..2fb847349 100644 --- a/src/utilstrencodings.h +++ b/src/utilstrencodings.h @@ -26,7 +26,8 @@ enum SafeChars { SAFE_CHARS_DEFAULT, //!< The full set of allowed chars - SAFE_CHARS_UA_COMMENT //!< BIP-0014 subset + SAFE_CHARS_UA_COMMENT, //!< BIP-0014 subset + SAFE_CHARS_SUBVERSION //!< Peer subversion string subset }; std::string SanitizeFilename(const std::string& str); From 766e0b8f09c27e0a55f46581df0d8a61c51aa29c Mon Sep 17 00:00:00 2001 From: Alfredo Garcia Date: Sun, 19 Apr 2020 09:52:38 -0300 Subject: [PATCH 2/2] add a test case --- src/test/util_tests.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp index a42a0631d..c7ccc54b6 100644 --- a/src/test/util_tests.cpp +++ b/src/test/util_tests.cpp @@ -420,6 +420,11 @@ BOOST_AUTO_TEST_CASE(test_FormatSubVersion) BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99950, comments), std::string("/Test:0.9.99(comment1)/")); BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99900, comments2), std::string("/Test:0.9.99-beta1(comment1; Comment2; .,_?@; )/")); BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99950, comments2), std::string("/Test:0.9.99(comment1; Comment2; .,_?@; )/")); + + // bug https://github.com/zcash/zcash/issues/4375 + BOOST_CHECK_EQUAL(SanitizeString(std::string("MagicBean:2.1.1-1")), "MagicBean:2.1.11"); + // fixed by adding new rule https://github.com/zcash/zcash/pull/4444 + BOOST_CHECK_EQUAL(SanitizeString(std::string("MagicBean:2.1.1-1"), SAFE_CHARS_SUBVERSION), "MagicBean:2.1.1-1"); } BOOST_AUTO_TEST_CASE(test_ParseFixedPoint)