Fix SF bug #2596914 (/mode +v nick:level gives oplevel).
authorMichael Poole <mdpoole@troilus.org>
Mon, 6 Jul 2009 01:27:24 +0000 (01:27 +0000)
committerMichael Poole <mdpoole@troilus.org>
Mon, 6 Jul 2009 01:27:24 +0000 (01:27 +0000)
git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/branches/u2_10_12_branch@1915 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ChangeLog
ircd/channel.c

index a865be6bff5b7b296bbc42df35b065f6bd62a58f..01670841f1cc524af6bec16ce7aa667dedaaba33 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-05  Michael Poole <mdpoole@troilus.org>
+
+       * ircd/channel.c (mode_parse_client): Ignore anything after a
+       colon when the mode is CHFL_VOICE or the mode is being removed.
+
 2009-07-04  Michael Poole <mdpoole@troilus.org>
 
        * ircd/s_auth.c (find_conf_client): New function.
index ee5a887640a00fa4b52eccba786f8e6c6e45b4a2..a7ae5128e5306dfab9ef84793db77c90e0a6ad62 100644 (file)
@@ -2989,17 +2989,19 @@ mode_parse_client(struct ParseState *state, int *flag_p)
     if (colon != NULL) {
       *colon++ = '\0';
       req_oplevel = atoi(colon);
-      if (!(state->flags & MODE_PARSE_FORCE)
+      if (*flag_p == CHFL_VOICE || state->dir == MODE_DEL) {
+        /* Ignore the colon and its argument. */
+      } else if (!(state->flags & MODE_PARSE_FORCE)
           && state->member
           && (req_oplevel < OpLevel(state->member)
               || (req_oplevel == OpLevel(state->member)
                   && OpLevel(state->member) < MAXOPLEVEL)
-              || req_oplevel > MAXOPLEVEL))
+              || req_oplevel > MAXOPLEVEL)) {
         send_reply(state->sptr, ERR_NOTLOWEROPLEVEL,
                    t_str, state->chptr->chname,
                    OpLevel(state->member), req_oplevel, "op",
                    OpLevel(state->member) == req_oplevel ? "the same" : "a higher");
-      else if (req_oplevel <= MAXOPLEVEL)
+      else if (req_oplevel <= MAXOPLEVEL)
         oplevel = req_oplevel;
     }
     /* find client we're manipulating */