From 669d71f3fe4c21f27c329690d74427879d8ee35a Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Sat, 20 Jan 2024 16:14:01 +0100 Subject: [PATCH] Explicitly test for the empty string in Channel_UserHasMode() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Basically this is unnecessary, as Channel_UserModes() always returns a valid pointer and strchr() can deal with an empty (NULL-terminated) string perfectly fine, bit it makes the code a bit more obvious and silences the following warning: In function ‘Channel_UserHasMode’, inlined from ‘Channel_Kick’ at channel.c:384:7: channel.c:784:16: warning: ‘strchr’ reading 1 or more bytes from a region of size 0 [-Wstringop-overread] 784 | return strchr(Channel_UserModes(Chan, Client), Mode) != NULL; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This was seen with "gcc (Debian 12.2.0-14) 12.2.0" at least. --- src/ngircd/channel.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index bf891863..9994e65f 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -778,10 +778,28 @@ Channel_UserModes( CHANNEL *Chan, CLIENT *Client ) } /* Channel_UserModes */ +/** + * Test if a user has a given channel user mode. + * + * @param Chan The channel to check. + * @param Client The client to check. + * @param Mode The channel user mode to test for. + * @return true if the user has the given channel user mode set. + */ GLOBAL bool Channel_UserHasMode( CHANNEL *Chan, CLIENT *Client, char Mode ) { - return strchr(Channel_UserModes(Chan, Client), Mode) != NULL; + char *channel_user_modes; + + assert(Chan != NULL); + assert(Client != NULL); + assert(Mode > 0); + + channel_user_modes = Channel_UserModes(Chan, Client); + if (!channel_user_modes || !*channel_user_modes) + return false; + + return strchr(channel_user_modes, Mode) != NULL; } /* Channel_UserHasMode */ -- 2.39.2