Bug #69472 [Opn->Fbk]: php_sys_readlink ignores misc errors from GetFinalPathNameByHandleA
| From: | ab@php.net | Date: | Mon, 20 Apr 2015 08:15:12 +0000 |
| Subject: | Bug #69472 [Opn->Fbk]: php_sys_readlink ignores misc errors from GetFinalPathNameByHandleA | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-192231@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=69472&edit=1
ID: 69472
Updated by: ab@php.net
Reported by: jan dot starke at t-systems dot com
Summary: php_sys_readlink ignores misc errors from
GetFinalPathNameByHandleA
-Status: Open
+Status: Feedback
Type: Bug
Package: Filesystem function related
Operating System: Windows
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
Thanks for the patch. Could you please add a test for this case as well (check any of the current
*.phpt cases for an example, maybe in ext\standard\tests\file)?
Thanks.
Previous Comments:
------------------------------------------------------------------------
[2015-04-16 18:15:58] jan dot starke at t-systems dot com
Description:
------------
The Windows API functions GetFinalPathNameByHandleA, which is used by php_sys_readlink, has two
different ways of returning an error:
(1) the return value is different from cchFilePath (which is MAXPATHLEN in php_sys_readlink). This
error is raised if the buffer to store the pathname is not large enough to hold the pathname.
(2) the return value is zero. This error can be caused by one of ERROR_PATH_NOT_FOUND,
ERROR_NOT_ENOUGH_MEMORY or ERROR_INVALID_PARAMETER.
Unfortunately, the second case is not handled by php_sys_readlink. As a result, php_sys_readlink
writes an empty string to target and returns 0 as its length, which both is incorrect.
Expected result:
----------------
php_sys_readlink should return -1 if GetFinalPathNameByHandleA returns 0:
<code>
if (dwRet >= MAXPATHLEN || dwRet == 0) {
return -1;
}
</code>
Actual result:
--------------
if GetFinalPathNameByHandleA returns 0, php_sys_readlink returns 0 :-(
This brakes php_check_specific_open_basedir, which in our case creates some problems
<code>
if (dwRet >= MAXPATHLEN) {
return -1;
}
</code>
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=69472&edit=1