diff --git a/src/alert.cpp b/src/alert.cpp index d7668453d..65734a4f1 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -114,10 +114,28 @@ bool CAlert::Cancels(const CAlert& alert) const bool CAlert::AppliesTo(int nVersion, const std::string& strSubVerIn) const { + // Get a subversion without comments + std::string strSubVer = ""; + auto start = 0; + auto end = 0; + while (start < strSubVerIn.length() && end < strSubVerIn.length()) { + end = strSubVerIn.find('(', start); + if (end == std::string::npos) { + // Ensure we get the section of strSubVerIn after the final comment + end = strSubVerIn.length(); + } + strSubVer.append(strSubVerIn.substr(start, end - start)); + start = strSubVerIn.find(')', end); + if (start != std::string::npos) { + // Finish with start pointing at the next character we want + start += 1; + } + } + // Check against both the commented and uncommented subversion // TODO: rework for client-version-embedded-in-strSubVer ? return (IsInEffect() && nMinVer <= nVersion && nVersion <= nMaxVer && - (setSubVer.empty() || setSubVer.count(strSubVerIn))); + (setSubVer.empty() || setSubVer.count(strSubVerIn) || setSubVer.count(strSubVer))); } bool CAlert::AppliesToMe() const diff --git a/src/test/alert_tests.cpp b/src/test/alert_tests.cpp index d32c35411..1362917a9 100644 --- a/src/test/alert_tests.cpp +++ b/src/test/alert_tests.cpp @@ -311,9 +311,12 @@ BOOST_AUTO_TEST_CASE(AlertApplies) BOOST_CHECK(alerts[2].AppliesTo(1, "/MagicBean:0.1.0/")); BOOST_CHECK(alerts[2].AppliesTo(1, "/MagicBean:0.2.0/")); + BOOST_CHECK(alerts[2].AppliesTo(1, "/MagicBean:0.2.0(foo)/")); + BOOST_CHECK(alerts[2].AppliesTo(1, "/MagicBean:0.2.0(bar)/")); BOOST_CHECK(alerts[3].AppliesTo(1, "/MagicBean:0.1.0/")); BOOST_CHECK(alerts[3].AppliesTo(1, "/MagicBean:0.2.0/")); + BOOST_CHECK(alerts[2].AppliesTo(1, "/MagicBean:0.2.0(foo)/")); BOOST_CHECK(alerts[3].AppliesTo(1, "/MagicBean:0.2.1(foo)/")); BOOST_CHECK(alerts[4].AppliesTo(1, "/MagicBean:0.1.0/")); @@ -335,7 +338,6 @@ BOOST_AUTO_TEST_CASE(AlertApplies) BOOST_CHECK(!alerts[1].AppliesTo(1, "/MagicBean:0.2.0/")); // SubVer with comment doesn't match SubVer pattern without - BOOST_CHECK(!alerts[2].AppliesTo(1, "/MagicBean:0.2.0(foo)/")); BOOST_CHECK(!alerts[2].AppliesTo(1, "/MagicBean:0.2.1/")); BOOST_CHECK(!alerts[2].AppliesTo(1, "/MagicBean:0.3.0/"));