From 0f7cfd46ef2d277f5f82e34a2852c75212d75261 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Wed, 12 Dec 2018 20:34:46 +0000 Subject: [PATCH] Fix conversion issues by replacing ConvToInt with ConvToNum. The former was a thin wrapper around atol and brought with it all of the weird parsing logic of atol which is almost never what is actually wanted. It also almost never returned the numeric type which is actually wanted which can cause weird issues when casting. --- include/convto.h | 11 +---------- src/base.cpp | 2 +- src/channels.cpp | 2 +- src/coremods/core_channel/cmd_invite.cpp | 4 ++-- src/coremods/core_channel/invite.cpp | 2 +- src/modules/m_callerid.cpp | 2 +- src/modules/m_chanhistory.cpp | 2 +- src/modules/m_delaymsg.cpp | 6 +++--- src/modules/m_filter.cpp | 2 +- src/modules/m_joinflood.cpp | 4 ++-- src/modules/m_jumpserver.cpp | 4 ++-- src/modules/m_kicknorejoin.cpp | 4 ++-- src/modules/m_messageflood.cpp | 4 ++-- src/modules/m_nickflood.cpp | 4 ++-- src/modules/m_pbkdf2.cpp | 2 +- src/modules/m_repeat.cpp | 6 +++--- src/modules/m_spanningtree/addline.cpp | 4 ++-- src/modules/m_spanningtree/away.cpp | 2 +- src/modules/m_spanningtree/capab.cpp | 2 +- src/modules/m_spanningtree/compat.cpp | 2 +- src/modules/m_spanningtree/main.h | 4 ++-- src/modules/m_spanningtree/num.cpp | 2 +- src/modules/m_spanningtree/servercommand.cpp | 2 +- src/modules/m_spanningtree/svsnick.cpp | 4 ++-- src/modules/m_spanningtree/treesocket.h | 2 +- src/modules/m_spanningtree/treesocket2.cpp | 2 +- src/modules/m_topiclock.cpp | 2 +- src/socket.cpp | 2 +- 28 files changed, 41 insertions(+), 50 deletions(-) diff --git a/include/convto.h b/include/convto.h index c306283fc..3332580ed 100644 --- a/include/convto.h +++ b/include/convto.h @@ -89,17 +89,8 @@ template inline std::string ConvToStr(const T& in) return tmp.str(); } -/** Template function to convert any input type to any other type - * (usually an integer or numeric type) +/** Template function to convert a std::string to any numeric type. */ -template inline long ConvToInt(const T& in) -{ - std::stringstream tmp; - if (!(tmp << in)) - return 0; - return atol(tmp.str().c_str()); -} - template inline TOut ConvToNum(const std::string& in) { TOut ret; diff --git a/src/base.cpp b/src/base.cpp index f698bad2e..8749aee8e 100644 --- a/src/base.cpp +++ b/src/base.cpp @@ -278,7 +278,7 @@ std::string LocalIntExt::serialize(SerializeFormat format, const Extensible* con void LocalIntExt::unserialize(SerializeFormat format, Extensible* container, const std::string& value) { if (format != FORMAT_NETWORK) - set(container, ConvToInt(value)); + set(container, ConvToNum(value)); } intptr_t LocalIntExt::get(const Extensible* container) const diff --git a/src/channels.cpp b/src/channels.cpp index e25500892..e5fd7265e 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -178,7 +178,7 @@ Channel* Channel::JoinUser(LocalUser* user, std::string cname, bool override, co unsigned int maxchans = user->GetClass()->maxchans; if (user->IsOper()) { - unsigned int opermaxchans = ConvToInt(user->oper->getConfig("maxchans")); + unsigned int opermaxchans = ConvToNum(user->oper->getConfig("maxchans")); // If not set, use 2.0's , if that's not set either, use limit from CC if (!opermaxchans && user->HasPrivPermission("channels/high-join-limit")) opermaxchans = ServerInstance->Config->OperMaxChans; diff --git a/src/coremods/core_channel/cmd_invite.cpp b/src/coremods/core_channel/cmd_invite.cpp index 1b480aa20..ebb95f1b4 100644 --- a/src/coremods/core_channel/cmd_invite.cpp +++ b/src/coremods/core_channel/cmd_invite.cpp @@ -53,7 +53,7 @@ CmdResult CommandInvite::Handle(User* user, const Params& parameters) if (IS_LOCAL(user)) timeout = ServerInstance->Time() + InspIRCd::Duration(parameters[2]); else if (parameters.size() > 3) - timeout = ConvToInt(parameters[3]); + timeout = ConvToNum(parameters[3]); } if (!c) @@ -75,7 +75,7 @@ CmdResult CommandInvite::Handle(User* user, const Params& parameters) return CMD_INVALID; // Drop the invite if our channel TS is lower - time_t RemoteTS = ConvToInt(parameters[2]); + time_t RemoteTS = ConvToNum(parameters[2]); if (c->age < RemoteTS) return CMD_FAILURE; } diff --git a/src/coremods/core_channel/invite.cpp b/src/coremods/core_channel/invite.cpp index 7ac662edc..51fb638f8 100644 --- a/src/coremods/core_channel/invite.cpp +++ b/src/coremods/core_channel/invite.cpp @@ -162,7 +162,7 @@ void Invite::APIImpl::Unserialize(LocalUser* user, const std::string& value) { Channel* chan = ServerInstance->FindChan(channame); if (chan) - Create(user, chan, ConvToInt(exptime)); + Create(user, chan, ConvToNum(exptime)); } } diff --git a/src/modules/m_callerid.cpp b/src/modules/m_callerid.cpp index 40cbc3506..3810fcf32 100644 --- a/src/modules/m_callerid.cpp +++ b/src/modules/m_callerid.cpp @@ -99,7 +99,7 @@ struct CallerIDExtInfo : public ExtensionItem irc::commasepstream s(value); std::string tok; if (s.GetToken(tok)) - dat->lastnotify = ConvToInt(tok); + dat->lastnotify = ConvToNum(tok); while (s.GetToken(tok)) { diff --git a/src/modules/m_chanhistory.cpp b/src/modules/m_chanhistory.cpp index 08f4291c9..47e27172c 100644 --- a/src/modules/m_chanhistory.cpp +++ b/src/modules/m_chanhistory.cpp @@ -71,7 +71,7 @@ class HistoryMode : public ParamMode > return MODEACTION_DENY; } - unsigned int len = ConvToInt(parameter.substr(0, colon)); + unsigned int len = ConvToNum(parameter.substr(0, colon)); unsigned int time = InspIRCd::Duration(duration); if (len == 0 || (len > maxlines && IS_LOCAL(source))) { diff --git a/src/modules/m_delaymsg.cpp b/src/modules/m_delaymsg.cpp index b39fb1d0a..9015e7bf9 100644 --- a/src/modules/m_delaymsg.cpp +++ b/src/modules/m_delaymsg.cpp @@ -38,7 +38,7 @@ class DelayMsgMode : public ParamMode ModeAction OnSet(User* source, Channel* chan, std::string& parameter) CXX11_OVERRIDE; void OnUnset(User* source, Channel* chan); - void SerializeParam(Channel* chan, int n, std::string& out) + void SerializeParam(Channel* chan, intptr_t n, std::string& out) { out += ConvToStr(n); } @@ -62,8 +62,8 @@ class ModuleDelayMsg : public Module ModeAction DelayMsgMode::OnSet(User* source, Channel* chan, std::string& parameter) { // Setting a new limit, sanity check - unsigned int limit = ConvToInt(parameter); - if (limit == 0) + intptr_t limit = ConvToNum(parameter); + if (limit <= 0) limit = 1; ext.set(chan, limit); diff --git a/src/modules/m_filter.cpp b/src/modules/m_filter.cpp index 584bfef00..cfba6c067 100644 --- a/src/modules/m_filter.cpp +++ b/src/modules/m_filter.cpp @@ -637,7 +637,7 @@ FilterResult ModuleFilter::DecodeFilter(const std::string &data) std::string duration; tokens.GetMiddle(duration); - res.duration = ConvToInt(duration); + res.duration = ConvToNum(duration); tokens.GetTrailing(res.reason); diff --git a/src/modules/m_joinflood.cpp b/src/modules/m_joinflood.cpp index aaf266216..cc62eb13b 100644 --- a/src/modules/m_joinflood.cpp +++ b/src/modules/m_joinflood.cpp @@ -109,8 +109,8 @@ class JoinFlood : public ParamMode > } /* Set up the flood parameters for this channel */ - unsigned int njoins = ConvToInt(parameter.substr(0, colon)); - unsigned int nsecs = ConvToInt(parameter.substr(colon+1)); + unsigned int njoins = ConvToNum(parameter.substr(0, colon)); + unsigned int nsecs = ConvToNum(parameter.substr(colon+1)); if ((njoins<1) || (nsecs<1)) { source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter)); diff --git a/src/modules/m_jumpserver.cpp b/src/modules/m_jumpserver.cpp index fc13a831c..02950e0e9 100644 --- a/src/modules/m_jumpserver.cpp +++ b/src/modules/m_jumpserver.cpp @@ -103,8 +103,8 @@ class CommandJumpserver : public Command } size_t delimpos = parameters[1].find(':'); - port = ConvToInt(parameters[1].substr(0, delimpos ? delimpos : std::string::npos)); - sslport = (delimpos == std::string::npos ? 0 : ConvToInt(parameters[1].substr(delimpos + 1))); + port = ConvToNum(parameters[1].substr(0, delimpos ? delimpos : std::string::npos)); + sslport = (delimpos == std::string::npos ? 0 : ConvToNum(parameters[1].substr(delimpos + 1))); if (parameters[1].find_first_not_of("0123456789:") != std::string::npos || parameters[1].rfind(':') != delimpos diff --git a/src/modules/m_kicknorejoin.cpp b/src/modules/m_kicknorejoin.cpp index 4d911e78b..70f3578b2 100644 --- a/src/modules/m_kicknorejoin.cpp +++ b/src/modules/m_kicknorejoin.cpp @@ -101,14 +101,14 @@ class KickRejoin : public ParamMode > ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE { - int v = ConvToInt(parameter); + unsigned int v = ConvToNum(parameter); if (v <= 0) { source->WriteNumeric(Numerics::InvalidModeParameter(channel, this, parameter)); return MODEACTION_DENY; } - if ((IS_LOCAL(source) && ((unsigned int)v > max))) + if (IS_LOCAL(source) && v > max) v = max; ext.set(channel, new KickRejoinData(v)); diff --git a/src/modules/m_messageflood.cpp b/src/modules/m_messageflood.cpp index 0707e6ae4..af976afd5 100644 --- a/src/modules/m_messageflood.cpp +++ b/src/modules/m_messageflood.cpp @@ -83,8 +83,8 @@ class MsgFlood : public ParamMode > /* Set up the flood parameters for this channel */ bool ban = (parameter[0] == '*'); - unsigned int nlines = ConvToInt(parameter.substr(ban ? 1 : 0, ban ? colon-1 : colon)); - unsigned int nsecs = ConvToInt(parameter.substr(colon+1)); + unsigned int nlines = ConvToNum(parameter.substr(ban ? 1 : 0, ban ? colon-1 : colon)); + unsigned int nsecs = ConvToNum(parameter.substr(colon+1)); if ((nlines<2) || (nsecs<1)) { diff --git a/src/modules/m_nickflood.cpp b/src/modules/m_nickflood.cpp index 50e2b3d93..ce8b364e4 100644 --- a/src/modules/m_nickflood.cpp +++ b/src/modules/m_nickflood.cpp @@ -100,8 +100,8 @@ class NickFlood : public ParamMode > } /* Set up the flood parameters for this channel */ - unsigned int nnicks = ConvToInt(parameter.substr(0, colon)); - unsigned int nsecs = ConvToInt(parameter.substr(colon+1)); + unsigned int nnicks = ConvToNum(parameter.substr(0, colon)); + unsigned int nsecs = ConvToNum(parameter.substr(colon+1)); if ((nnicks<1) || (nsecs<1)) { diff --git a/src/modules/m_pbkdf2.cpp b/src/modules/m_pbkdf2.cpp index 89bc39ef4..86530c5dd 100644 --- a/src/modules/m_pbkdf2.cpp +++ b/src/modules/m_pbkdf2.cpp @@ -43,7 +43,7 @@ class PBKDF2Hash std::string tok; ss.GetToken(tok); - this->iterations = ConvToInt(tok); + this->iterations = ConvToNum(tok); ss.GetToken(tok); this->hash = Base64ToBin(tok); diff --git a/src/modules/m_repeat.cpp b/src/modules/m_repeat.cpp index ef62e9ab1..af69f6be1 100644 --- a/src/modules/m_repeat.cpp +++ b/src/modules/m_repeat.cpp @@ -274,7 +274,7 @@ class RepeatMode : public ParamMode > else settings.Action = ChannelSettings::ACT_KICK; - if ((settings.Lines = ConvToInt(item)) == 0) + if ((settings.Lines = ConvToNum(item)) == 0) return false; if ((!stream.GetToken(item)) || ((settings.Seconds = InspIRCd::Duration(item)) == 0)) @@ -286,13 +286,13 @@ class RepeatMode : public ParamMode > if (stream.GetToken(item)) { // There is a diff parameter, see if it's valid (> 0) - if ((settings.Diff = ConvToInt(item)) == 0) + if ((settings.Diff = ConvToNum(item)) == 0) return false; if (stream.GetToken(item)) { // There is a backlog parameter, see if it's valid - if ((settings.Backlog = ConvToInt(item)) == 0) + if ((settings.Backlog = ConvToNum(item)) == 0) return false; // If there are still tokens, then it's invalid because we allow only 4 diff --git a/src/modules/m_spanningtree/addline.cpp b/src/modules/m_spanningtree/addline.cpp index 00ef5b8d1..623942d95 100644 --- a/src/modules/m_spanningtree/addline.cpp +++ b/src/modules/m_spanningtree/addline.cpp @@ -38,14 +38,14 @@ CmdResult CommandAddLine::Handle(User* usr, Params& params) XLine* xl = NULL; try { - xl = xlf->Generate(ServerInstance->Time(), ConvToInt(params[4]), params[2], params[5], params[1]); + xl = xlf->Generate(ServerInstance->Time(), ConvToNum(params[4]), params[2], params[5], params[1]); } catch (ModuleException &e) { ServerInstance->SNO->WriteToSnoMask('x',"Unable to ADDLINE type %s from %s: %s", params[0].c_str(), setter.c_str(), e.GetReason().c_str()); return CMD_FAILURE; } - xl->SetCreateTime(ConvToInt(params[3])); + xl->SetCreateTime(ConvToNum(params[3])); if (ServerInstance->XLines->AddLine(xl, NULL)) { if (xl->duration) diff --git a/src/modules/m_spanningtree/away.cpp b/src/modules/m_spanningtree/away.cpp index 282f52a35..13972589b 100644 --- a/src/modules/m_spanningtree/away.cpp +++ b/src/modules/m_spanningtree/away.cpp @@ -28,7 +28,7 @@ CmdResult CommandAway::HandleRemote(::RemoteUser* u, Params& params) if (!params.empty()) { if (params.size() > 1) - u->awaytime = ConvToInt(params[0]); + u->awaytime = ConvToNum(params[0]); else u->awaytime = ServerInstance->Time(); diff --git a/src/modules/m_spanningtree/capab.cpp b/src/modules/m_spanningtree/capab.cpp index 5daea5202..c29330516 100644 --- a/src/modules/m_spanningtree/capab.cpp +++ b/src/modules/m_spanningtree/capab.cpp @@ -249,7 +249,7 @@ bool TreeSocket::Capab(const CommandBase::Params& params) capab->OptModuleList.clear(); capab->CapKeys.clear(); if (params.size() > 1) - proto_version = ConvToInt(params[1]); + proto_version = ConvToNum(params[1]); if (proto_version < MinCompatProtocol) { diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp index b2967af3b..8e5361b16 100644 --- a/src/modules/m_spanningtree/compat.cpp +++ b/src/modules/m_spanningtree/compat.cpp @@ -521,7 +521,7 @@ bool TreeSocket::PreProcessOldProtocolMessage(User*& who, std::string& cmd, Comm // See if it's a numeric being sent to the target via PUSH unsigned int numeric_number = 0; if (token.length() == 3) - numeric_number = ConvToInt(token); + numeric_number = ConvToNum(token); if ((numeric_number > 0) && (numeric_number < 1000)) { diff --git a/src/modules/m_spanningtree/main.h b/src/modules/m_spanningtree/main.h index d619c43bc..4f8875a02 100644 --- a/src/modules/m_spanningtree/main.h +++ b/src/modules/m_spanningtree/main.h @@ -40,8 +40,8 @@ * Failure to document your protocol changes will result in a painfully * painful death by pain. You have been warned. */ -const long ProtocolVersion = 1205; -const long MinCompatProtocol = 1202; +const unsigned int ProtocolVersion = 1205; +const unsigned int MinCompatProtocol = 1202; /** Forward declarations */ diff --git a/src/modules/m_spanningtree/num.cpp b/src/modules/m_spanningtree/num.cpp index f83f91286..564b808fd 100644 --- a/src/modules/m_spanningtree/num.cpp +++ b/src/modules/m_spanningtree/num.cpp @@ -33,7 +33,7 @@ CmdResult CommandNum::HandleServer(TreeServer* server, CommandBase::Params& para if (!localtarget) return CMD_SUCCESS; - Numeric::Numeric numeric(ConvToInt(params[2])); + Numeric::Numeric numeric(ConvToNum(params[2])); // Passing NULL is ok, in that case the numeric source becomes this server numeric.SetServer(Utils->FindServerID(params[0])); numeric.GetParams().insert(numeric.GetParams().end(), params.begin()+3, params.end()); diff --git a/src/modules/m_spanningtree/servercommand.cpp b/src/modules/m_spanningtree/servercommand.cpp index 5b8152846..2f5c7ea3e 100644 --- a/src/modules/m_spanningtree/servercommand.cpp +++ b/src/modules/m_spanningtree/servercommand.cpp @@ -40,7 +40,7 @@ RouteDescriptor ServerCommand::GetRouting(User* user, const Params& parameters) time_t ServerCommand::ExtractTS(const std::string& tsstr) { - time_t TS = ConvToInt(tsstr); + time_t TS = ConvToNum(tsstr); if (!TS) throw ProtocolException("Invalid TS"); return TS; diff --git a/src/modules/m_spanningtree/svsnick.cpp b/src/modules/m_spanningtree/svsnick.cpp index 2514dfd6f..a734dc8ed 100644 --- a/src/modules/m_spanningtree/svsnick.cpp +++ b/src/modules/m_spanningtree/svsnick.cpp @@ -47,7 +47,7 @@ CmdResult CommandSVSNick::Handle(User* user, Params& parameters) // won't happen because the timestamps won't match. if (parameters.size() > 3) { - time_t ExpectedTS = ConvToInt(parameters[3]); + time_t ExpectedTS = ConvToNum(parameters[3]); if (u->age != ExpectedTS) return CMD_FAILURE; // Ignore SVSNICK } @@ -56,7 +56,7 @@ CmdResult CommandSVSNick::Handle(User* user, Params& parameters) if (isdigit(nick[0])) nick = u->uuid; - time_t NickTS = ConvToInt(parameters[2]); + time_t NickTS = ConvToNum(parameters[2]); if (NickTS <= 0) return CMD_FAILURE; diff --git a/src/modules/m_spanningtree/treesocket.h b/src/modules/m_spanningtree/treesocket.h index e8dbfd7cf..36dd8bb93 100644 --- a/src/modules/m_spanningtree/treesocket.h +++ b/src/modules/m_spanningtree/treesocket.h @@ -95,7 +95,7 @@ class TreeSocket : public BufferedSocket ServerState LinkState; /* Link state */ CapabData* capab; /* Link setup data (held until burst is sent) */ TreeServer* MyRoot; /* The server we are talking to */ - int proto_version; /* Remote protocol version */ + unsigned int proto_version; /* Remote protocol version */ /** True if we've sent our burst. * This only changes the behavior of message translation for 1202 protocol servers and it can be diff --git a/src/modules/m_spanningtree/treesocket2.cpp b/src/modules/m_spanningtree/treesocket2.cpp index 513fa6dbf..293cdd695 100644 --- a/src/modules/m_spanningtree/treesocket2.cpp +++ b/src/modules/m_spanningtree/treesocket2.cpp @@ -148,7 +148,7 @@ void TreeSocket::ProcessLine(std::string &line) { if (params.size()) { - time_t them = ConvToInt(params[0]); + time_t them = ConvToNum(params[0]); time_t delta = them - ServerInstance->Time(); if ((delta < -600) || (delta > 600)) { diff --git a/src/modules/m_topiclock.cpp b/src/modules/m_topiclock.cpp index c65f27668..b0d004b1c 100644 --- a/src/modules/m_topiclock.cpp +++ b/src/modules/m_topiclock.cpp @@ -48,7 +48,7 @@ class CommandSVSTOPIC : public Command if (parameters.size() == 4) { // 4 parameter version, set all topic data on the channel to the ones given in the parameters - time_t topicts = ConvToInt(parameters[1]); + time_t topicts = ConvToNum(parameters[1]); if (!topicts) { ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Received SVSTOPIC with a 0 topicts, dropped."); diff --git a/src/socket.cpp b/src/socket.cpp index cdbc83e44..d48a1907c 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -354,7 +354,7 @@ irc::sockets::cidr_mask::cidr_mask(const std::string& mask) } else { - int range = ConvToInt(mask.substr(bits_chars + 1)); + unsigned char range = ConvToNum(mask.substr(bits_chars + 1)); irc::sockets::aptosa(mask.substr(0, bits_chars), 0, sa); sa2cidr(*this, sa, range); } -- 2.39.5