diff options
| author | Alexander Barton <alex@barton.de> | 2024-01-20 16:14:01 +0100 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2024-01-20 16:43:54 +0100 |
| commit | 669d71f3fe4c21f27c329690d74427879d8ee35a (patch) | |
| tree | 949e8530d5ec0fb7b700be34e80b6578ba61086e | |
| parent | dbfe54ce62f0d877f4e500ab193ab70d889271d5 (diff) | |
| download | ngircd-669d71f3fe4c21f27c329690d74427879d8ee35a.tar.gz ngircd-669d71f3fe4c21f27c329690d74427879d8ee35a.zip | |
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.
| -rw-r--r-- | src/ngircd/channel.c | 20 |
1 files changed, 19 insertions, 1 deletions
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 */ |