KICK: Fix denial of service bug
authorSebastian Köhler <sebkoehler@whoami.org.uk>
Thu, 14 Feb 2013 18:21:01 +0000 (19:21 +0100)
committerSebastian Köhler <sebkoehler@whoami.org.uk>
Fri, 15 Feb 2013 09:21:58 +0000 (10:21 +0100)
Test if the user that it is to be kicked is on the channel before user
channel modes are tested. Otherwise assert( cl2chan != NULL ); in
line 742 would fail and stop the service.

src/ngircd/channel.c

index 4eab2726a04393f40bc08ddec9ecfd4a4d5144c0..45bf615c29d604b453807e2a1e6c2b07c8c3f02c 100644 (file)
@@ -326,6 +326,13 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name,
                }
        }
 
+       /* Check that the client to be kicked is on the specified channel */
+       if (!Channel_IsMemberOf(chan, Target)) {
+               IRC_WriteStrClient(Origin, ERR_USERNOTINCHANNEL_MSG,
+                                  Client_ID(Origin), Client_ID(Target), Name );
+               return;
+       }
+
        if(Client_Type(Peer) == CLIENT_USER) {
                /* Channel mode 'Q' and user mode 'q' on target: nobody but
                 * IRC Operators and servers can kick the target user */
@@ -382,13 +389,6 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name,
                }
        }
 
-       /* Check that the client to be kicked is on the specified channel */
-       if (!Channel_IsMemberOf(chan, Target)) {
-               IRC_WriteStrClient(Origin, ERR_USERNOTINCHANNEL_MSG,
-                                  Client_ID(Origin), Client_ID(Target), Name );
-               return;
-       }
-
        /* Kick Client from channel */
        Remove_Client( REMOVE_KICK, chan, Target, Origin, Reason, true);
 } /* Channel_Kick */