// RFC 4616 spec says the three parts of the response can be up to 255 bytes long
// That's 255*3 + 2, but we'll add another NUL byte after the pass, so it's 768.
// Base64 encoding adds 4/3 overhead, so the total buffer size is 1024.
- client->saslbuf = (char *)malloc(1024);
+ client->saslbuf = new char[1024];
client->saslbufLen = 0;
client->saslexternal = !strcmp(args[0], "EXTERNAL");
- if (!client->saslbuf)
- abortf("malloc fail (saslbuf)\n");
} else {
size_t len = strlen(args[0]);
// there are three cases
} else {
err_saslfail(), sendbuf(client);
}
- free(client->saslusername);
+ delete[] client->saslusername;
client->saslusername = 0;
newUser(client);
}
// we'll clear the whole buffer later, this is just in case username alloc fails
memset(password, 0, strlen(password));
client->saslusername = mystrdup(username);
- if (!client->saslusername)
- abortf("strdup fail (saslusername)\n");
goto saslcleanup;
} else {
#ifdef HAVE_LIBTLS
err_saslfail(), sendbuf(client);
saslcleanup:
memset(client->saslbuf, 0, 1024);
- free(client->saslbuf);
+ delete[] client->saslbuf;
client->saslbuf = 0;
client->saslbufLen = 0;
return 0;
if (is_registered(client)) {
setNick(client, args[0]);
} else {
- free(client->nick_reg);
+ delete[] client->nick_reg;
client->nick_reg = mystrdup(args[0]);
- if (!client->nick_reg)
- abortf("strdup fail (nick_reg)\n");
newUser(client);
}
} MATCH_COMMAND("USER") {
client_chghost(client, args[0]-1, 0);
}
// set realname
- free(client->realname);
+ delete[] client->realname;
client->realname = mystrdup(args[3]);
- if (!client->realname)
- abortf("strdup fail (realname)\n");
// proceed with registration
newUser(client);
} MATCH_COMMAND("PASS") {
return err_needmoreparams(client, command), sendbuf(client), 0;
if (client->pass_reg) {
memset(client->pass_reg, 0, strlen(client->pass_reg));
- free(client->pass_reg);
+ delete[] client->pass_reg;
}
client->pass_reg = mystrdup(args[0]);
memset(args[0], 0, strlen(args[0]));
- if (!client->pass_reg)
- abortf("strdup fail (pass_reg)\n");
} MATCH_COMMAND("WEBIRC") {
if (is_registered(client))
return err_alreadyregistered(client), sendbuf(client), 0;
client->webircwait = 2;
if (!strcmp(args[1], "biboumi")) {
size_t len = strlen(args[2]);
- client->webirchostname = (char *)malloc(len+sizeof(".xmpp"));
- if (client->webirchostname) {
- memcpy(client->webirchostname, args[2], len);
- memcpy(client->webirchostname+len, ".xmpp", sizeof(".xmpp"));
- }
+ client->webirchostname = new char[len+sizeof(".xmpp")];
+ memcpy(client->webirchostname, args[2], len);
+ memcpy(client->webirchostname+len, ".xmpp", sizeof(".xmpp"));
}
job_password_check(client, args[1], args[0], "webirc", [client](int res) {
if (!(client->umode & UMODE_SECURE) || res != 0) {
- free(client->webircpeername);
+ delete[] client->webircpeername;
client->webircpeername = 0;
err_passwdmismatch(client), sendbuf(client);
} else {
- free(client->peername);
+ delete[] client->peername;
client->peername = client->webircpeername;
if (client->webirchostname) {
client_chghost(client, 0, client->webirchostname);
- free(client->webirchostname);
+ delete[] client->webirchostname;
client->webirchostname = 0;
}
client->webircpeername = 0;
if (!is_registered(client))
return err_notregistered(client), sendbuf(client), 0;
if (args[0]) {
- free(client->away);
+ delete[] client->away;
client->away = mystrdup(args[0]);
- if (!client->away)
- abortf("strdup fail (away)\n");
rpl_nowaway(client), sendbuf(client);
} else {
- free(client->away);
+ delete[] client->away;
client->away = NULL;
rpl_unaway(client), sendbuf(client);
}
return err_notregistered(client), sendbuf(client), 0;
if (argc == 0)
return err_needmoreparams(client, command), sendbuf(client), 0;
- free(client->realname);
+ delete[] client->realname;
client->realname = mystrdup(args[0]);
msg_setname(client);
int cookie = sendbuf_visible_caps(client, CAP_SETNAME, 0);
err_saslaborted(), sendbuf(client);
if (client->saslbuf) {
memset(client->saslbuf, 0, 1024);
- free(client->saslbuf);
+ delete[] client->saslbuf;
client->saslbuf = 0;
client->saslbufLen = 0;
}
});
client->passwait = 1;
memset(client->pass_reg, 0, strlen(client->pass_reg));
- free(client->pass_reg);
+ delete[] client->pass_reg;
client->pass_reg = NULL;
return;
}
setNick(client, client->nick_reg);
- free(client->nick_reg);
+ delete[] client->nick_reg;
client->nick_reg = NULL;
client->signon = client->lastactivity = get_time();
if (!client->nick)
const char *n = client->nick ? client->nick : "*";
const char *u = client->username ? client->username : "*";
const char *h = client->hostname;
- free(client->nuh);
- client->nuh = (char *)malloc(strlen(n) + strlen(u) + strlen(h) + 3);
- if (!client->nuh)
- abortf("malloc fail (nuh)\n");
+ delete[] client->nuh;
+ client->nuh = new char[strlen(n) + strlen(u) + strlen(h) + 3];
sprintf(client->nuh, "%s!%s@%s", n, u, h);
stringlower(client->nuh);
}
chan->o.rename(client, key);
chan->v.rename(client, key);
}
- free(client->nick);
- free(client->key);
+ delete[] client->nick;
+ delete[] client->key;
} else {
#ifdef HAVE_LUA
admin_hook("nickadd", client, 0, 0, key);
}
client->nick = mystrdup(nickname);
- if (!client->nick)
- abortf("strdup fail (nickname)\n");
updateNuh(client);
client->key = mystrdup(key);
- if (!client->key)
- abortf("strdup fail (key)\n");
client_map.add(client);
rpl_mononline(0, client), sendbuf_monitor(client->key, 0, 0, 0);
return;
if (newusername == client->username+1) {
memmove(client->username, client->username+1, strlen(client->username));
} else if (newusername) {
- free(client->username);
+ delete[] client->username;
client->username = mystrdup(newusername);
- if (!client->username)
- abortf("strdup fail (username)\n");
}
// update hostname
if (newhostname) {
- free(client->hostname);
+ delete[] client->hostname;
client->hostname = mystrdup(newhostname);
- if (!client->hostname)
- abortf("strdup fail (hostname)\n");
}
// update nuh
updateNuh(client);
}
Channel *channel_new(const char *channel, const char *key, time_t creation)
{
- Channel *chan = (Channel *)malloc(sizeof(Channel));
- if (!chan)
- abortf("malloc fail (channel)\n");
+ Channel *chan = new Channel();
memset(chan, 0, sizeof(Channel));
chan->creation = creation;
chan->member_limit = -1;
chan->dmode = DMODE_NOEXTERNAL | DMODE_TOPICPROT | DMODE_PERSIST;
chan->key = mystrdup(key);
- if (!chan->key)
- abortf("strdup fail (key)\n");
chan->name = mystrdup(channel);
- if (!chan->name)
- abortf("strdup fail (name)\n");
return chan;
}
void channel_part(Client *client, Channel *chan, const char *reason, Client *kicker)
}
void channel_kill(Channel *chan)
{
- channel_map.remove(chan);
- for (auto cl : chan->invitees)
- cl->invites.remove(chan);
- free(chan->key);
- free(chan->name);
- free(chan->topic);
- free(chan->topic_who);
- chan->members.clear();
- chan->o.clear();
- chan->v.clear();
- chan->listb.clear();
- chan->liste.clear();
- chan->listI.clear();
- chan->listq.clear();
- chan->listwo.clear();
- chan->listwv.clear();
- chan->invitees.clear();
- free(chan->chankey);
- free(chan);
+ delete chan;
+}
+Channel::~Channel() {
+ channel_map.remove(this);
+ for (auto cl : invitees)
+ cl->invites.remove(this);
+ delete[] key;
+ delete[] name;
+ delete[] topic;
+ delete[] topic_who;
+ members.clear();
+ o.clear();
+ v.clear();
+ listb.clear();
+ liste.clear();
+ listI.clear();
+ listq.clear();
+ listwo.clear();
+ listwv.clear();
+ invitees.clear();
+ delete[] chankey;
}
void channel_mode(Client *client, Channel *chan, char *args[]) {
const char *n = client ? client->nick : "cia";
args++;
break;
}
- if (chan->chankey)
- free(chan->chankey);
+ delete[] chan->chankey;
chan->chankey = mystrdup(*args);
- if (!chan->chankey)
- abortf("strdup fail (chankey)\n");
} else {
- free(chan->chankey);
+ delete[] chan->chankey;
chan->chankey = NULL;
if (*args) // unused argument
args++;
}
void channel_topic(Client *src, Channel *chan, const char *topic, const char *who, time_t when)
{
- free(chan->topic);
- free(chan->topic_who);
+ delete[] chan->topic;
+ delete[] chan->topic_who;
if (!*topic) {
chan->topic = NULL;
chan->topic_who = NULL;
chan->topic_when = 0;
} else {
chan->topic = mystrdup(topic);
- if (!chan->topic)
- abortf("strdup fail (topic)\n");
chan->topic_who = mystrdup(who);
- if (!chan->topic_who)
- abortf("strdup fail (topic_who)\n");
chan->topic_when = when;
}
if (src)