summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-03-02 12:52:45 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-03-02 12:52:45 +0000
commit5bacd1de02febe004182e845d1179ac0cc631ea9 (patch)
treed343480afba1ac2685e479f6f73e23e12c177907
parent4c6fb8032bf8a6310080069cc65c975087d93a76 (diff)
Experimental improvements to TreeSocket::Split
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@3418 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/modules/m_spanningtree.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp
index f927ac044..ce3d00b8c 100644
--- a/src/modules/m_spanningtree.cpp
+++ b/src/modules/m_spanningtree.cpp
@@ -2072,13 +2072,18 @@ class TreeSocket : public InspSocket
void Split(std::string line, bool stripcolon, std::deque<std::string> &n)
{
+ // we don't do anything with a line > 2048
+ if (line.length() > 2048)
+ return;
if (!strchr(line.c_str(),' '))
{
n.push_back(line);
return;
}
std::stringstream s(line);
- std::string param = "";
+ int count = 0;
+ char param[1024];
+ char* pptr = param;
n.clear();
int item = 0;
@@ -2089,32 +2094,34 @@ class TreeSocket : public InspSocket
if (c == ' ')
{
n.push_back(param);
- param = "";
+ *param = count = 0;
item++;
}
else
{
if (!s.eof())
{
- param = param + c;
+ *pptr++ = c;
+ count++;
}
- if ((param == ":") && (item > 0))
+ if ((*param == ':') && (count == 1) && (item > 0))
{
- param = "";
+ *param = 0;
while (!s.eof())
{
s.get(c);
if (!s.eof())
{
- param = param + c;
+ *pptr++ = c;
+ count++;
}
}
n.push_back(param);
- param = "";
+ *param = count = 0;
}
}
}
- if (param != "")
+ if (*param)
{
n.push_back(param);
}