Automatically stop most user-oriented hooks if the user becomes dead.
authorMichael Poole <mdpoole@troilus.org>
Sat, 3 Jan 2009 20:12:04 +0000 (15:12 -0500)
committerMichael Poole <mdpoole@troilus.org>
Sat, 3 Jan 2009 20:12:04 +0000 (15:12 -0500)
src/hash.c (NickChange): Stop iterating if the user is killed by any hook.
  (AddChannelUser): Likewise.
src/nickserv.c (set_user_handle_info): Likewise.
src/proto-common.c (of_list, of_size, of_used, reg_oper_func,
  call_oper_funcs): Move from the proto-*.c files.  Make call_oper_funcs
    stop iterating if the user is killed by any hook.
src/proto-bahahmut.c (AddUser): Likewise.
  (of_list, of_size, of_used, reg_oper_func, call_oper_funcs): Move to
    proto-common.c
src/proto-p10.c: Likewise to proto-bahamut.c.

src/hash.c
src/nickserv.c
src/proto-bahamut.c
src/proto-common.c
src/proto-p10.c

index a7aa6a0e1a1df7483becda04e00d19a5bd734cc4..5cb7b0c754459400ed0bd17d16a8ceb41d288cc6 100644 (file)
@@ -191,9 +191,11 @@ NickChange(struct userNode* user, const char *new_nick, int no_announce)
 #endif
 
     /* Make callbacks for nick changes.  Do this with new nick in
-     * place because that is slightly more useful.
+     * place because that is slightly more useful.  Stop if the user
+     * gets killed by any of the hooks, so that later hooks do not get
+     * confused by the user having disappeared.
      */
-    for (nn=0; nn<ncf2_used; nn++)
+    for (nn=0; (nn<ncf2_used) && !user->dead; nn++)
         ncf2_list[nn](user, old_nick);
     user->timestamp = now;
     if (IsLocal(user) && !no_announce)
@@ -502,7 +504,7 @@ AddChannelUser(struct userNode *user, struct chanNode* channel)
             irc_join(user, channel);
         }
 
