Revision: 1928
http://undernet-ircu.svn.sourceforge.net/undernet-ircu/?rev=1928&view=rev
Author: entrope
Date: 2010-01-03 21:04:54 +0000 (Sun, 03 Jan 2010)
Log Message:
-----------
Fix SF bug #2803888 by checking for conversion between +D and +d on every mode
buffer flush.
Modified Paths:
--------------
ircu2/branches/u2_10_12_branch/ChangeLog
ircu2/branches/u2_10_12_branch/ircd/channel.c
Modified: ircu2/branches/u2_10_12_branch/ChangeLog
===================================================================
--- ircu2/branches/u2_10_12_branch/ChangeLog 2010-01-03 20:43:17 UTC (rev
1927)
+++ ircu2/branches/u2_10_12_branch/ChangeLog 2010-01-03 21:04:54 UTC (rev
1928)
@@ -1,5 +1,12 @@
2010-01-03 Michael Poole <[email protected]>
+ * 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 <[email protected]>
+
* ircd/m_server.c (check_loop_and_lh): Never return 1 when we kill
another server. Update the squit message text for maxhops and hub
violations.
Modified: ircu2/branches/u2_10_12_branch/ircd/channel.c
===================================================================
--- ircu2/branches/u2_10_12_branch/ircd/channel.c 2010-01-03 20:43:17 UTC
(rev 1927)
+++ ircu2/branches/u2_10_12_branch/ircd/channel.c 2010-01-03 21:04:54 UTC
(rev 1928)
@@ -1489,6 +1489,20 @@
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 @@
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_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);
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
Patches mailing list
[email protected]
http://undernet.sbg.org/mailman/listinfo/patches