Fix SF bug #2803888 by checking for conversion between +D and +d on every mode buffer...
authorMichael Poole <mdpoole@troilus.org>
Sun, 3 Jan 2010 21:04:54 +0000 (21:04 +0000)
committerMichael Poole <mdpoole@troilus.org>
Sun, 3 Jan 2010 21:04:54 +0000 (21:04 +0000)
git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/branches/u2_10_12_branch@1928 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ChangeLog
ircd/channel.c

index fe178de3ae0a774a59e001046f1f9408a45018a2..b1bbe6bd4b8652338c9e7fc3877e88ad77e9ed8f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-01-03  Michael Poole <mdpoole@troilus.org>
+
+       * 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 <mdpoole@troilus.org>
 
        * ircd/m_server.c (check_loop_and_lh): Never return 1 when we kill
index aae13e6e595cfd37babb8773212a6bd0f544393c..9c0f192d2a3cd79502fda636e5d7ada15bfaec89 100644 (file)
@@ -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);
 }