diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-03-02 12:52:45 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-03-02 12:52:45 +0000 |
commit | 5bacd1de02febe004182e845d1179ac0cc631ea9 (patch) | |
tree | d343480afba1ac2685e479f6f73e23e12c177907 /src/modules/m_spanningtree.cpp | |
parent | 4c6fb8032bf8a6310080069cc65c975087d93a76 (diff) |
Experimental improvements to TreeSocket::Split
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@3418 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/m_spanningtree.cpp')
-rw-r--r-- | src/modules/m_spanningtree.cpp | 23 |
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); } |