From: Michael Poole Date: Sun, 3 Jan 2010 21:04:54 +0000 (+0000) Subject: Fix SF bug #2803888 by checking for conversion between +D and +d on every mode buffer... X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=commitdiff_plain;h=f2f202755d04c25b61e2b2a18a347e917acf1b9b Fix SF bug #2803888 by checking for conversion between +D and +d on every mode buffer flush. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/branches/u2_10_12_branch@1928 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- diff --git a/ChangeLog b/ChangeLog index fe178de..b1bbe6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2010-01-03 Michael Poole + + * ircd/channel.c (find_delayed_joins): Move earlier in the file. + (modebuf_flush_int): Move the checks for changing between +D and + +d to here... + (modebuf_flush): ... from here. + 2010-01-03 Michael Poole * ircd/m_server.c (check_loop_and_lh): Never return 1 when we kill diff --git a/ircd/channel.c b/ircd/channel.c index aae13e6..9c0f192 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -1489,6 +1489,20 @@ build_string(char *strptr, int *strptr_i, const char *str1, strptr[(*strptr_i)] = '\0'; } +/** Check a channel for join-delayed members. + * @param[in] chan Channel to search. + * @return Non-zero if any members are join-delayed; false if none are. + */ +static int +find_delayed_joins(const struct Channel *chan) +{ + const struct Membership *memb; + for (memb = chan->members; memb; memb = memb->next_member) + if (IsDelayedJoin(memb)) + return 1; + return 0; +} + /** Flush out the modes * This is the workhorse of our ModeBuf suite; this actually generates the * output MODE commands, HACK notices, or whatever. It's pretty complicated. @@ -1568,6 +1582,23 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all) else app_source = mbuf->mb_source; + /* Must be set if going -D and some clients are hidden */ + if ((mbuf->mb_rem & MODE_DELJOINS) + && !(mbuf->mb_channel->mode.mode & (MODE_DELJOINS | MODE_WASDELJOINS)) + && find_delayed_joins(mbuf->mb_channel)) { + mbuf->mb_channel->mode.mode |= MODE_WASDELJOINS; + mbuf->mb_add |= MODE_WASDELJOINS; + mbuf->mb_rem &= ~MODE_WASDELJOINS; + } + + /* +d must be cleared if +D is set */ + if ((mbuf->mb_add & MODE_DELJOINS) + && (mbuf->mb_channel->mode.mode & MODE_WASDELJOINS)) { + mbuf->mb_channel->mode.mode &= ~MODE_WASDELJOINS; + mbuf->mb_add &= ~MODE_WASDELJOINS; + mbuf->mb_rem |= MODE_WASDELJOINS; + } + /* * Account for user we're bouncing; we have to get it in on the first * bounced MODE, or we could have problems @@ -2024,47 +2055,15 @@ modebuf_mode_client(struct ModeBuf *mbuf, unsigned int mode, modebuf_flush_int(mbuf, 0); } -/** Check a channel for join-delayed members. - * @param[in] chan Channel to search. - * @return Non-zero if any members are join-delayed; false if none are. - */ -static int -find_delayed_joins(const struct Channel *chan) -{ - const struct Membership *memb; - for (memb = chan->members; memb; memb = memb->next_member) - if (IsDelayedJoin(memb)) - return 1; - return 0; -} - /** The exported binding for modebuf_flush() * * @param mbuf The mode buffer to flush. - * + * * @see modebuf_flush_int() */ int modebuf_flush(struct ModeBuf *mbuf) { - /* Check if MODE_WASDELJOINS should be set: */ - /* Must be set if going -D and some clients are hidden */ - if ((mbuf->mb_rem & MODE_DELJOINS) - && !(mbuf->mb_channel->mode.mode & (MODE_DELJOINS | MODE_WASDELJOINS)) - && find_delayed_joins(mbuf->mb_channel)) { - mbuf->mb_channel->mode.mode |= MODE_WASDELJOINS; - mbuf->mb_add |= MODE_WASDELJOINS; - mbuf->mb_rem &= ~MODE_WASDELJOINS; - } - /* Must be cleared if +D is set */ - if ((mbuf->mb_add & MODE_DELJOINS) - && ((mbuf->mb_channel->mode.mode & (MODE_WASDELJOINS | MODE_WASDELJOINS)) - == (MODE_WASDELJOINS | MODE_WASDELJOINS))) { - mbuf->mb_channel->mode.mode &= ~MODE_WASDELJOINS; - mbuf->mb_add &= ~MODE_WASDELJOINS; - mbuf->mb_rem |= MODE_WASDELJOINS; - } - return modebuf_flush_int(mbuf, 1); }