Avoid appending a user to curr_opers or curr_helpers more than once.
[srvx.git] / src / proto-p10.c
index 802351049d314e928644fc2a2645a727aad16ac9..a0da122e2b5f9a49b0cb56956e261c35eea27298 100644 (file)
@@ -918,9 +918,9 @@ static CMD_FUNC(cmd_whois)
         mlen = strlen(self->name) + strlen(from->nick) + 12 + strlen(who->nick);
         len = 0;
         *buf = '\0';
-        for (i = 0; i < who->channels.used; i++)
+        for (i = who->channels.used; i > 0; )
         {
-            mn = who->channels.list[i];
+            mn = who->channels.list[--i];
 
             if (!IsOper(from) && (mn->channel->modes & (MODE_PRIVATE | MODE_SECRET)) && !GetUserMode(mn->channel, from))
                 continue;
@@ -2213,11 +2213,11 @@ void mod_usermode(struct userNode *user, const char *mode_change) {
         case '-': add = 0; break;
         case 'o':
             do_user_mode(FLAGS_OPER);
-            if (add) {
+            if (!add) {
+                userList_remove(&curr_opers, user);
+            } else if (!userList_contains(&curr_opers, user)) {
                 userList_append(&curr_opers, user);
                 call_oper_funcs(user);
-            } else {
-                userList_remove(&curr_opers, user);
             }
             break;
         case 'i': do_user_mode(FLAGS_INVISIBLE);