]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Explicitly test for the empty string in Channel_UserHasMode()
authorAlexander Barton <alex@barton.de>
Sat, 20 Jan 2024 15:14:01 +0000 (16:14 +0100)
committerAlexander Barton <alex@barton.de>
Sat, 20 Jan 2024 15:43:54 +0000 (16:43 +0100)
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

index bf8918634910b23c57b8b1347ef4e7d49af75b88..9994e65f5708592aa48150fd20aa5ea2352082b0 100644 (file)
@@ -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 */