From 3e8391df9fe5246e4c57b3b088287aaad3ee2f88 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Thu, 26 Mar 2009 02:16:26 +0000 Subject: [PATCH] Fix SourceForge bug #1706672. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/branches/u2_10_12_branch@1910 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- ChangeLog | 6 ++++++ ircd/channel.c | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index dafc314..aec8fc8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-03-25 Michael Poole + + * ircd/channel.c (mode_parse): Add Doxygen comment. When bouncing + a mode from a desynced U-lined server, do not set the modes or + send the change as a HACK(4) message. + 2009-03-17 Michael Poole * ircd/send.c (sendcmdto_match_butone): Move match_it() to the end diff --git a/ircd/channel.c b/ircd/channel.c index 46fb060..471face 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -3194,10 +3194,19 @@ mode_parse_mode(struct ParseState *state, int *flag_p) (state->add & (MODE_SECRET | MODE_PRIVATE))); } -/* +/** * This routine is intended to parse MODE or OPMODE commands and effect the - * changes (or just build the bounce buffer). We pass the starting offset - * as a + * changes (or just build the bounce buffer). + * + * \param[out] mbuf Receives parsed representation of mode change. + * \param[in] cptr Connection that sent the message to this server. + * \param[in] sptr Original source of the message. + * \param[in] chptr Channel whose modes are being changed. + * \param[in] parc Number of valid strings in \a parv. + * \param[in] parv Text arguments representing mode change, with the + * zero'th element containing a string like "+m" or "-o". + * \param[in] flags Set of bitwise MODE_PARSE_* flags. + * \param[in] member If non-null, the channel member attempting to change the modes. */ int mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr, @@ -3357,7 +3366,9 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr, } else { /* Server is desynced; bounce the mode and deop the source * to fix it. */ - state.mbuf->mb_dest &= ~MODEBUF_DEST_CHANNEL; + state.flags &= ~MODE_PARSE_SET; + state.flags |= MODE_PARSE_BOUNCE; + state.mbuf->mb_dest &= ~(MODEBUF_DEST_CHANNEL | MODEBUF_DEST_HACK4); state.mbuf->mb_dest |= MODEBUF_DEST_BOUNCE | MODEBUF_DEST_HACK2; if (!IsServer(state.cptr)) state.mbuf->mb_dest |= MODEBUF_DEST_DEOP; -- 2.20.1