[icinga-checkins] icinga.org: icinga2/master: Do not escape backslashes and separators twice

git at icinga.org git at icinga.org
Wed Aug 17 06:08:50 CEST 2016


Module: icinga2
Branch: master
Commit: 4e3da7e3aba59f1ba1aee96c45453141e2e51129
URL:    https://git.icinga.org/?p=icinga2.git;a=commit;h=4e3da7e3aba59f1ba1aee96c45453141e2e51129

Author: Rune Darrud <theflyingcorpse at gmail.com>
Date:   Tue Aug 16 22:16:37 2016 +0200

Do not escape backslashes and separators twice

fixes #12227

Signed-off-by: Gunnar Beutner <gunnar.beutner at netways.de>

---

 lib/base/utility.cpp            |   23 +++++++++++++----------
 lib/base/utility.hpp            |    2 +-
 lib/perfdata/influxdbwriter.cpp |    4 +++-
 3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp
index b341b0b..29c98e1 100644
--- a/lib/base/utility.cpp
+++ b/lib/base/utility.cpp
@@ -939,7 +939,7 @@ String Utility::NaturalJoin(const std::vector<String>& tokens)
 	return result;
 }
 
-String Utility::Join(const Array::Ptr& tokens, char separator)
+String Utility::Join(const Array::Ptr& tokens, char separator, bool escapeSeparator)
 {
 	String result;
 	bool first = true;
@@ -947,15 +947,18 @@ String Utility::Join(const Array::Ptr& tokens, char separator)
 	ObjectLock olock(tokens);
 	BOOST_FOREACH(const Value& vtoken, tokens) {
 		String token = Convert::ToString(vtoken);
-		boost::algorithm::replace_all(token, "\\", "\\\\");
-
-		char sep_before[2], sep_after[3];
-		sep_before[0] = separator;
-		sep_before[1] = '\0';
-		sep_after[0] = '\\';
-		sep_after[1] = separator;
-		sep_after[2] = '\0';
-		boost::algorithm::replace_all(token, sep_before, sep_after);
+
+		if (escapeSeparator) {
+			boost::algorithm::replace_all(token, "\\", "\\\\");
+
+			char sep_before[2], sep_after[3];
+			sep_before[0] = separator;
+			sep_before[1] = '\0';
+			sep_after[0] = '\\';
+			sep_after[1] = separator;
+			sep_after[2] = '\0';
+			boost::algorithm::replace_all(token, sep_before, sep_after);
+		}
 
 		if (first)
 			first = false;
diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp
index 3d3ae31..3688529 100644
--- a/lib/base/utility.hpp
+++ b/lib/base/utility.hpp
@@ -89,7 +89,7 @@ public:
 	static void QueueAsyncCallback(const boost::function<void (void)>& callback, SchedulerPolicy policy = DefaultScheduler);
 
 	static String NaturalJoin(const std::vector<String>& tokens);
-	static String Join(const Array::Ptr& tokens, char separator);
+	static String Join(const Array::Ptr& tokens, char separator, bool escapeSeparator = true);
 
 	static String FormatDuration(double duration);
 	static String FormatDateTime(const char *format, double ts);
diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp
index 6eb8d00..239db89 100644
--- a/lib/perfdata/influxdbwriter.cpp
+++ b/lib/perfdata/influxdbwriter.cpp
@@ -235,6 +235,8 @@ String InfluxdbWriter::EscapeKey(const String& str)
 {
 	// Iterate over the key name and escape commas and spaces with a backslash
 	String result = str;
+	boost::algorithm::replace_all(result, "\"", "\\\"");
+	boost::algorithm::replace_all(result, "=", "\\=");
 	boost::algorithm::replace_all(result, ",", "\\,");
 	boost::algorithm::replace_all(result, " ", "\\ ");
 
@@ -366,7 +368,7 @@ void InfluxdbWriter::Flush(void)
 
 	// Ensure you hold a lock against m_DataBuffer so that things
 	// don't go missing after creating the body and clearing the buffer
-	String body = Utility::Join(m_DataBuffer, '\n');
+	String body = Utility::Join(m_DataBuffer, '\n', false);
 	m_DataBuffer->Clear();
 
 	HttpRequest req(stream);



More information about the icinga-checkins mailing list