-        for (n=0; n<jf_used; n++) {
+        for (n=0; (n<jf_used) && !user->dead; n++) {
             /* Callbacks return true if they kick or kill the user,
              * and we can continue without removing mNode. */
             if (jf_list[n](mNode))
index 424150f5d76763b6c418b0f0d202bc4c511e549d..7df54b1703631f2c30920b6ce6affd45b7456254 100644 (file)
@@ -935,7 +935,7 @@ set_user_handle_info(struct userNode *user, struct handle_info *hi, int stamp)
     user->handle_info = hi;
     if (hi && !hi->users && !hi->opserv_level)
         HANDLE_CLEAR_FLAG(hi, HELPING);
-    for (n=0; n<auth_func_used; n++)
+    for (n=0; (n<auth_func_used) && !user->dead; n++)
         auth_func_list[n](user, old_info);
     if (hi) {
         struct nick_info *ni;
index 790010ecfa6b2ec7f354defb12d589c70a0a7323..e7f0b2bece917659e58f79c26ac52b7524a63996 100644 (file)
@@ -168,7 +168,7 @@ AddUser(struct server* uplink, const char *nick, const char *ident, const char *
     if (dummy) uNode->modes |= FLAGS_DUMMY;
     if (stamp) call_account_func(uNode, NULL, 0, stamp);
     if (IsLocal(uNode)) irc_user(uNode);
-    for (nn=0; nn<nuf_used; nn++) {
+    for (nn=0; (nn<nuf_used) && !uNode->dead; nn++) {
         if (nuf_list[nn](uNode)) break;
     }
     return uNode;
@@ -1043,12 +1043,9 @@ static CMD_FUNC(cmd_svsnick)
     return 1;
 }
 
-static oper_func_t *of_list;
-static unsigned int of_size = 0, of_used = 0;
-
 void parse_cleanup(void) {
     unsigned int nn;
-    if (of_list) free(of_list);
+    free(of_list);
     dict_delete(irc_func_dict);
     dict_delete(service_msginfo_dict);
     free(mcf_list);
@@ -1206,32 +1203,6 @@ unreg_notice_func(struct userNode *user) {
     }
 }
 
-void
-reg_oper_func(oper_func_t handler)
-{
-    if (of_used == of_size) {
-        if (of_size) {
-            of_size <<= 1;
-            of_list = realloc(of_list, of_size*sizeof(oper_func_t));
-        } else {
-            of_size = 8;
-            of_list = malloc(of_size*sizeof(oper_func_t));
-        }
-    }
-    of_list[of_used++] = handler;
-}
-
-static void
-call_oper_funcs(struct userNode *user)
-{
-    unsigned int n;
-    if (IsLocal(user)) return;
-    for (n=0; n<of_used; n++)
-    {
-        of_list[n](user);
-    }
-}
-
 void mod_usermode(struct userNode *user, const char *mode_change) {
     int add = 1;
 
index f6a852f7ad06ff214223350e2ae22f9b01eb0bc6..4477fad41d5ab53d948ce2810ef8d4eb48300147 100644 (file)
@@ -538,6 +538,36 @@ reg_mode_change_func(mode_change_func_t handler)
     mcf_list[mcf_used++] = handler;
 }
 
+static oper_func_t *of_list;
+static unsigned int of_size = 0, of_used = 0;
+
+void
+reg_oper_func(oper_func_t handler)
+{
+    if (of_used == of_size) {
+        if (of_size) {
+            of_size <<= 1;
+            of_list = realloc(of_list, of_size*sizeof(oper_func_t));
+        } else {
+            of_size = 8;
+            of_list = malloc(of_size*sizeof(oper_func_t));
+        }
+    }
+    of_list[of_used++] = handler;
+}
+
+static void
+call_oper_funcs(struct userNode *user)
+{
+    unsigned int n;
+    if (IsLocal(user))
+        return;
+    for (n=0; (n<of_used) && !user->dead; n++)
+    {
+        of_list[n](user);
+    }
+}
+
 struct mod_chanmode *
 mod_chanmode_alloc(unsigned int argc)
 {
index e9ab2f44c8660f1b4ea81dd26ab4b70f8c5af172..d288524497a75ee28fcfb4070e14372fdce8b622 100644 (file)
@@ -1591,9 +1591,6 @@ static CMD_FUNC(cmd_svsnick)
     return 1;
 }
 
-static oper_func_t *of_list;
-static unsigned int of_size = 0, of_used = 0;
-
 void
 free_user(struct userNode *user)
 {
@@ -2141,7 +2138,7 @@ AddUser(struct server* uplink, const char *nick, const char *ident, const char *
     }
     if (IsLocal(uNode))
         irc_user(uNode);
-    for (n=0; n<nuf_used; n++)
+    for (n=0; (n<nuf_used) && !uNode->dead; n++)
         if (nuf_list[n](uNode))
             break;
     return uNode;
@@ -2821,31 +2818,6 @@ unreg_notice_func(struct userNode *user)
     notice_funcs[user->num_local] = NULL;
 }
 
-void
-reg_oper_func(oper_func_t handler)
-{
-    if (of_used == of_size) {
-        if (of_size) {
-            of_size <<= 1;
-            of_list = realloc(of_list, of_size*sizeof(oper_func_t));
-        } else {
-            of_size = 8;
-            of_list = malloc(of_size*sizeof(oper_func_t));
-        }
-    }
-    of_list[of_used++] = handler;
-}
-
-static void
-call_oper_funcs(struct userNode *user)
-{
-    unsigned int n;
-    if (IsLocal(user))
-        return;
-    for (n=0; n<of_used; n++)
-        of_list[n](user);
-}
-
 static void
 send_burst(void)
 {