Viewing my Sent messages (#1002 - 902) caused a buffer overflow or something
authorfidian <fidian@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Mon, 25 Jun 2001 17:09:34 +0000 (17:09 +0000)
committerfidian <fidian@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Mon, 25 Jun 2001 17:09:34 +0000 (17:09 +0000)
on my Courier server.  Using 902:1002 worked much better.

git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@1423 7612ce4b-ef26-0410-bec9-ea0150e637f0

functions/imap_messages.php

index 076b86c6c3b87eeaa7680c0f02658288de52ce06..00ca7ef83582f04704bf87e34ea0394fce9b5578 100755 (executable)
       $res = sqimap_get_small_header_list($imap_stream, array($id), $sent);
       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) {
+      global $squirrelmail_language, $color;
 
       /* Get the small headers for each message in $msg_list */
 
       $maxmsg = sizeof($msg_list);
-      $msgs_str = implode(",", $msg_list);
+      $msgs_str = sqimap_message_list_squisher($msg_list);
       $results = array();
       $read_list = array();
       $sizes_list = array();
          $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";
       fputs ($imap_stream, $query);
       $readin_list = sqimap_read_data_list($imap_stream, "a001", true, $response, $message);
 
+
       foreach ($readin_list as $r) {
          if (!eregi("^\\* ([0-9]+) FETCH", $r[0], $regs)) {
             set_up_language($squirrelmail_language);
             echo $r[0] . "</font><br>\n";
             exit;
          }
-         if (!count($id2index[$regs[1]])) {
+         if (! isset($id2index[$regs[1]]) || !count($id2index[$regs[1]])) {
             set_up_language($squirrelmail_language);
             echo "<br><b><font color=$color[2]>\n";
             echo _("ERROR : Could not complete request.");
             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";
             exit;
          }
    }
 
    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++) {
          $id2index[$msg_list[$i]] = $i;
       }
 
       for ($i = 0; $i < sizeof($result_list); $i++) {
          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])));
          } else {
             set_up_language($squirrelmail_language);