Преглед изворни кода

* Port [3327] to 1.2.14
* Optimize match_cidr a bit
* Optimize cookie queue a little
* Optimize gotmode a little



svn: 3329

Bryan Drewery пре 19 година
родитељ
комит
4baba97704
2 измењених фајлова са 61 додато и 44 уклоњено
  1. 29 19
      src/match.c
  2. 32 25
      src/mod/irc.mod/mode.c

+ 29 - 19
src/match.c

@@ -206,9 +206,9 @@ int _wild_match(register unsigned char *m, register unsigned char *n)
 static inline int
 comp_with_mask(void *addr, void *dest, unsigned int mask)
 {
-  if (memcmp(addr, dest, mask / 8) == 0)
+  if (memcmp(addr, dest, mask >> 3) == 0)
   {
-    int n = mask / 8;
+    int n = mask >> 3;
     int m = ((-1) << (8 - (mask % 8)));
 
     if (mask % 8 == 0 ||
@@ -227,37 +227,47 @@ comp_with_mask(void *addr, void *dest, unsigned int mask)
 int
 match_cidr(const char *s1, const char *s2)
 {
-  sockname_t ipaddr, maskaddr;
-  char address[NICKLEN + UHOSTLEN + 6] = "", mask[NICKLEN + UHOSTLEN + 6] = "", *ipmask = NULL, *ip = NULL, *len = NULL;
-  int cidrlen = 0, aftype = 0, ret = 0;
-
-  egg_bzero(&ipaddr, sizeof(ipaddr));
-  egg_bzero(&maskaddr, sizeof(maskaddr));
-
-  strcpy(mask, s1);
-  strcpy(address, s2);
-
-  ipmask = strrchr(mask, '@');
+  char *ipmask = strrchr(s1, '@');
   if(ipmask == NULL)
     return 0;
 
-  *ipmask++ = '\0';
-
-  ip = strrchr(address, '@');
+  char *ip = strrchr(s2, '@');
   if(ip == NULL)
     return 0;
-  *ip++ = '\0';
 
-  len = strrchr(ipmask, '/');
+  char mask[NICKLEN + UHOSTLEN + 6] = "";
+
+  strlcpy(mask, s1, sizeof(mask));
+  ipmask = mask + (ipmask - s1);
+
+  char address[NICKLEN + UHOSTLEN + 6] = "";
+
+  strlcpy(address, s2, sizeof(address));
+  ip = address + (ip - s2);
+
+  *ipmask++ = '\0';
+
+  char *len = strrchr(ipmask, '/');
   if(len == NULL)
     return 0;
 
   *len++ = '\0';
 
-  cidrlen = atoi(len);
+  int cidrlen = atoi(len);
   if(cidrlen == 0)
     return 0;
 
+  *ip++ = '\0';
+
+  int ret = 0;
+#ifdef USE_IPV6
+  int aftype = 0;
+#endif
+
+  sockname_t ipaddr, maskaddr;
+  egg_bzero(&ipaddr, sizeof(ipaddr));
+  egg_bzero(&maskaddr, sizeof(maskaddr));
+
   if (!strchr(ip, ':') && !strchr(ipmask, ':'))
     aftype = ipaddr.family = maskaddr.family =  AF_INET;
 #ifdef USE_IPV6

+ 32 - 25
src/mod/irc.mod/mode.c

@@ -159,9 +159,9 @@ flush_cookies(struct chanset_t *chan, int pri)
 
     //myindex is how long post is
 
-    egg_strcatn(out, " ", sizeof(out));
-    egg_strcatn(out, post, sizeof(out));
-    egg_strcatn(out, " ", sizeof(out));
+    egg_strcatn(&out[0], " ", sizeof(out));
+    egg_strcatn(&out[1], post, sizeof(out));
+    egg_strcatn(&out[myindex + 1], " ", sizeof(out));
     
     myindex += (p - out) + 2;  //(p-out)=outlen + 2 spaces
     makecookie(&out[myindex], sizeof(out) - myindex, chan->dname, ismember(chan, botname), nicks[0], nicks[1], nicks[2]);
@@ -235,7 +235,7 @@ flush_mode(struct chanset_t *chan, int pri)
     *p++ = 'l';
 
     /* 'sizeof(post) - 1' is used because we want to overwrite the old null */
-    postsize -= sprintf(&post[(sizeof(post) - 1) - postsize], "%d ", chan->limit);
+    postsize -= simple_sprintf(&post[(sizeof(post) - 1) - postsize], "%d ", chan->limit);
 
     chan->limit = 0;
   }
@@ -470,9 +470,9 @@ real_add_mode(struct chanset_t *chan, const char plus, const char mode, const ch
   else {
     /* Typical mode changes */
     if (plus == '+')
-      strcpy(s, chan->pls);
+      strlcpy(s, chan->pls, sizeof(s));
     else
-      strcpy(s, chan->mns);
+      strlcpy(s, chan->mns, sizeof(s));
     if (!strchr(s, mode)) {
       if (plus == '+') {
         chan->pls[strlen(chan->pls) + 1] = 0;
@@ -993,13 +993,11 @@ gotmode(char *from, char *msg)
     /* let's pre-emptively check for mass op/deop, manual ops and cookieops */
 
     if ((channel_active(chan) || channel_pending(chan))) {
-      int i = 0, modecnt = 0, ops = 0, deops = 0, bans = 0, unbans = 0;
-      bool me_opped = 0;
-      char **modes = (char **) my_calloc(1, sizeof(char *));
-      char *nick = NULL, *chg = NULL, s[UHOSTLEN] = "", sign = '+', *mp = NULL, *isserver = NULL;
+      char *isserver = NULL;
       size_t z = strlen(msg);
       struct userrec *u = NULL;
-      memberlist *m = NULL, *mv = NULL;
+      memberlist *m = NULL;
+      char *nick = NULL;
 
       if (!strchr(from, '!'))
         isserver = strdup(from);
@@ -1026,33 +1024,41 @@ gotmode(char *from, char *msg)
       } else
         nick = splitnick(&from);
 
-      chg = newsplit(&msg);
+      int i = 0, modecnt = 0, ops = 0, deops = 0, bans = 0, unbans = 0;
+      bool me_opped = 0;
+      char **modes = (char **) my_calloc(1, sizeof(char *));
+      char s[UHOSTLEN] = "";
+      memberlist *mv = NULL;
+
+
       reversing = 0;
 
-      irc_log(chan, "%s!%s sets mode: %s %s", nick, from, chg, msg);
+      irc_log(chan, "%s!%s sets mode: %s", nick, from, msg);
       get_user_flagrec(u, &user, ch);
 
 
+      if (1) { // Place in block to hint chg/sign to be destroyed when done
       /* Split up the mode: #chan modes param param param param */
+      char *chg = newsplit(&msg);
+      char sign = 0;
       while (*chg) {            /* +MODES PARAM PARAM PARAM ... */
-        if (chg[0] == '+')
-          sign = '+';
-        else if (chg[0] == '-')
-          sign = '-';
+        if (strchr("+-", *chg))
+          sign = *chg;
         else {
-          mp = newsplit(&msg);       /* PARAM as noted above */
+          char* mp = newsplit(&msg);       /* PARAM as noted above */
           fixcolon(mp);
 
           /* Just want o's and b's */
           modes = (char **) my_realloc(modes, (modecnt * sizeof(char *)) + sizeof(char *));
 //      char **modes = (char **) my_calloc(modesperline + 1, sizeof(char *));
 
-          modes[modecnt] = (char *) my_calloc(1, strlen(mp) + 4);
-          simple_sprintf(modes[modecnt], "%c%c %s", sign, chg[0], mp ? mp : "");
-          modecnt++;
+          size_t siz = strlen(mp) + 3 + 1;
+          modes[modecnt] = (char *) my_calloc(1, siz);
+          simple_snprintf(modes[modecnt], siz, "%c%c %s", sign, chg[0], mp ? mp : "");
+          ++modecnt;
           if (chg[0] == 'o') {
             if (sign == '+') {
-              ops++;
+              ++ops;
               if (match_my_nick(mp))
                 me_opped = 1;
             } else {
@@ -1062,12 +1068,13 @@ gotmode(char *from, char *msg)
             }
           } else if (chg[0] == 'b') {
             if (sign == '+')
-              bans++;
+              ++bans;
             else
-              unbans++;
+              ++unbans;
           }
         }
-        chg++;
+        ++chg;
+      }
       }
 
       /* take ASAP */