From dede2cdd0e10baa81d370b9bee07acccfa3211d1 Mon Sep 17 00:00:00 2001 From: fidian Date: Mon, 25 Jun 2001 17:09:34 +0000 Subject: [PATCH] Viewing my Sent messages (#1002 - 902) caused a buffer overflow or something 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 | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/functions/imap_messages.php b/functions/imap_messages.php index 076b86c6..00ca7ef8 100755 --- a/functions/imap_messages.php +++ b/functions/imap_messages.php @@ -63,13 +63,34 @@ $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(); @@ -82,10 +103,12 @@ $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); @@ -96,12 +119,12 @@ echo $r[0] . "
\n"; exit; } - if (!count($id2index[$regs[1]])) { + if (! isset($id2index[$regs[1]]) || !count($id2index[$regs[1]])) { set_up_language($squirrelmail_language); echo "
\n"; echo _("ERROR : Could not complete request."); echo "
\n"; - echo _("Unknown messagenumber in reply from server: "); + echo _("Unknown message number in reply from server: "); echo $regs[1] . "

\n"; exit; } @@ -222,8 +245,7 @@ } 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; } @@ -233,7 +255,7 @@ 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); -- 2.25.1