From: sanry at now dot net dot cn Operating system: linux PHP version: 4.3.7 PHP Bug Type: PHP options/info functions Bug description: php crash when --enable-memory-limit'
Description: ------------ Fatal error: Allowed memory size of 4194304 bytes exhausted (tried to allocate 168683 bytes) in /liusra2/now.net.cn/web/vip/include/fun_inc.php on line 162 Fatal error: Allowed memory size of 4194304 bytes exhausted (tried to allocate 133 bytes) in Unknown on line 0 Reproduce code: --------------- <? /*- * PROMailVIP webmail * Copyright (c) 1999-2001 by PROMailVIP network system Inc. * All rights reserved. * Author: Sanry William <[EMAIL PROTECTED]> * $Id: list.php,v 1.25 2003/01/15 07:10:55 sanry Exp $ */ $DEBUG = 1; if($DEBUG) $timebegin = gettimeofday(); include "include/login_inc.php"; include "config/config_inc.php"; include "include/fun_inc.php"; include "language/$CFG_LANGUAGE"."_inc.php"; //获取当前 URL $Cur_URL = $REQUEST_URI; //进入用户临时文件目录 chdir("$CFG_TEMP/$G_DOMAIN/$G_USERNAME"); /* 入口参数: Sortby 排序关键字段 * Method 排序方向 Down Up * Mailbox 邮箱 * Page 页数 * Cmd 命令 Refresh none * Lang 语言 */ $get_Mailbox = trim($HTTP_GET_VARS['Mailbox']); $get_Sortby = trim($HTTP_GET_VARS['Sortby']); $get_Method = trim($HTTP_GET_VARS['Method']); $get_Page = trim($HTTP_GET_VARS['Page']); $get_Cmd = trim($HTTP_GET_VARS['Cmd']); $get_Lang = trim($HTTP_GET_VARS['Lang']); //设置入口参数缺省值 if($get_Sortby=='') $get_Sortby = $CFG_List_SortBy; if(empty($get_Sortby)) $get_Sortby = "Date"; if($get_Method=='') $get_Method = "Down"; if($get_Page==''||$get_Page <1 ) $get_Page = 1; // 检查 $get_Mailbox 参数的可靠性,生成邮箱列表文件名 if( !(list($boxlist,$mailbox) = GetMailboxFolder($get_Mailbox)) ) die("无效的邮箱参数"); if(!is_dir("$G_HOME/Maildir/$mailbox")){ mkdir("$G_HOME/Maildir/$mailbox",0700); mkdir("$G_HOME/Maildir/$mailbox/new",0700); mkdir("$G_HOME/Maildir/$mailbox/cur",0700); mkdir("$G_HOME/Maildir/$mailbox/tmp",0700); } //初始化统计变量 $TotalSize = 0; $list = array(); $Newfile = 0; if($get_Cmd = 'Refresh'){ // 更新邮件清单 ($FD_LIST = fopen($boxlist,"w+"))||die("Error open $boxlist!"); $i = 0; list($Newfile,$list,$size) = GetFolderList($mailbox,"new",$list,$i); $TotalSize = $size; list($i,$list,$size) = GetFolderList($mailbox,"cur",$list,$Newfile); $TotalSize +=$size; // fix the bug of array resort() when count equal to 1 if (count($list)==1){ $list[0] = $list[1]; unset($list[1]); } }else { // 读邮件清单 ($FD_LIST = fopen($boxlist,"r"))||die("Error open $boxlist!"); $i = 0; while(($line = fgets($FD_LIST,1024)) && !feof($FD_LIST) ){ list($n,$Key,$IsNew,$File,$FromName,$From,$Subject,$Date,$Size,$Blocks) = split("\t",$line,10); if($IsNew =="new") $Newfile++; $linelist['File'] = $File; $linelist['From'] = $From; $linelist['Subject'] = $Subject; $linelist['Date'] = $Date; $linelist['Size'] = $Size; $key = $linelist[$get_Sortby]; if ($get_Sortby=='Size') $key = Num2Str(chop($key),8); $line = "$key\t$IsNew\t$File\t$FromName\t$From\t$Subject\t$Date\t$Size\t$Blocks"; $list[$n] = $line; $TotalSize += chop($Blocks); $i++; } fclose($FD_LIST); ($FD_LIST = fopen($boxlist,"w+"))||die("Error open $boxlist!"); } // 排序 if ($get_Method =="Up") {sort($list);$NextMethod="Down";} else {rsort($list);$NextMethod="Up";} reset($list); for($i=0;$i<count($list);$i++){ fputs($FD_LIST,$i."\t".$list[$i]); } fclose($FD_LIST); // 生成邮件清单 $totalmail = count($list); $begin = 0; $end = $totalmail; $totalpage = 1; if($CFG_List_NumPerPage>0){ $totalpage = intval( $totalmail/$CFG_List_NumPerPage ); if ( $totalpage * $CFG_List_NumPerPage < $totalmail ) $totalpage ++; if ($get_Page >$totalpage) $get_Page = $totalpage; if ($get_Page>0) $begin = ($get_Page -1) * $CFG_List_NumPerPage; $end = $get_Page * $CFG_List_NumPerPage; if ($end > $totalmail) $end = $totalmail; } $out = ""; for($k=1,$i=$begin; $i <$end ;$i++,$k++){ list($key,$isnew,$file,$fromname,$from,$subject,$date,$size) = split("\t",$list[$i],9); $j = $i +1; $Border = ""; $ByBorder = ""; if($isnew =="new") { $isnewstr = "<IMG SRC=images/close.gif WIDTH=16 HEIGHT=12 ALT='$LANG_LIST_NEWMAIL'>"; $Border = "<B>"; $ByBorder = "</B>"; } else $isnewstr = "<IMG SRC=images/open.gif WIDTH=16 HEIGHT=14>"; $size = chop($size); list($time1,$time2) = Date2Str($date,$CFG_GMT); $subject = str_replace('"','',$subject); //去除字符串中的"引号,以避免与html 标记发生冲突 $from = str_replace('"','',$from); $out .= "<TR OnMouseOver=\"setPointer(this, 'over')\" OnMouseOut=\"setPointer(this, 'out')\" OnMouseDown=\"setPointer(this,'click')\">\n". "<TD NOWRAP OnMouseDown=Flag($k) ALIGN=right style='font-family:Tahoma'>$j</TD>\n". "<TD NOWRAP><INPUT TYPE=checkbox>$isnewstr</TD>\n". "<TD></TD>\n". "<TD NOWRAP TITLE=\"$from\" OnMouseDown='Flag($k)'>"; $out .="<A href=# OnClick=\"Read('$get_Mailbox',$j);return false;\">"; $out .= $Border." ".TrimStr($fromname,16)." ".$ByBorder."</A></TD>\n". "<TD NOWRAP OnMouseDown=Flag($k)><A href=# OnClick=\"Read('$get_Mailbox',$j);return false;\" title=\" ".$subject." \" >".$Border." ".TrimStr($subject,52)." ".$ByBorder."</A></TD>\n". "<TD NOWRAP TITLE='$time2' style='font-family:Tahoma'>$time1</td>\n". "<TD NOWRAP ALIGN=right style='font-family:Tahoma'>$size</td>\n". "</TR>\n"; } // 生成排序图标 $FromArr = ""; if($get_Sortby=="From"){ $FromArr = "<IMG SRC=images/up.gif>"; if ($get_Method=="Down") $FromArr = "<IMG SRC=images/down.gif>"; } $SubjectArr = ""; if($get_Sortby=="Subject"){ $SubjectArr = "<IMG SRC=images/up.gif>"; if ($get_Method=="Down") $SubjectArr = "<IMG SRC=images/down.gif>"; } $DateArr = ""; if($get_Sortby=="Date"){ $DateArr = "<img src=images/up.gif>"; if ($get_Method=="Down") $DateArr = "<IMG SRC=images/down.gif>"; } $SizeArr = ""; if($get_Sortby=="Size"){ $SizeArr = "<IMG SRC=images/up.gif>"; if ($get_Method=="Down") $SizeArr = "<IMG SRC=images/down.gif>"; } $TotalSize = intval($TotalSize /2)."kB"; $CurMailboxName = $LANG_MAILBOX_NAME[$get_Mailbox]; if( is_file("$CFG_USERBOX_LIST") ){ ($FD_BOXLIST = fopen("$CFG_USERBOX_LIST","r")) || die("Error open .box_list!"); while ( !feof($FD_BOXLIST) ) { $buffer = fgets($FD_BOXLIST, 128); $buffer = chop($buffer); list($foldername,$folder) = split("\t",$buffer); if($CurMailboxName=='') $CurMailboxName=$foldername; if( $folder!='' && $foldername!='' ){ $UserFolder_Out .= "<OPTION VALUE='$folder'>$foldername</OPTION>\n"; } } fclose($FD_BOXLIST); } // Main exit; // 取邮箱目录列表及邮件详细列表 // 参数:(目录名,子目录,列表数组,计数器指针) // 返回:array(邮件数,列表数组) function GetFolderList($mailbox,$home,$list,$i){ global $G_HOME,$get_Sortby,$get_Mailbox; global $CFG_List_MailTime; $myhome = "$G_HOME/Maildir/$mailbox/$home"; $handle=opendir($myhome); while (($file = readdir($handle))!==false){ // echo $file; if ($file !='.' && $file !='..'){ if (!($fd = fopen($myhome."/".$file,'r'))){ echo "error open file"; } $i ++; $header = array(); $header = Parse_head_List($fd); $Fstat = fstat($fd); fclose($fd); if(empty($header['subject'])) $header['subject'] = "-None subject-"; if(empty($header['fromname'])) $header['fromname'] = "-None form-"; // print_r($header); $TotalSize += $Fstat[blocks]; $header['size'] = $Fstat['size']; //转换日期数据格式 $header['date'] = Date2stamp($header['date']); $out = "\t$home\t".$file."\t"; if($get_Mailbox=='draft' || $get_Mailbox=='outbox'){ $out .= $header['to']."\t".$header['to']."\t"; } else $out .= $header['fromname']."\t".$header['fromemail']."\t"; $out .= trim($header['subject'])."\t". $header['date']."\t".$Fstat['size']."\t".$Fstat[blocks]."\n"; $Sortkey = $header[strtolower($get_Sortby)]; if ($get_Sortby=="Size") $Sortkey = Num2Str($Sortkey,8); if ($get_Sortby=="Date") $Sortkey = Num2Str($Sortkey,10); $list[$i] = $Sortkey.$out; } } closedir($handle); return array($i,$list,$TotalSize); } ?> <HTML> <HEAD> <TITLE></TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=<?php echo $CFG_CHARSET[$CFG_LANGUAGE];?>"> <META HTTP-EQUIV="refresh" CONTENT="<?php echo $CFG_List_AutoRefresh;?>"> <LINK REL="stylesheet" HREF="css/provip.css" TYPE="TEXT/CSS"> <style> <!-- BODY { background-position:bottom right; background-repeat:no-repeat; } --> </style> </HEAD> <SCRIPT> <!-- var Alert_Invalid_Target = "<?php echo $LANG_LIST_MOVE_ALERT_MSG3;?>"; //无效的移动,请选择目标邮箱! var Alert_Invalid_Select = "<?php echo $LANG_LIST_MOVE_ALERT_MSG1;?>"; //无效的移动,请选择目标邮箱! var Confirm_Move = "<?php echo $LANG_LIST_MOVE_ALERT_MSG2;?> "; //是否将您选择的邮件移动到 //--> </SCRIPT> <SCRIPT SRC=script/list.js></SCRIPT> <SCRIPT SRC=script/color.js></SCRIPT> <BODY BGCOLOR="#FFFFFF" TEXT="#000000" LEFTMARGIN="0" TOPMARGIN="0" background="images/bg_globe.jpg"> <?include "$CFG_BASEPATH/adv.php";?> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="50" rowspan="2" align="right"><img src="images/mailbox.gif" width="45" height="42"></td> <td height="20"> </td> </tr> <tr> <td height="22" background="images/bglinner.jpg"><TABLE WIDTH="100%" cellpadding cellspacing> <FORM NAME="head" METHOD=post> <TR ALIGN="center"> <TD> <B><?php echo $LANG_LIST_CURRENT_MAILBOX;?>: </B><U><?php echo $CurMailboxName;?></U> <U><?php echo $TotalSize;?></U> </TD> <TD> <B><?php echo $LANG_LIST_TOTAL;?>: </B> <U><?php echo $totalmail;?></U> <B><?php echo $LANG_LIST_NEWMAIL;?>: </B> <U><?php echo $Newfile;?></U> </TD> <TD> <B><?php echo $LANG_LIST_PAGE_TOTAL;?>: </B><U><?php echo $totalpage;?></U> <?php echo $LANG_LIST_PAGE;?> </TD> <TD VALIGN="TOP"> <B><?php echo $LANG_LIST_CURRENT_PAGE;?>: </B> <SELECT NAME="page" onChange="GotoPage(this.form);" CLASS="myselect"> <OPTION VALUE=<?php echo $get_Page;?>><?php echo $get_Page;?></OPTION> <OPTION VALUE=->-</OPTION> <?php for($i=1;$i<=$totalpage;$i++){ echo "<OPTION VALUE=?Mailbox=$get_Mailbox&Page=$i&Sortby=$get_Sortby&Method=$get_Method>$i</OPTION>\n"; } ?> </SELECT> </TD> <TD> <?php if (($get_Page-1) >0){ ?> <A CLASS=standard HREF=<?php echo "?Mailbox=$get_Mailbox&Page=".($get_Page-1)."&Sortby=$get_Sortby&Method=$get_Method";?> > <<<?php echo $LANG_LIST_PREV;?></A> <?php };?> <?php if (($get_Page+1)<=$totalpage) {?> <A CLASS=standard HREF=<?php echo "?Mailbox=$get_Mailbox&Page=".($get_Page+1)."&Sortby=$get_Sortby&Method=$get_Method";?>>>><?php echo $LANG_LIST_NEXT;?></A> <?php };?> </TD> <TD> <A CLASS=standard HREF="<?php echo "?Mailbox=$get_Mailbox&Cmd=Refresh&Page=$get_Page&Sortby=$get_Sortby&Method=$get_Method"; ?>">[<?php echo $LANG_LIST_REFRESH;?>]</A> </TD> </TR> </FORM> </TABLE></td> </tr> </table> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0"> <TR><TD HEIGHT="5"></TD> </TR> </TABLE> <br> <TABLE WIDTH="98%" BORDER="1" CELLSPACING="0" CELLPADDING="0" BORDERCOLOR="#FFFFFF" BGCOLOR="#Efefef" ALIGN="center"> <FORM NAME="list" METHOD="post" ACTION=<?php echo "folder.php?Mailbox=$get_Mailbox&Page=$get_Page&Sortby=$get_Sortby&Method=$get_Method";?>> <TR BGCOLOR="#ADB6BD" HEIGHT="22"> <TD WIDTH=""></TD> <TD WIDTH="5%" align="center" bgcolor="#ADB6BD"><B><?php echo $LNAG_LIST_NUM;?></B></TD> <TD WIDTH="4"></TD> <TD align="center" BGCOLOR="#ADB6BD" TITLE='<?php if($get_Mailbox=='outbox' || $get_Mailbox=='draft') echo $LANG_LIST_SORTBY_TO; else echo $LANG_LIST_SORTBY_FROM; ?>'> <A HREF=?Mailbox=<?php echo "$get_Mailbox&Sortby=From&Method=$NextMethod";?>> <B> <?php switch($get_Mailbox){ case 'outbox': echo $LANG_LIST_TO_AGAIN; break; case 'draft': echo $LANG_LIST_TO_CONTINUE; break; default: echo $LANG_LIST_FROM_PREVIEW; }?> </B></A> <?php echo $FromArr;?> </TD> <TD width="50%" align="center" bgcolor="#ADB6BD" TITLE='<?php echo $LANG_LIST_SORTBY_SUBJECT;?>'> <A HREF=?Mailbox=<?php echo "$get_Mailbox&Sortby=Subject&Method=$NextMethod";?>> <B><?php echo $LANG_LIST_SUBJECT_READ;?></B></A> <?php echo $SubjectArr;?> </TD> <TD WIDTH="15%" align="center" TITLE='<?php echo $LANG_LIST_SORTBY_DATE;?>'> <A HREF=?Mailbox=<?php echo "$get_Mailbox&Sortby=Date&Method=$NextMethod";?>> <B><?php echo $LANG_LIST_DATE;?></B></A> <?php echo $DateArr;?> </TD> <TD WIDTH="12%" ALIGN="center" NOWRAP TITLE='<?php echo $LANG_LIST_SORTBY_SIZE;?>'> <A HREF=?Mailbox=<?php echo "$get_Mailbox&Sortby=Size&Method=$NextMethod";?>> <B><?php echo $LANG_LIST_SIZE;?></B></A><?php echo $SizeArr;?> </TD> </TR> <?php echo $out;?> </FORM> </TABLE> <br> <TABLE WIDTH="98%" BORDER="0" CELLSPACING="0" CELLPADDING="0" ALIGN="CENTER"> <FORM NAME="bottom" METHOD=post> <TR> <TD WIDTH="3%" ALIGN="RIGHT"> <INPUT TYPE="hidden" NAME=all> </TD> <TD WIDTH="47%"> <INPUT TYPE="BUTTON" VALUE="<?php echo $LANG_LIST_SELECTALL;?>" CLASS="myinput" onClick="SelectAll();"> <?php if($get_Mailbox=='inbox'){ ?> <INPUT TYPE="BUTTON" VALUE="<?php echo $LANG_LIST_CHECKPOP;?>" CLASS="myinput" onClick="GetPopMail();"> <?php } ?> <INPUT TYPE="hidden" NAME="begin" VALUE="<?php echo $begin;?>"> <INPUT TYPE="hidden" NAME="end" VALUE="<?php echo $end;?>"> <INPUT TYPE="hidden" NAME="page" VALUE="<?php echo $get_Page;?>"> <INPUT TYPE="hidden" NAME="totalmail" VALUE="<?php echo $totalmail;?>"> <INPUT TYPE="hidden" NAME="loca" VALUE=<?php echo "list.php?Mailbox=$get_Mailbox&Sortby=$get_Sortby&Method=$get_Method";?>> </TD> <TD WIDTH="50%"> <INPUT TYPE="BUTTON" VALUE="<?php echo $LANG_LIST_DELETE;?>" CLASS="myinput" onClick="DelMail('',<?php echo "'$LANG_LIST_DELETE_ALERT_MSG1','$LANG_LIST_DELETE_ALERT_MSG2','$LANG_LIST_DELETE_ALERT_MSG3'";?>)"> <INPUT TYPE="BUTTON" VALUE="<?php echo $LANG_LIST_DELETE_FORCE;?>" CLASS="myinput" onClick="DelMail('force',<?php echo "'$LANG_LIST_DELETE_ALERT_MSG1','$LANG_LIST_DELETE_ALERT_MSG2','$LANG_LIST_DELETE_ALERT_MSG3'";?>)"> <INPUT TYPE="BUTTON" VALUE="<?php echo $LANG_LIST_MOVE;?>" CLASS="myinput" onClick="MoveTo('<?php echo $get_Mailbox;?>')"> -> <SELECT NAME="TargetFolder" CLASS="myselect"> <OPTION VALUE="-"><?php echo $LANG_MAILBOX_SELECT;?></OPTION> <OPTION VALUE="-">--</OPTION> <OPTION VALUE="inbox"><?php echo $LANG_MAILBOX_NAME['inbox'];?></OPTION> <OPTION VALUE="outbox"><?php echo $LANG_MAILBOX_NAME['outbox'];?></OPTION> <OPTION VALUE="draft"><?php echo $LANG_MAILBOX_NAME['draft'];?></OPTION> <OPTION VALUE="trash"><?php echo $LANG_MAILBOX_NAME['trash'];?></OPTION> <OPTION VALUE="-">--</OPTION> <?php //取用户定义邮箱列表 echo $UserFolder_Out; ?> </SELECT> </TD> <TD WIDTH="50%" ALIGN="RIGHT"> <SELECT NAME="language" CLASS="myselect" onChange=SelectLang("<?php echo "Mailbox=$get_Mailbox&Sortby=$get_Sortby&Method=$get_Method&Page=$get_Page";?>")> <OPTION VALUE="-"> <?php echo $LANG_LIST_SELECT_LANG;?> </OPTION> <OPTION VALUE="-">--</OPTION> <OPTION VALUE="en"><?php echo $LANG_LIST_ENGLISH;?></OPTION> <OPTION VALUE="gb"><?php echo $LANG_LIST_CHINESE_GB;?></OPTION> <OPTION VALUE="big"><?php echo $LANG_LIST_CHINESE_BIG;?></OPTION> </SELECT> </TD> </TR> </FORM> </TABLE> <br> <br> <span class="english"> <?php if ($DEBUG){ $timeend = gettimeofday(); $time = $timeend['sec'] - $timebegin['sec']; $time3 = $time + ($timeend['usec']-$timebegin['usec'])/1000000; echo "<CENTER><FONT color=#666666>"."Refresh Time: $time3"."</FONT></CENTER>"; } if($CFG_List_AutoPOP=='yes' && $get_Mailbox=='inbox'){ echo "<SCRIPT> <!-- GetPopMail(); //--> </SCRIPT>"; } ?> </span> </BODY> </HTML> Expected result: ---------------- Wed Jul 07 10:31:31 2004] [warn] pid file /usr/local/apache2/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run? [Wed Jul 07 10:31:31 2004] [notice] Apache/2.0.50 (Unix) PHP/4.3.7 configured -- resuming normal operations Actual result: -------------- php crash -- Edit bug report at http://bugs.php.net/?id=29043&edit=1 -- Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=29043&r=trysnapshot4 Try a CVS snapshot (php5): http://bugs.php.net/fix.php?id=29043&r=trysnapshot5 Fixed in CVS: http://bugs.php.net/fix.php?id=29043&r=fixedcvs Fixed in release: http://bugs.php.net/fix.php?id=29043&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=29043&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=29043&r=needscript Try newer version: http://bugs.php.net/fix.php?id=29043&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=29043&r=support Expected behavior: http://bugs.php.net/fix.php?id=29043&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=29043&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=29043&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=29043&r=globals PHP 3 support discontinued: http://bugs.php.net/fix.php?id=29043&r=php3 Daylight Savings: http://bugs.php.net/fix.php?id=29043&r=dst IIS Stability: http://bugs.php.net/fix.php?id=29043&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=29043&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=29043&r=float