Req #41062 [Com]: is_executable only looks at basic executables
Edit report at https://bugs.php.net/bug.php?id=41062&edit=1
ID: 41062
Comment by: Justin dot Barth at gcinema dot net
Reported by: RQuadling@php.net
Summary: is_executable only looks at basic executables
Status: Assigned
Type: Feature/Change Request
Package: *General Issues
Operating System: Windows XP SP2
PHP Version: 5CVS-2007-04-12 (snap)
Assigned To: pajoye
Block user comment: N
Private report: N
New Comment:
This appears to still be an issue on PHP 7.0.6 , running on windows 2012 r2 datacenter edition.
Previous Comments:
------------------------------------------------------------------------
[2007-04-12 14:07:55] RQuadling@php.net
Description:
------------
For Windows, the is_executable() function only checks the file extensions of exe, com, bat and cmd.
This is incomplete.
Within Windows, there is an environment variable called PATHEXT. This contains a list of extensions
which are executable.
If you type a program whose extension is in this list and the program with that extension is in the
path, then it is executed.
You can easily add .PHP to this list (see UserNote http://www.php.net/manual/en/features.commandline.php#53252).
This is completely normal behaviour on windows.
Using the "FileTypes" mechanism allows any type of file to have an automatic
"handler" (double click a PDF file and Acrobat loads with that file). By also adding the
extension to the PATHEXT environment variable you can type just the name at the CLI and the lovely
windows magic happens automagically.
The standard list of executable types within windows XP is:
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
Mine is:
PATHEXT=.COM;.EXE;.BAT;.CMD;.PHP;.PYC;.PY;
I don't deal with MS VB scripts, but I do deal with PHP and Python!
All of these are "executable" (i.e. the behaviour of an abc.php is the same as an abc.bat
or an abc.exe).
Admittedly this is only on windows, but the current method should either be documented as only being
of limited use on Windows (with the 4 types) or be extended to look at the Windows mechanism (just
like I assume the *ix version looks at an executable bit on the permissions?).
The following is a screen grab to prove the point.
12/04/2007 15:02:28 C:\>type "d:\PHP Quickies\isexec.php"
<?php
echo $argv[0], ' is ', (is_executable($argv[0]) ? '' : 'not '),
'executable';
?>
12/04/2007 15:02:34 C:\>set path
Path=C:\Batch;C:\PHP5;D:\PHP Quickies;C:\Program Files\Windows Resource
Kits\Tools;C:\Python\Lib;C:\Program Files\WinRAR;D:\Sage\UTILS;c:\program
files\imagemagick;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Universal
Extractor\bin;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\Program
Files\Nmap;D:\Cygwin\bin;
PATHEXT=.COM;.EXE;.BAT;.CMD;.PHP;.PYC;.PY;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
12/04/2007 15:02:37 C:\>isexec
D:\PHP Quickies\isexec.php is not executable
Reproduce code:
---------------
<?php
echo is_executable($argv[0]) ? 'Executable' : 'Not executable';
?>
Expected result:
----------------
D:\PHP Quickies\isexec.php is executable
Actual result:
--------------
D:\PHP Quickies\isexec.php is not executable
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=41062&edit=1
Thread (4 messages)