From: William Pitcock Date: Sun, 18 Sep 2016 22:11:00 +0000 (-0500) Subject: helpops: add duplication guards on helper/dehelper state changes X-Git-Url: https://jfr.im/git/solanum.git/commitdiff_plain/b1c32af98e06e55c88dd4cf353cc2b8db9e98f1b helpops: add duplication guards on helper/dehelper state changes --- diff --git a/extensions/helpops.c b/extensions/helpops.c index d1de9498..6198a460 100644 --- a/extensions/helpops.c +++ b/extensions/helpops.c @@ -23,6 +23,8 @@ static void h_hdl_client_exit(hook_data_client_exit *hdata); static void h_hdl_umode_changed(hook_data_umode_changed *hdata); static void h_hdl_whois(hook_data_client *hdata); static void recurse_client_exit(struct Client *client_p); +static void helper_add(struct Client *client_p); +static void helper_delete(struct Client *client_p); static void mo_dehelper(struct MsgBuf *, struct Client *, struct Client *, int, const char **); static void me_dehelper(struct MsgBuf *, struct Client *, struct Client *, int, const char **); static void do_dehelper(struct Client *source_p, struct Client *target_p); @@ -152,11 +154,26 @@ h_hdl_stats_request(hook_data_int *hdata) hdata->result = 1; } +static void +helper_add(struct Client *client_p) +{ + if (rb_dlinkFind(client_p, &helper_list) != NULL) + return; + + rb_dlinkAddAlloc(client_p, &helper_list); +} + +static void +helper_delete(struct Client *client_p) +{ + rb_dlinkFindDestroy(client_p, &helper_list); +} + static void h_hdl_new_remote_user(struct Client *client_p) { if (client_p->umodes & UMODE_HELPOPS) - rb_dlinkAddAlloc(client_p, &helper_list); + helper_add(client_p); } static void @@ -165,7 +182,7 @@ recurse_client_exit(struct Client *client_p) if (IsPerson(client_p)) { if (client_p->umodes & UMODE_HELPOPS) - rb_dlinkFindDestroy(client_p, &helper_list); + helper_delete(client_p); } else if (IsServer(client_p)) { @@ -203,10 +220,10 @@ h_hdl_umode_changed(hook_data_umode_changed *hdata) return; } - rb_dlinkAddAlloc(source_p, &helper_list); + helper_add(source_p); } else if (!(source_p->umodes & UMODE_HELPOPS)) - rb_dlinkFindDestroy(source_p, &helper_list); + helper_delete(source_p); } static void