From da07fbf28f6ae23a94a55e9363895123770e3ad3 Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Thu, 5 Aug 2021 16:40:26 +0200 Subject: [PATCH] Make Channel struct fixed-size rather than the name[1] trick. Also, do some more validations on remote names now that it is fixed. --- include/struct.h | 2 +- src/channel.c | 33 ++++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/include/struct.h b/include/struct.h index da6837315..7e89ef4e3 100644 --- a/include/struct.h +++ b/include/struct.h @@ -2032,7 +2032,7 @@ struct Channel { Ban *invexlist; /**< List of invite exceptions (+I) */ char *mode_lock; /**< Mode lock (MLOCK) applied to channel - usually by Services */ ModData moddata[MODDATA_MAX_CHANNEL]; /**< Channel attached module data, used by the ModData system */ - char name[1]; /**< Channel name */ + char name[CHANNELLEN+1]; /**< Channel name */ }; /** user/channel member struct (channel->members). diff --git a/src/channel.c b/src/channel.c index cbc19b387..14fe65334 100644 --- a/src/channel.c +++ b/src/channel.c @@ -937,26 +937,41 @@ int valid_channelname(const char *cname) * @note Be sure to call valid_channelname() first before * you blindly call this function! */ -Channel *get_channel(Client *client, char *chname, int flag) +Channel *get_channel(Client *client, char *name, int flag) { Channel *channel; int len; + char *p; - if (BadPtr(chname)) + if (BadPtr(name)) return NULL; - len = strlen(chname); - if (MyUser(client) && len > CHANNELLEN) + /* Copied from valid_channelname(), the minimal requirements */ + for (p = name; *p; p++) + { + if (*p < 33 || *p == ',' || *p == ':') + { + *p = '\0'; + break; + } + } + + /* Cut off oversized */ + len = strlen(name); + if (len > CHANNELLEN) { len = CHANNELLEN; - *(chname + CHANNELLEN) = '\0'; + *(name + CHANNELLEN) = '\0'; } - if ((channel = find_channel(chname, NULL))) + + /* Exists? Return it */ + if ((channel = find_channel(name, NULL))) return (channel); + if (flag == CREATE) { - channel = safe_alloc(sizeof(Channel) + len); - strlcpy(channel->name, chname, len + 1); + channel = safe_alloc(sizeof(Channel)); + strlcpy(channel->name, name, sizeof(channel->name)); if (channels) channels->prevch = channel; channel->topic = NULL; @@ -965,7 +980,7 @@ Channel *get_channel(Client *client, char *chname, int flag) channel->nextch = channels; channel->creationtime = MyUser(client) ? TStime() : 0; channels = channel; - add_to_channel_hash_table(chname, channel); + add_to_channel_hash_table(channel->name, channel); irccounts.channels++; RunHook2(HOOKTYPE_CHANNEL_CREATE, client, channel); }