Author: Kev <klmitch@mit.edu>
authorKevin L. Mitchell <klmitch@mit.edu>
Mon, 15 Jan 2001 15:49:43 +0000 (15:49 +0000)
committerKevin L. Mitchell <klmitch@mit.edu>
Mon, 15 Jan 2001 15:49:43 +0000 (15:49 +0000)
Log message:

Maniac- reported that opers weren't being properly displayed by whois; this
was tracked down to bugs in the privilege setting routine.  Bug 1) feattab
had some privileges bit-wise OR'd together, which stopped working when the
privileges became small integers specifying a bit position, rather than the
bits themselves; corrected by splitting up all the OR'd lines.  Bug 2)
antiprivs was not being applied to privs; this turned out to be an off-by-
one error in the loop; corrected by using <= instead of just <

Testing:

Tested for the behavior Maniac- reported; this has been corrected.  Privs
are now being set correctly as well.

git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@375 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ChangeLog
ircd/client.c

index 0d848a3f7e10b823513c45ebd7d84b51edd2b32a..2ff50136d1cdb1b724e89524d30fa927c8806bae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2001-01-15  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/client.c: fixed feattab; basically, when I changed features
+       to use small integers specifying bit positions, instead of the
+       bits themselves, I forgot to update feattab to not | these
+       privileges together; also fixed a bug in the antiprivs masking
+       loop in client_set_privs()--last index wouldn't get parsed
+
 2001-01-03  Kevin L. Mitchell  <klmitch@mit.edu>
 
        * ircd/whowas.c: Completely re-did the old allocation scheme by
index 88cb0f9c77bc6d58ad0177ad003a1f2473c539cc..23a03b86301e5b572d6fcbae962f669a4ce1c791 100644 (file)
@@ -100,10 +100,11 @@ static struct {
   enum Feature feat;
   unsigned int flag;
 } feattab[] = {
-  { (PRIV_WHOX | PRIV_DISPLAY), FEAT_LAST_F, (FLAGS_OPER | FLAGS_LOCOP) },
+  { PRIV_WHOX, FEAT_LAST_F, (FLAGS_OPER | FLAGS_LOCOP) },
+  { PRIV_DISPLAY, FEAT_LAST_F, (FLAGS_OPER | FLAGS_LOCOP) },
   { PRIV_CHAN_LIMIT, FEAT_OPER_NO_CHAN_LIMIT, (FLAGS_OPER | FLAGS_LOCOP) },
-  { (PRIV_MODE_LCHAN | PRIV_LOCAL_OPMODE), FEAT_OPER_MODE_LCHAN,
-    (FLAGS_OPER | FLAGS_LOCOP) },
+  { PRIV_MODE_LCHAN, FEAT_OPER_MODE_LCHAN, (FLAGS_OPER | FLAGS_LOCOP) },
+  { PRIV_LOCAL_OPMODE, FEAT_OPER_MODE_LCHAN, (FLAGS_OPER | FLAGS_LOCOP) },
   { PRIV_WALK_LCHAN, FEAT_OPER_WALK_THROUGH_LMODES,
     (FLAGS_OPER | FLAGS_LOCOP) },
   { PRIV_DEOP_LCHAN, FEAT_NO_OPER_DEOP_LCHAN, (FLAGS_OPER | FLAGS_LOCOP) },
@@ -113,11 +114,15 @@ static struct {
   { PRIV_UNLIMIT_QUERY, FEAT_UNLIMIT_OPER_QUERY, (FLAGS_OPER | FLAGS_LOCOP) },
 
   { PRIV_KILL, FEAT_LOCAL_KILL_ONLY, 0 },
-  { (PRIV_GLINE | PRIV_JUPE | PRIV_OPMODE | PRIV_BADCHAN),
-    FEAT_CONFIG_OPERCMDS, ~0 },
-
-  { (PRIV_PROPAGATE | PRIV_SEE_OPERS), FEAT_LAST_F, FLAGS_OPER },
-  { (PRIV_KILL | PRIV_LOCAL_KILL), FEAT_OPER_KILL, FLAGS_OPER },
+  { PRIV_GLINE, FEAT_CONFIG_OPERCMDS, ~0 },
+  { PRIV_JUPE, FEAT_CONFIG_OPERCMDS, ~0 },
+  { PRIV_OPMODE, FEAT_CONFIG_OPERCMDS, ~0 },
+  { PRIV_BADCHAN, FEAT_CONFIG_OPERCMDS, ~0 },
+
+  { PRIV_PROPAGATE, FEAT_LAST_F, FLAGS_OPER },
+  { PRIV_SEE_OPERS, FEAT_LAST_F, FLAGS_OPER },
+  { PRIV_KILL, FEAT_OPER_KILL, FLAGS_OPER },
+  { PRIV_LOCAL_KILL, FEAT_OPER_KILL, FLAGS_OPER },
   { PRIV_REHASH, FEAT_OPER_REHASH, FLAGS_OPER },
   { PRIV_RESTART, FEAT_OPER_RESTART, FLAGS_OPER },
   { PRIV_DIE, FEAT_OPER_DIE, FLAGS_OPER },
@@ -196,7 +201,7 @@ client_set_privs(struct Client* client)
     PrivSet(&antiprivs, PRIV_BADCHAN);
   }
 
-  for (i = 0; i < _PRIV_IDX(PRIV_LAST_PRIV); i++)
+  for (i = 0; i <= _PRIV_IDX(PRIV_LAST_PRIV); i++)
     privs.priv_mask[i] &= ~antiprivs.priv_mask[i];
 
   cli_privs(client) = privs;