free all MemberFlood's on mode -f
[ircu2.10.12-pk.git] / ircd / channel.c
index d7630b1f598a1f61c17725c9ef95bb751b103643..1ca8519486edcb0a135583718df110e91a2a78fb 100644 (file)
@@ -2671,7 +2671,7 @@ mode_parse_noflood(struct ParseState *state, ulong64 *flag_p)
         break;
       }
     }
-    if(count <= 0 || time <= 0 || count > 999 || time > 9999) return;
+    if(count <= 0 || time <= 0 || count > 100 || time > 600) return;
     
     if (!(state->flags & MODE_PARSE_WIPEOUT) &&
        (!t_str || t_str == state->chptr->mode.noflood))
@@ -2727,6 +2727,16 @@ mode_parse_noflood(struct ParseState *state, ulong64 *flag_p)
     noflood_value <<= 3;
     noflood_value |= flags;
     state->chptr->mode.noflood_value = noflood_value;
+  } else {
+    //removed the mode so free all flood objects
+    struct Membership *member;
+    for(member = state->chptr->members; member; member = member->next_member) {
+        struct MemberFlood *floodnode;
+        for(floodnode = member->flood; floodnode; floodnode = floodnode->next_memberflood) {} //simply walk to the end
+        floodnode->next_memberflood = free_MemberFlood;
+        free_MemberFlood  = floodnode;
+        member->flood = NULL;
+    }
   }
 }
 
@@ -4376,7 +4386,6 @@ int ext_noflood_block(struct Client *cptr, struct Channel *chptr) {
     free_MemberFlood = floodnode->next_memberflood;
   } else
     floodnode = (struct MemberFlood*) MyMalloc(sizeof(struct MemberFlood));
-  memset(floodnode, 0, sizeof(struct MemberFlood));
   floodnode->time = CurrentTime;
   floodnode->next_memberflood = NULL;
   if(floodcount > 0)