]> jfr.im git - irc/rizon/znc.git/commitdiff
Fix CString::Escape_n() and add some tests for it
authorUli Schlachter <redacted>
Fri, 5 Aug 2011 14:05:05 +0000 (16:05 +0200)
committerUli Schlachter <redacted>
Fri, 5 Aug 2011 14:09:22 +0000 (16:09 +0200)
This bug was originally reported by someone on irc, but sadly I forgot who it
was. Sorry!

Signed-off-by: Uli Schlachter <redacted>
.gitignore
ZNCString.cpp
test/EscapeTest.cpp [new file with mode: 0644]
test/Makefile.in

index 4b760b40aa8869d9d9a9d0d1f54f7ef7320632ab..590d8d19c812e4159c8c9d07eec8c7037e65aa83 100644 (file)
@@ -31,6 +31,7 @@ Makefile
 /modules/*.pyc
 
 /test/ConfigTest
+/test/EscapeTest
 
 # Compiled Object files
 *.o
index d8e0e9fa821d746d36f9aa8b7f09c683af51ccdf..a9d9eb2434c5b573372f54eec1e82b54397b40ef 100644 (file)
@@ -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) {
diff --git a/test/EscapeTest.cpp b/test/EscapeTest.cpp
new file mode 100644 (file)
index 0000000..dc06aba
--- /dev/null
@@ -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;
+}
index efa1cf7fbe31659befb1d609f55351d423041df4..89a19f4db61e553a42ced75b5adf8642d597e4b0 100644 (file)
@@ -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