Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fix CString::Escape_n() and add some tests for it

This bug was originally reported by someone on irc, but sadly I forgot who it
was. Sorry!

Signed-off-by: Uli Schlachter <psychon@znc.in>
  • Loading branch information...
commit da0ba75549dd4292bf1fcb0dfc67dd6c3360a309 1 parent cb6798d
@psychon psychon authored
View
1  .gitignore
@@ -31,6 +31,7 @@ Makefile
/modules/*.pyc
/test/ConfigTest
+/test/EscapeTest
# Compiled Object files
*.o
View
8 ZNCString.cpp
@@ -212,10 +212,10 @@ CString CString::Escape_n(EEscape eFrom, EEscape eTo) const {
}
if (ch == 0) {
- if (!strncasecmp((const char*) &pTmp, "lt", 2)) ch = '<';
- else if (!strncasecmp((const char*) &pTmp, "gt", 2)) ch = '>';
- else if (!strncasecmp((const char*) &pTmp, "quot", 4)) ch = '"';
- else if (!strncasecmp((const char*) &pTmp, "amp", 3)) ch = '&';
+ if (!strncasecmp((const char*) &pTmp, "&lt;", 2)) ch = '<';
+ else if (!strncasecmp((const char*) &pTmp, "&gt;", 2)) ch = '>';
+ else if (!strncasecmp((const char*) &pTmp, "&quot;", 4)) ch = '"';
+ else if (!strncasecmp((const char*) &pTmp, "&amp;", 3)) ch = '&';
}
if (ch > 0) {
View
55 test/EscapeTest.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2004-2011 See the AUTHORS file for details.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ZNCString.h"
+#include "ZNCDebug.h"
+
+static int testEqual(const CString& a, const CString& b, const CString& what)
+{
+ if (a == b)
+ return 0;
+ std::cout << what << " failed for '" << b << "', result is '" << a << "'\n";
+ return 1;
+}
+
+static int testString(const CString& in, const CString& url,
+ const CString& html, const CString& sql) {
+ CString out;
+ int errors = 0;
+
+ // Encode, then decode again and check we still got the same string
+
+ out = in.Escape_n(CString::EASCII, CString::EURL);
+ errors += testEqual(out, url, "EURL encode");
+ out = out.Escape_n(CString::EURL, CString::EASCII);
+ errors += testEqual(out, in, "EURL decode");
+
+ out = in.Escape_n(CString::EASCII, CString::EHTML);
+ errors += testEqual(out, html, "EHTML encode");
+ out = out.Escape_n(CString::EHTML, CString::EASCII);
+ errors += testEqual(out, in, "EHTML decode");
+
+ out = in.Escape_n(CString::EASCII, CString::ESQL);
+ errors += testEqual(out, sql, "ESQL encode");
+ out = out.Escape_n(CString::ESQL, CString::EASCII);
+ errors += testEqual(out, in, "ESQL decode");
+
+ return errors;
+}
+
+int main() {
+ unsigned int failed = 0;
+
+ // input url html sql
+ failed += testString("abcdefg", "abcdefg", "abcdefg", "abcdefg");
+ failed += testString("\n\t\r", "%0A%09%0D", "\n\t\r", "\\n\\t\\r");
+ failed += testString("'\"", "%27%22", "'&quot;", "\\'\\\"");
+ failed += testString("&<>", "%26%3C%3E", "&amp;&lt;&gt;", "&<>");
+
+ return failed;
+}
View
8 test/Makefile.in
@@ -9,7 +9,7 @@ CXXFLAGS := @DEFS@ @CPPFLAGS@ @CXXFLAGS@ -I..
LDFLAGS := @LDFLAGS@
LIBS := @LIBS@
-TARGETS := ConfigTest
+TARGETS := ConfigTest EscapeTest
OBJS := $(addsuffix .o, $(TARGETS))
ZNC_OBJS := Config.o ZNCDebug.o FileUtils.o Utils.o ZNCString.o MD5.o SHA256.o
ZNC_OBJS := $(addprefix ../, $(ZNC_OBJS))
@@ -35,6 +35,10 @@ ConfigTest: ConfigTest.o
$(E) Linking $@...
$(Q)$(CXX) $(LDFLAGS) -o $@ $< $(ZNC_OBJS) $(LIBS)
+EscapeTest: EscapeTest.o
+ $(E) Linking $@...
+ $(Q)$(CXX) $(LDFLAGS) -o $@ $< $(ZNC_OBJS) $(LIBS)
+
%.o: %.cpp Makefile
@mkdir -p .depend
$(E) Building $@...
@@ -42,5 +46,5 @@ ConfigTest: ConfigTest.o
test: $(TARGETS)
for test in $(TARGETS) ; do \
- $$test || exit 1 ; \
+ ./$$test || exit 1 ; \
done
Please sign in to comment.
Something went wrong with that request. Please try again.