From: Alexander Barton Date: Sat, 20 Jan 2024 15:14:01 +0000 (+0100) Subject: Explicitly test for the empty string in Channel_UserHasMode() X-Git-Tag: rel-27-rc1~66 X-Git-Url: https://arthur.ath.cx/gitweb/?a=commitdiff_plain;h=669d71f3fe4c21f27c329690d74427879d8ee35a;p=ngircd-alex.git Explicitly test for the empty string in Channel_UserHasMode() 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. --- 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 */