Просмотр исходного кода

* Port [3941] to 1.2.16 from trunk
* Cleanup a buffer overflow in .mmode
* Make mass_mode use similar bursting as +take



svn: 3942

Bryan Drewery 17 лет назад
Родитель
Сommit
c69473d658
1 измененных файлов с 24 добавлено и 14 удалено
  1. 24 14
      src/mod/irc.mod/cmdsirc.c

+ 24 - 14
src/mod/irc.mod/cmdsirc.c

@@ -559,11 +559,11 @@ static void cmd_op(int idx, char *par)
 static void mass_mode(const char* chname, const char* mode, char *par)
 static void mass_mode(const char* chname, const char* mode, char *par)
 {
 {
   char list[101] = "", buf[2048] = "";
   char list[101] = "", buf[2048] = "";
-  size_t list_len = 0, buf_len = 0;
+  size_t list_len = 0, buf_len = 0, cnt = 0;
+  register const unsigned short max_lines = floodless ? 15 : default_alines;
+  unsigned short lines = 0;
 
 
   while (par[0]) {
   while (par[0]) {
-    size_t cnt = 0;
-
     *(buf + buf_len++) = 'M';
     *(buf + buf_len++) = 'M';
     *(buf + buf_len++) = 'O';
     *(buf + buf_len++) = 'O';
     *(buf + buf_len++) = 'D';
     *(buf + buf_len++) = 'D';
@@ -578,7 +578,7 @@ static void mass_mode(const char* chname, const char* mode, char *par)
 
 
       /* Make list of nicks */
       /* Make list of nicks */
       const char* nick = newsplit(&par);
       const char* nick = newsplit(&par);
-      list_len += strlcpy(list + list_len, nick, sizeof(list) - list_len); 
+      list_len += strlcpy(list + list_len, nick, sizeof(list) - list_len);
       if ((++cnt < modesperline) && par[0])
       if ((++cnt < modesperline) && par[0])
         *(list + list_len++) = ' ';
         *(list + list_len++) = ' ';
     }
     }
@@ -588,10 +588,18 @@ static void mass_mode(const char* chname, const char* mode, char *par)
     buf_len += strlcpy(buf + buf_len, list, sizeof(buf) - buf_len);
     buf_len += strlcpy(buf + buf_len, list, sizeof(buf) - buf_len);
     *(buf + buf_len++) = '\r';
     *(buf + buf_len++) = '\r';
     *(buf + buf_len++) = '\n';
     *(buf + buf_len++) = '\n';
-    list[0] = list_len = 0;
+
+    if (++lines >= max_lines) {
+      buf[buf_len] = 0;
+      tputs(serv, buf, buf_len);
+      buf[0] = buf_len = lines = 0;
+    }
+    list[0] = list_len = cnt = 0;
+  }
+  if (buf[0]) {
+    buf[buf_len] = 0;
+    tputs(serv, buf, buf_len);
   }
   }
-  buf[buf_len] = 0;
-  tputs(serv, buf, buf_len);
 }
 }
 
 
 void mass_request(char *botnick, char *code, char *par)
 void mass_request(char *botnick, char *code, char *par)
@@ -886,9 +894,11 @@ static void cmd_mmode(int idx, char *par)
   while (bots) {
   while (bots) {
     work = work_list[bpos] = (char*) my_calloc(1, work_size);
     work = work_list[bpos] = (char*) my_calloc(1, work_size);
 
 
-    if (local)
-      simple_snprintf(work, work_size, "%s %s", mode, chan->dname);
-    else if (!simul)
+    if (local) {
+      strlcpy(work, mode, work_size);
+      strlcat(work, " ", work_size);
+      strlcat(work, chan->dname, work_size);
+    } else if (!simul)
       simple_snprintf(work, work_size, "mr %s %s", mode, chan->dname);
       simple_snprintf(work, work_size, "mr %s %s", mode, chan->dname);
     else
     else
       work[0] = 0;
       work[0] = 0;
@@ -896,8 +906,8 @@ static void cmd_mmode(int idx, char *par)
     /* Make list of assumed lines (alines) */
     /* Make list of assumed lines (alines) */
     for (i = 0; i < amodes; ++i) {
     for (i = 0; i < amodes; ++i) {
       if (overlaps[tpos]++ < overlap) {
       if (overlaps[tpos]++ < overlap) {
-        strcat(work, " ");
-        strcat(work, targets[tpos]->nick);
+        strlcat(work, " ", work_size);
+        strlcat(work, targets[tpos]->nick, work_size);
       }
       }
       if (++tpos >= targetcount)
       if (++tpos >= targetcount)
         tpos = 0;
         tpos = 0;
@@ -908,8 +918,8 @@ static void cmd_mmode(int idx, char *par)
       int atpos = tpos;
       int atpos = tpos;
       for (i = 0; i < (smodes - amodes); ++i) {
       for (i = 0; i < (smodes - amodes); ++i) {
         if (overlaps[atpos]++ < overlap) {
         if (overlaps[atpos]++ < overlap) {
-          strcat(work, " ");
-          strcat(work, targets[atpos]->nick);
+          strlcat(work, " ", work_size);
+          strlcat(work, targets[atpos]->nick, work_size);
         }
         }
 	if (++atpos >= targetcount)
 	if (++atpos >= targetcount)
           atpos = 0;
           atpos = 0;