From: Michael Poole Date: Sun, 24 Apr 2005 01:41:01 +0000 (+0000) Subject: Fix memory leaks when removing bans or applying overlapped bans. X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=commitdiff_plain;h=a1ee5f37a95ffde83cd53752c05dc2f0807529c9 Fix memory leaks when removing bans or applying overlapped bans. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1380 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- diff --git a/ChangeLog b/ChangeLog index d9f249e..18f8eaa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-04-23 Michael Poole + + * 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 * include/patchlevel.h: Bump to being a beta. diff --git a/ircd/channel.c b/ircd/channel.c index a593438..2d6ce01 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -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); } diff --git a/ircd/ircd_parser.y b/ircd/ircd_parser.y index e2717a7..c5f7375 100644 --- a/ircd/ircd_parser.y +++ b/ircd/ircd_parser.y @@ -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 ';'