From 86c1dab2863f228e92ce7e0bd23ffb17cda0242b Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 16 Sep 2010 21:16:20 -0400 Subject: Fixed many bugs and crashes --- modules/protocol/unreal32.cpp | 52 ++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 25 deletions(-) (limited to 'modules/protocol') diff --git a/modules/protocol/unreal32.cpp b/modules/protocol/unreal32.cpp index 892c4fc57..81bd74aaa 100644 --- a/modules/protocol/unreal32.cpp +++ b/modules/protocol/unreal32.cpp @@ -1191,34 +1191,36 @@ bool ChannelModeFlood::IsValid(const Anope::string &value) const { if (value.empty()) return false; - Anope::string rest; - if (value[0] != ':' && convertTo(value[0] == '*' ? value.substr(1) : value, rest, false) > 0 && rest[0] == ':' && rest.length() > 1 && convertTo(rest.substr(1), rest, false) > 0 && rest.empty()) - return true; - else + try { - /* '['<1 letter>[optional: '#'+1 letter],[next..]']'':' */ - size_t end_bracket = value.find(']', 1); - if (end_bracket == Anope::string::npos) - return false; - Anope::string xbuf = value.substr(0, end_bracket); - if (value[end_bracket + 1] != ':') + Anope::string rest; + if (value[0] != ':' && convertTo(value[0] == '*' ? value.substr(1) : value, rest, false) > 0 && rest[0] == ':' && rest.length() > 1 && convertTo(rest.substr(1), rest, false) > 0 && rest.empty()) + return true; + } + catch (const CoreException &) { } // convertTo fail + + /* '['<1 letter>[optional: '#'+1 letter],[next..]']'':' */ + size_t end_bracket = value.find(']', 1); + if (end_bracket == Anope::string::npos) + return false; + Anope::string xbuf = value.substr(0, end_bracket); + if (value[end_bracket + 1] != ':') + return false; + commasepstream args(xbuf.substr(1)); + Anope::string arg; + while (args.GetToken(arg)) + { + /* <1 letter>[optional: '#'+1 letter] */ + size_t p = 0; + while (p < arg.length() && isdigit(arg[p])) + ++p; + if (p == arg.length() || !(arg[p] == 'c' || arg[p] == 'j' || arg[p] == 'k' || arg[p] == 'm' || arg[p] == 'n' || arg[p] == 't')) + continue; /* continue instead of break for forward compatability. */ + int v = arg.substr(0, p).is_number_only() ? convertTo(arg.substr(0, p)) : 0; + if (v < 1 || v > 999) return false; - commasepstream args(xbuf.substr(1)); - Anope::string arg; - while (args.GetToken(arg)) - { - /* <1 letter>[optional: '#'+1 letter] */ - size_t p = 0; - while (p < arg.length() && isdigit(arg[p])) - ++p; - if (p == arg.length() || !(arg[p] == 'c' || arg[p] == 'j' || arg[p] == 'k' || arg[p] == 'm' || arg[p] == 'n' || arg[p] == 't')) - continue; /* continue instead of break for forward compatability. */ - int v = arg.substr(0, p).is_number_only() ? convertTo(arg.substr(0, p)) : 0; - if (v < 1 || v > 999) - return false; - } - return true; } + return true; } static void AddModes() -- cgit