From: Remi Gacogne Date: Mon, 20 Nov 2023 11:10:31 +0000 (+0100) Subject: misc: Prevent an unnecessary copy in cleanSlashes() reported by Coverity X-Git-Tag: rec-5.0.0-rc1~28^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b289a3bb12c09fbfe7f8b5aed9039fd0ab05aa60;p=thirdparty%2Fpdns.git misc: Prevent an unnecessary copy in cleanSlashes() reported by Coverity --- diff --git a/pdns/misc.cc b/pdns/misc.cc index b6ce141740..3e9fa6b68a 100644 --- a/pdns/misc.cc +++ b/pdns/misc.cc @@ -582,17 +582,25 @@ string bitFlip(const string &str) void cleanSlashes(string &str) { - string::const_iterator i; string out; - for(i=str.begin();i!=str.end();++i) { - if(*i=='/' && i!=str.begin() && *(i-1)=='/') - continue; - out.append(1,*i); + bool keepNextSlash = true; + for (const auto& value : str) { + if (value == '/') { + if (keepNextSlash) { + keepNextSlash = false; + } + else { + continue; + } + } + else { + keepNextSlash = true; + } + out.append(1, value); } - str=out; + str = std::move(out); } - bool IpToU32(const string &str, uint32_t *ip) { if(str.empty()) { diff --git a/pdns/test-misc_hh.cc b/pdns/test-misc_hh.cc index ec2f478f1f..6e5662b19e 100644 --- a/pdns/test-misc_hh.cc +++ b/pdns/test-misc_hh.cc @@ -397,4 +397,20 @@ BOOST_AUTO_TEST_CASE(test_makeHexDump) { BOOST_CHECK_EQUAL(out, "12 34 56 78 90 ab cd ef "); } +BOOST_AUTO_TEST_CASE(test_CleanSlashes) { + auto cleanSlashesWrapper = [](const char* str) { + std::string fullStr(str); + cleanSlashes(fullStr); + return fullStr; + }; + BOOST_CHECK_EQUAL(cleanSlashesWrapper("/test"), "/test"); + BOOST_CHECK_EQUAL(cleanSlashesWrapper("//test"), "/test"); + BOOST_CHECK_EQUAL(cleanSlashesWrapper("///test"), "/test"); + BOOST_CHECK_EQUAL(cleanSlashesWrapper("/test/"), "/test/"); + BOOST_CHECK_EQUAL(cleanSlashesWrapper("//test/"), "/test/"); + BOOST_CHECK_EQUAL(cleanSlashesWrapper("//test//"), "/test/"); + BOOST_CHECK_EQUAL(cleanSlashesWrapper("///test//"), "/test/"); + BOOST_CHECK_EQUAL(cleanSlashesWrapper("test///"), "test/"); +} + BOOST_AUTO_TEST_SUITE_END()