mirror of
https://github.com/unrealircd/unrealircd.git
synced 2026-07-08 21:43:12 +02:00
Make Channel struct fixed-size rather than the name[1] trick.
Also, do some more validations on remote names now that it is fixed.
This commit is contained in:
+1
-1
@@ -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).
|
||||
|
||||
+24
-9
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user