浏览代码

Viewing my Sent messages (#1002 - 902) caused a buffer overflow or something
on my Courier server. Using 902:1002 worked much better.

Tyler Akins 24 年之前
父节点
当前提交
2b1d122c9d
共有 1 个文件被更改,包括 28 次插入6 次删除
  1. 28 6
      functions/imap_messages.php

+ 28 - 6
functions/imap_messages.php

@@ -63,13 +63,34 @@
       $res = sqimap_get_small_header_list($imap_stream, array($id), $sent);
       $res = sqimap_get_small_header_list($imap_stream, array($id), $sent);
       return $res[0];
       return $res[0];
    }
    }
+   
+   // Sort the message list and crunch to be as small as possible
+   // (overflow could happen, so make it small if possible)
+   function sqimap_message_list_squisher($messages_array) {
+      sort($messages_array, SORT_NUMERIC);
+      $msgs_str = '';
+      while ($messages_array) {
+         $start = array_shift($messages_array);
+	 $end = $start;
+	 while (isset($messages_array[0]) && $messages_array[0] == $end + 1)
+	    $end = array_shift($messages_array);
+	 if ($msgs_str != '')
+	    $msgs_str .= ',';
+	 $msgs_str .= $start;
+	 if ($start != $end)
+	    $msgs_str .= ':' . $end;
+      }
+      
+      return $msgs_str;
+   }   
 
 
    function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) {
    function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) {
+      global $squirrelmail_language, $color;
 
 
       /* Get the small headers for each message in $msg_list */
       /* Get the small headers for each message in $msg_list */
 
 
       $maxmsg = sizeof($msg_list);
       $maxmsg = sizeof($msg_list);
-      $msgs_str = implode(",", $msg_list);
+      $msgs_str = sqimap_message_list_squisher($msg_list);
       $results = array();
       $results = array();
       $read_list = array();
       $read_list = array();
       $sizes_list = array();
       $sizes_list = array();
@@ -82,10 +103,12 @@
          $id2index[$msg_list[$i]] = $i;
          $id2index[$msg_list[$i]] = $i;
       }
       }
 
 
+
       $query = "a001 FETCH $msgs_str BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject Message-Id X-Priority Content-Type)]\r\n";
       $query = "a001 FETCH $msgs_str BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject Message-Id X-Priority Content-Type)]\r\n";
       fputs ($imap_stream, $query);
       fputs ($imap_stream, $query);
       $readin_list = sqimap_read_data_list($imap_stream, "a001", true, $response, $message);
       $readin_list = sqimap_read_data_list($imap_stream, "a001", true, $response, $message);
 
 
+
       foreach ($readin_list as $r) {
       foreach ($readin_list as $r) {
          if (!eregi("^\\* ([0-9]+) FETCH", $r[0], $regs)) {
          if (!eregi("^\\* ([0-9]+) FETCH", $r[0], $regs)) {
             set_up_language($squirrelmail_language);
             set_up_language($squirrelmail_language);
@@ -96,12 +119,12 @@
             echo $r[0] . "</font><br>\n";
             echo $r[0] . "</font><br>\n";
             exit;
             exit;
          }
          }
-         if (!count($id2index[$regs[1]])) {
+         if (! isset($id2index[$regs[1]]) || !count($id2index[$regs[1]])) {
             set_up_language($squirrelmail_language);
             set_up_language($squirrelmail_language);
             echo "<br><b><font color=$color[2]>\n";
             echo "<br><b><font color=$color[2]>\n";
             echo _("ERROR : Could not complete request.");
             echo _("ERROR : Could not complete request.");
             echo "</b><br>\n";
             echo "</b><br>\n";
-            echo _("Unknown messagenumber in reply from server: ");
+            echo _("Unknown message number in reply from server: ");
             echo $regs[1] . "</font><br>\n";
             echo $regs[1] . "</font><br>\n";
             exit;
             exit;
          }
          }
@@ -222,8 +245,7 @@
    }
    }
 
 
    function sqimap_get_flags_list ($imap_stream, $msg_list) {
    function sqimap_get_flags_list ($imap_stream, $msg_list) {
-
-      $msgs_str = implode(",", $msg_list);
+      $msgs_str = sqimap_message_list_squisher($msg_list);
       for ($i = 0; $i < sizeof($msg_list); $i++) {
       for ($i = 0; $i < sizeof($msg_list); $i++) {
          $id2index[$msg_list[$i]] = $i;
          $id2index[$msg_list[$i]] = $i;
       }
       }
@@ -233,7 +255,7 @@
 
 
       for ($i = 0; $i < sizeof($result_list); $i++) {
       for ($i = 0; $i < sizeof($result_list); $i++) {
          if (eregi("^\\* ([0-9]+).*FETCH.*FLAGS(.*)", $result_list[$i][0], $regs)
          if (eregi("^\\* ([0-9]+).*FETCH.*FLAGS(.*)", $result_list[$i][0], $regs)
-             && count($id2index[$regs[1]])) {
+             && isset($id2index[$regs[1]]) && count($id2index[$regs[1]])) {
             $result_flags[$id2index[$regs[1]]] = explode(" ", trim(ereg_replace('[\\(\\)\\\\]', '', $regs[2])));
             $result_flags[$id2index[$regs[1]]] = explode(" ", trim(ereg_replace('[\\(\\)\\\\]', '', $regs[2])));
          } else {
          } else {
             set_up_language($squirrelmail_language);
             set_up_language($squirrelmail_language);