summaryrefslogtreecommitdiff
path: root/program
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2009-07-19 09:28:30 +0000
committeralecpl <alec@alec.pl>2009-07-19 09:28:30 +0000
commita640647edd0776555b9d2083fd968b2317143c8c (patch)
treec3e02d7cd644a2d78f4deb6af096c5a890c6cf97 /program
parent4439d2a86250504857bb201f50c94f60b0b8439d (diff)
- handle big attachments with file pointers to not exceed memory_limit in rcmail_save_attachment()
Diffstat (limited to 'program')
-rw-r--r--program/steps/mail/compose.inc29
1 files changed, 25 insertions, 4 deletions
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 99e925cdb..f8f7f08dd 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -601,7 +601,7 @@ function rcmail_create_draft_body($body, $bodyIsHtml)
function rcmail_write_compose_attachments(&$message, $bodyIsHtml)
{
global $OUTPUT;
-
+echo "^^^^^";
$cid_map = array();
foreach ((array)$message->mime_parts as $pid => $part)
{
@@ -643,20 +643,41 @@ function rcmail_write_inline_attachments(&$message)
function rcmail_save_attachment(&$message, $pid)
{
$part = $message->mime_parts[$pid];
-
+ $mem_limit = parse_bytes(ini_get('memory_limit'));
+ $curr_mem = function_exists('memory_get_usage') ? memory_get_usage() : 16*1024*1024; // safe value: 16MB
+ $data = $path = null;
+
+ // don't load too big attachments into memory
+ if ($mem_limit > 0 && $part->size > $mem_limit - $curr_mem) {
+ $rcmail = rcmail::get_instance();
+ $temp_dir = unslashify($rcmail->config->get('temp_dir'));
+ $path = tempnam($temp_dir, 'rcmAttmnt');
+ if ($fp = fopen($path, 'w')) {
+ $message->get_part_content($pid, $fp);
+ fclose($fp);
+ } else
+ return false;
+ } else {
+ $data = $message->get_part_content($pid);
+ }
+
$attachment = array(
'name' => $part->filename ? $part->filename : 'Part_'.$pid.'.'.$part->ctype_secondary,
'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary,
'content_id' => $part->content_id,
- 'data' => $message->get_part_content($pid),
+ 'data' => $data,
+ 'path' => $path
);
$attachment = rcmail::get_instance()->plugins->exec_hook('save_attachment', $attachment);
+
if ($attachment['status']) {
unset($attachment['data'], $attachment['status']);
return $attachment;
+ } else if ($path) {
+ @unlink($path);
}
-
+
return false;
}