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>
This commit is contained in:
Uli Schlachter
2011-08-05 16:05:05 +02:00
parent cb6798d36f
commit da0ba75549
4 changed files with 66 additions and 6 deletions
+1
View File
@@ -31,6 +31,7 @@ Makefile
/modules/*.pyc
/test/ConfigTest
/test/EscapeTest
# Compiled Object files
*.o
+4 -4
View 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) {
+55
View File
@@ -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;
}
+6 -2
View 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