From: Oscar dot Castillo at jpl dot nasa dot gov Operating system: Solaris 9 PHP version: 5.0.3 PHP Bug Type: *Configuration Issues Bug description: File upload error
Description: ------------ I am using iPlanet 6.0 SP5, Zend 2.5.7 and PHP 5.0.3 on a 64 bit Solaris 9 SunFire V880 (4x4GHz CPU, 8Gb RAM). I have a problem with an HTTP POST command that attempts to upload a file onto the web server and a consistent "File upload error - unable to create a temporary file in Unknown on line 0" error message appears in the error logs. The upload_tmp_dir directory is set to /tmp. The error message disappears with a web server daemon reset (stop/start the web server daemon), but the error begins to occur within 2 to 24 hours again. When the errors occur, the /tmp directory begins to accumulate with php[web_server_pid] files that are zero bytes in size. My upload_max_filesize parameter is configured to 2Mb, however the uploaded files are never above 50kb. I've tried many suggested fixes from the php.net bug reports area, but to no avail. Thanks in advance for your help! Reproduce code: --------------- <?php $debug_level = 2; // 0 = no debug; 10 = most debug if ($debug_level > 9) { phpinfo(); } // // Configurable variables // $BaseDir = './'; $LogFileName = $BaseDir . "RTIU_translator.log"; $SCLK_SCET_Dir = "/afs/jpl/group/casops/dom/data/main/sclkscet/"; // placed in executed shell script $UploadDir = $BaseDir . "Temp/" ; // Where the posted files are placed $TransferDir = $BaseDir . "Xfer/"; // Where the tar file for the translator is created // // Verify resources are available // $LogFile = fopen( $LogFileName,'a'); if (! $LogFile) { print("Logging is disabled, please save all displayed messages if help is needed from IO support<br>"); } // Verify UPLOAD directory if (!file_exists($UploadDir)) { if ($LogFile) { $TmpStr = sprintf("%s VERIFY Upload directory does not exist\n", gmdate("Y-m-d H:i:s") ); // strftime("%Y-%m-%d %T")); fwrite($LogFile, $TmpStr); } if(!mkdir($UploadDir,0774)) { DisplayError("Could not create Upload directory",0); return; } } // Verify TRANSFER directory if (!file_exists($TransferDir)) { if ($LogFile) { $TmpStr = sprintf("%s VERIFY Transfer directory does not exist\n", gmdate("Y-m-d H:i:s") ); // strftime("%Y-%m-%d %T")); fwrite($LogFile, $TmpStr); } print( "Missing Transfer Directory: $TransferDir <br>"); if (!mkdir($TransferDir,0774)) { DisplayError("Could not create Transfer directory",0); return; } } // // Capture form values // $BaseName = escapeshellcmd($_POST['BaseName']); $SequenceID = $_POST['SequenceID']; $SCLK_SCET_File = $_POST['SCLK_SCET_File']; $StartTimeUTC = $_POST['StartTimeUTC']; $StopTimeUTC = $_POST['StopTimeUTC']; $InputType = $_POST['input_type']; // SASF or PRT $OutputType = $_POST['output_type']; // SEQ or IEB $UserFileName = $_FILES['UploadFile']['name']; $StartALF = $_POST['StartALF']; // 0 <= ? $ALF_Partition = $_POST['ALF_Partition']; // DEFAULT or NON_DEFAULT $ALF_Step = $_POST['ALF_Step']; // 4 or 8 $CAS_User = $_SERVER['REMOTE_USER']; $HostSource = $_SERVER['REMOTE_HOST']; // // Debug stuff (POST data) // if ($debug_level > 3) { print( "Upload Directory: $UploadDir <br>"); print( "SCLK/SCET Directory: $SCLK_SCET_Dir <br>"); if ($debug_level > 8) { print ("<pre>"); var_dump($_FILES); var_dump($_POST); print ("</pre>"); } print( "Input Type: $InputType <br>"); print( "Basename: $BaseName <br>"); print( "Upload File: $UserFileName <br>"); print( "Sequence ID: $SequenceID <br>"); print( "SCLK/SCET File: $SCLK_SCET_File <br>"); print( "Start UTC: $StartTimeUTC <br>"); print( "Stop UTC: $StopTimeUTC <br>"); print( "Output Type: $OutputType <br>"); print( "Start ALF: $StartALF <br>"); print( "Partition: $ALF_Partition <br>"); print( "ALF Step: $ALF_Step <br>"); } // // Verify parameter values // print("<H2>Processing an $InputType upload</H2><br>"); // // Log an attempted posting (user & host) // if ($LogFile) { $TmpStr = sprintf("%s REQUEST (%s) %s from %s\n", // strftime("%Y-%m-%d %T"), $BaseName, $CAS_User, $HostSource); gmdate("Y-m-d H:i:s"), $BaseName, $CAS_User, $HostSource); fwrite($LogFile, $TmpStr); } // Check Basename if (strlen($BaseName) == 0) { DisplayError("Basename must be specified to translate a sequence",0); return; } else { if (strlen($BaseName) != 6) { DisplayError("Basename invalid length: '$BaseName'", "Must be 6 alpha-numeric characters"); return; } if (strspn($BaseName,"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") != 6) { DisplayError("Basename invalid character(s): '$BaseName'", "Must be 6 alpha-numeric characters"); return; } } if (is_file("$TransferDir/$BaseName.tar") || is_dir("$TransferDir/$BaseName")) { DisplayError("The specified basename has been previously used", "Please select a different name: $BaseName"); return; } // Check for uploaded file if ($_FILES['UploadFile']['error'] != UPLOAD_ERR_OK) { $TmpStr = $_FILES['UploadFile']['name']; DisplayError("Error uploading sequence file", "$TmpStr"); if ($debug_level > 1) { var_dump($_FILES); var_dump($_POST); } return; } // Verify SASF Parameters if ($InputType == "SASF") { print("<H3>Verifying parameters for SASF processing</H3>"); // Start Times (only if SASF input) if (($StartUTC=Verify_UTC($StartTimeUTC,"Start Time"))) { if (($StopUTC=Verify_UTC($StopTimeUTC,"Stop Time"))) { if ($StopUTC <= $StartUTC) { DisplayError("'Stop Time' not later than 'Start Time'", "Start: $StartTimeUTC<br>Stop: $StopTimeUTC"); return; } } else // Bad Stop Time { return; } } else // Bad Start Time { return; } } else // InputType is PRT { } // // Build translation script // $UploadFile = $UploadDir . "/" . $UserFileName; if (move_uploaded_file($_FILES['UploadFile']['tmp_name'], $UploadFile)) { // print ("Uploaded the $InputType file as $UploadFile<br>"); } else { DisplayError("Could not get uploaded file: '$UserFileName'",0); if ($debug_level > 1) { var_dump($_FILES); var_dump($_POST); } return; } $ScriptFile = "$UploadDir/$BaseName.csh"; $FileHandle = fopen($ScriptFile,"wb"); if (! $FileHandle) { DisplayError("Could not create script file", 0); return; } fwrite($FileHandle,"#!/bin/csh\n"); fwrite($FileHandle,"#\n"); fwrite($FileHandle,"# Script is passed the two programs to be used as parameters.\n"); fwrite($FileHandle,"# The script is started with the working directory containing\n"); fwrite($FileHandle,"# and the uploaded user file (SASF or PRTSEQ)\n\n"); $PrtseqFile = $BaseName . "prtseq"; if ($InputType == "SASF") { fwrite($FileHandle,"\$1 $UserFileName $SequenceID $BaseName $SCLK_SCET_Dir/$SCLK_SCET_File $StartTimeUTC $StopTimeUTC\n"); } else { fwrite($FileHandle,"cp $UserFileName $PrtseqFile\n"); } fwrite($FileHandle,"# Include error check\n\n"); if ($OutputType == "IEB") { fwrite($FileHandle,"\$2 $BaseName $StartALF $ALF_Partition $ALF_Step < $PrtseqFile > $BaseName.seq\n"); } else { fwrite($FileHandle,"\$2 $BaseName < $PrtseqFile > $BaseName.seq\n"); } fwrite($FileHandle,"# Include error check\n"); fwrite($FileHandle,"\n# Calling script is responsible for moving tar.gz to the download directory\n"); fclose($FileHandle); // End of ScriptFile if ($debug_level > 4) { print ("<pre>\n\nScript File Commands ...\n\n"); readfile($ScriptFile); print ("</pre>"); } $TargetDir = $TransferDir . '/' . $BaseName; $BuildCmd = "mkdir -p $TargetDir"; $CmdOutput = system($BuildCmd,$ReturnValue); if ($ReturnValue != 0) { DisplayError("ERROR making workspace for '$BaseName'","Error: '$ReturnValue'"); return; } $BuildCmd = "mv $ScriptFile $UploadFile $TargetDir"; $CmdOutput = system($BuildCmd,$ReturnValue); if ($ReturnValue != 0) { DisplayError("ERROR moving '$UserFileName' to workspace","Error: '$ReturnValue'"); return; } $BuildCmd = "(cd $TransferDir; tar -cf $BaseName.tar $BaseName)"; $CmdOutput = system($BuildCmd,$ReturnValue); if ($ReturnValue != 0) { DisplayError("ERROR transfering '$BaseName' package","Error: '$ReturnValue'"); return; } print ("<H3>Upload successfully completed</H3>"); print ("<p>"); print ("Processing will begin shortly"); print ("</p><p>"); print ("Please check back in a few minutes on the download tab to get "); print ("the translated sequence.<br>It will be called '$BaseName.tar.gz'"); print ("</p>"); // // Log successful upload // if ( $LogFile ) { $TmpStr = sprintf("%s SUBMIT (%s) by %s successfully\n", // strftime("%Y-%m-%d %T"), $BaseName, $CAS_User ); gmdate("Y-m-d H:i:s"), $BaseName, $CAS_User ); fwrite($LogFile,$TmpStr); fclose( $LogFile ); } return; ////// // Verify_UTC function ////// function Verify_UTC ( &$Time, $FieldName ) { $Status = sscanf($Time,"%d-%dT%d:%d:%d",$Year,$Day,$Hour,$Min,$Sec); if ($Status != 5) { DisplayError ("Could not parse $FieldName: '$Time'", "Must be in the form: 'yyyy-dddThh:mm:ss.mmm'"); return 0; } $GMT_Time = mktime($Hour,$Min,$Sec,1,$Day,$Year); $CalcTime = strftime("%Y-%jT%T.000",$GMT_Time); if (strncmp($CalcTime,$Time,(strlen($CalcTime)-4)) == 0) { $Time = $CalcTime; return $GMT_Time; } else { DisplayError ("$FieldName interpreted as invalid: '$Time'",0); return 0; } } ////// // DisplayError function ////// function DisplayError( $ErrorMsg, $Ancillary ) { global $LogFile, $CAS_User, $BaseName; print("<br><big> *** Processing Error ***</big><br>"); print("$ErrorMsg<br>"); if ($Ancillary != NULL) { print("<br>$Ancillary<br>"); } // // Log error in post (user and reason) // if ( $LogFile ) { $TmpStr = sprintf("%s ERROR (%s) %s [%s]\n", // strftime("%Y-%m-%d %T"), $BaseName, $ErrorMsg ); gmdate("Y-m-d H:i:s"), $BaseName, $ErrorMsg, $Ancillary ); fwrite($LogFile,$TmpStr); fclose( $LogFile ); } return; } ?> Expected result: ---------------- The uploaded file is transfered from a client machine onto the web server's local filesystem structure. Actual result: -------------- PHP Warning: File upload error - unable to create a temporary file in Unknown on line 0 -- Edit bug report at http://bugs.php.net/?id=32491&edit=1 -- Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=32491&r=trysnapshot4 Try a CVS snapshot (php5.0): http://bugs.php.net/fix.php?id=32491&r=trysnapshot50 Try a CVS snapshot (php5.1): http://bugs.php.net/fix.php?id=32491&r=trysnapshot51 Fixed in CVS: http://bugs.php.net/fix.php?id=32491&r=fixedcvs Fixed in release: http://bugs.php.net/fix.php?id=32491&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=32491&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=32491&r=needscript Try newer version: http://bugs.php.net/fix.php?id=32491&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=32491&r=support Expected behavior: http://bugs.php.net/fix.php?id=32491&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=32491&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=32491&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=32491&r=globals PHP 3 support discontinued: http://bugs.php.net/fix.php?id=32491&r=php3 Daylight Savings: http://bugs.php.net/fix.php?id=32491&r=dst IIS Stability: http://bugs.php.net/fix.php?id=32491&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=32491&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=32491&r=float No Zend Extensions: http://bugs.php.net/fix.php?id=32491&r=nozend MySQL Configuration Error: http://bugs.php.net/fix.php?id=32491&r=mysqlcfg