From a96bcd75a7530b0f9a25209b585e3ee18dc49937 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Thu, 13 Dec 2007 22:32:13 -0500 Subject: [PATCH] Avoid appending a user to curr_opers or curr_helpers more than once. 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 | 12 ++++++++++++ src/hash.h | 2 ++ src/nickserv.c | 2 +- src/proto-p10.c | 6 +++--- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/hash.c b/src/hash.c index d806c27..2250d06 100644 --- a/src/hash.c +++ b/src/hash.c @@ -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; diff --git a/src/hash.h b/src/hash.h index 1da8758..354054e 100644 --- a/src/hash.h +++ b/src/hash.h @@ -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); diff --git a/src/nickserv.c b/src/nickserv.c index 305cfad..81fe3aa 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -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) diff --git a/src/proto-p10.c b/src/proto-p10.c index 8a5a76d..a0da122 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -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); -- 2.20.1