]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
misc: Prevent an unnecessary copy in cleanSlashes() reported by Coverity
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 20 Nov 2023 11:10:31 +0000 (12:10 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 20 Nov 2023 13:04:07 +0000 (14:04 +0100)
pdns/misc.cc
pdns/test-misc_hh.cc

index b6ce1417406ce8c786449733161c27f1e250077b..3e9fa6b68a05e8facd3b08c7e58df9085511633d 100644 (file)
@@ -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()) {
index ec2f478f1fd94df801189e95869a86ba7c4a57e5..6e5662b19e384c5f2bf91cdf9925960892cc6406 100644 (file)
@@ -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()