From c601562cff3f5bb2780831cebde36a7d74dd0c99 Mon Sep 17 00:00:00 2001 From: Michael Dale Date: Wed, 14 Oct 2009 21:39:52 +0000 Subject: [PATCH] * (bug 21140) Fixed Upload Form for using an Antivirus Program on Windows --- includes/GlobalFunctions.php | 52 ++++++++++++++++++++++++++++++++++ includes/upload/UploadBase.php | 4 ++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index c23a64c860..f762ec02bc 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -3346,3 +3346,55 @@ function wfBCP47( $code ) { $langCode = implode ( '-' , $codeBCP ); return $langCode; } + +/* Fixes shell_exec problems on Windows + * From http://www.php.net/manual/de/function.shell-exec.php#52826 via bug 21140 + */ +function wfRunExternal($cmd,&$code) { + $descriptorspec = array( + 0 => array("pipe", "r"), // stdin is a pipe that the child will read from + 1 => array("pipe", "w"), // stdout is a pipe that the child will write to + 2 => array("pipe", "w") // stderr is a file to write to + ); + + $pipes= array(); + $process = proc_open($cmd, $descriptorspec, $pipes); + + $output= ""; + + if (!is_resource($process)) return false; + + #close child's input imidiately + fclose($pipes[0]); + + stream_set_blocking($pipes[1],false); + stream_set_blocking($pipes[2],false); + + $todo= array($pipes[1],$pipes[2]); + + while( true ) { + $read= array(); + if( !feof($pipes[1]) ) $read[]= $pipes[1]; + if( !feof($pipes[2]) ) $read[]= $pipes[2]; + + if (!$read) break; + + $ready= stream_select($read, $write=NULL, $ex= NULL, 2); + + if ($ready === false) { + break; #should never happen - something died + } + + foreach ($read as $r) { + $s= fread($r,1024); + $output.= $s; + } + } + + fclose($pipes[1]); + fclose($pipes[2]); + + $code= proc_close($process); + + return $output; +} diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php index 8d8de4eac0..7926861bd5 100644 --- a/includes/upload/UploadBase.php +++ b/includes/upload/UploadBase.php @@ -814,11 +814,12 @@ abstract class UploadBase { # Ask me (Duesentrieb) about it if it's ever needed. $output = array(); if ( wfIsWindows() ) { - exec( "$command", $output, $exitCode ); + $output = wfRunExternal($command, $exitCode); } else { exec( "$command 2>&1", $output, $exitCode ); } + # map exit code to AV_xxx constants. $mappedCode = $exitCode; if ( $exitCodeMap ) { @@ -829,6 +830,7 @@ abstract class UploadBase { } } + if ( $mappedCode === AV_SCAN_FAILED ) { # scan failed (code was mapped to false by $exitCodeMap) wfDebug( __METHOD__ . ": failed to scan $file (code $exitCode).\n" ); -- 2.20.1