Fix memory leaks when removing bans or applying overlapped bans.
authorMichael Poole <mdpoole@troilus.org>
Sun, 24 Apr 2005 01:41:01 +0000 (01:41 +0000)
committerMichael Poole <mdpoole@troilus.org>
Sun, 24 Apr 2005 01:41:01 +0000 (01:41 +0000)
git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1380 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ChangeLog
ircd/channel.c
ircd/ircd_parser.y

index d9f249ebe25d6c22b7a9cb60122e522605298d78..18f8eaa743ccf1333e1a75727e354cef2b733bda 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-04-23  Michael Poole <mdpoole@troilus.org>
+
+       * ircd/channel.c (apply_ban): Consistently free newban->banstr
+       when the function fails.
+       (mode_process_bans): Free banstr for all BAN_DEL bans.
+
+       * ircd/ircd_parser.y: Fix a few memory leaks from previous commit.
+
 2005-04-23  Michael Poole <mdpoole@troilus.org>
 
        * include/patchlevel.h: Bump to being a beta.
index a593438595df47040b5084914d160d8c803f6675..2d6ce01660f5984d3fbe9c75fa43ae99a81a66c3 100644 (file)
@@ -2696,6 +2696,8 @@ int apply_ban(struct Ban **banlist, struct Ban *newban, int do_free)
       if (!bmatch(ban, newban)) {
         if (do_free)
           free_ban(newban);
+        else
+          MyFree(newban->banstr);
         return 1;
       }
       if (!(ban->flags & (BAN_OVERLAPPED|BAN_DEL))) {
@@ -2732,6 +2734,8 @@ int apply_ban(struct Ban **banlist, struct Ban *newban, int do_free)
   }
   if (do_free)
     free_ban(newban);
+  else
+    MyFree(newban->banstr);
   return 4;
 }
 
@@ -2890,6 +2894,13 @@ mode_process_bans(struct ParseState *state)
     prevban = ban;
   } /* for (prevban = 0, ban = state->chptr->banlist; ban; ban = nextban) { */
 
+  /* Release all masks of removed bans */
+  for (count = 0; count < state->numbans; ++count) {
+    ban = state->banlist + count;
+    if (ban->flags & BAN_DEL)
+      MyFree(ban->banstr);
+  }
+
   if (changed) /* if we changed the ban list, we must invalidate the bans */
     mode_ban_invalidate(state->chptr);
 }
index e2717a74a5d50b071b782adc86a6c6ed4272c9ea..c5f7375caad16994947c738265fd0f103f6d7c09 100644 (file)
@@ -441,6 +441,7 @@ connectpass: PASS '=' QSTRING ';'
 connectclass: CLASS '=' QSTRING ';'
 {
  c_class = find_class($3);
+ MyFree($3);
 };
 connecthost: HOST '=' QSTRING ';'
 {
@@ -936,10 +937,12 @@ pseudoitems: pseudoitem pseudoitems | pseudoitem;
 pseudoitem: pseudoname | pseudoprepend | pseudonick | pseudoflags | error;
 pseudoname: NAME '=' QSTRING ';'
 {
+  MyFree(smap->name);
   smap->name = $3;
 };
 pseudoprepend: PREPEND '=' QSTRING ';'
 {
+  MyFree(smap->prepend);
   smap->prepend = $3;
 };
 pseudonick: NICK '=' QSTRING ';'