Avoid appending a user to curr_opers or curr_helpers more than once.
authorMichael Poole <mdpoole@troilus.org>
Fri, 14 Dec 2007 03:32:13 +0000 (22:32 -0500)
committerMichael Poole <mdpoole@troilus.org>
Fri, 14 Dec 2007 03:32:13 +0000 (22:32 -0500)
hash.h (userList_contains): Declare new function.
hash.c (userList_contains): Implement it.
nickserv.c (set_user_handle_info): Use it to check against curr_helpers.
proto-p10.c (mod_usermode): Use it for curr_opers.

src/hash.c
src/hash.h
src/nickserv.c
src/proto-p10.c

index d806c276462e6570c41d2d663359558aeec6a52b..2250d069cafa8fea486c0e0ff9cb8bbfcbb85bcf 100644 (file)
@@ -42,6 +42,18 @@ void init_structs(void)
     reg_exit_func(hash_cleanup);
 }
 
+int userList_contains(struct userList *list, struct userNode *user)
+{
+    unsigned int ii;
+
+    for (ii = 0; ii < list->used; ++ii) {
+        if (user == list->list[ii]) {
+            return 1;
+        }
+    }
+    return 0;
+}
+
 server_link_func_t *slf_list;
 unsigned int slf_size = 0, slf_used = 0;
 
index 1da87585bf12df03dae821c336fbfaaa4e94659c..354054e4c21a526eface3268249f6ad3ea7b7cef 100644 (file)
@@ -199,6 +199,8 @@ struct userNode* GetUserH(const char *nick);   /* using nick */
 struct chanNode* GetChannel(const char *name);
 struct modeNode* GetUserMode(struct chanNode* channel, struct userNode* user);
 
+int userList_contains(struct userList *list, struct userNode *user);
+
 typedef void (*server_link_func_t) (struct server *server);
 void reg_server_link_func(server_link_func_t handler);
 
index 305cfad8df465972fb69364fe1946ce7e3569cb2..81fe3aa7e53c9448c683fe5a14049c44508347c2 100644 (file)
@@ -944,7 +944,7 @@ set_user_handle_info(struct userNode *user, struct handle_info *hi, int stamp)
         user->next_authed = hi->users;
         hi->users = user;
         hi->lastseen = now;
-        if (IsHelper(user))
+        if (IsHelper(user) && !userList_contains(&curr_helpers, user))
             userList_append(&curr_helpers, user);
 
         if (hi->fakehost || old_info)
index 8a5a76de57033f3545c60032dc1fc71ffa588a8c..a0da122e2b5f9a49b0cb56956e261c35eea27298 100644 (file)
@@ -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);