|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-06-29 00:10 UTC] sergio dot nalin at gmail dot com
Description:
------------
PHP vc9 5.3.14, thread safe version + Apache Httpd 2.2.22 + Win 7/Win Server 2008
R2
Each time is_readable in invoked, it leaves an open handle in the httpd process.
Test script:
---------------
for($i=0; $i<100;$i++) {
is_readable("c:\\temp");
}
NOTE: the folder/file must exist for the leak to happen.
Expected result:
----------------
No leaked handles
Actual result:
--------------
100 leaked handles
Patchesis_readable-handle-leak-fix (last revision 2012-11-02 09:44 UTC by krazyest at seznam dot cz)Pull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Oct 26 01:00:01 2025 UTC |
Memory leak confirmed for the following configurations: PHP vc9 5.3.15, thread safe version + Apache Httpd 2.4.2 + Win XP SP3 PHP vc9 5.4.5, thread safe version + Apache Httpd 2.4.2 + Win XP SP3 Running Test script: -------------------- for($i=0; $i<100;$i++) { is_readable("c:\\temp"); } PHP vc9 5.4.5 tested on WAMP stacks: ------------------------------------ XAMPP USB Lite 1.8.0 (Windows XP SP3) Uniform Server 8.5.8-Coral (Windows XP SP3) For details see: http://forum.uniformserver.com/index.php?showtopic=2627&hl= Windows 7 SP1 and Windows Server 2008 R2 (both is 64-bit OS) I agree with above comment, it makes running PHP on a Windows production server impractical.The problem is in TSRM\tsrm_win32.c in function TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC) A local variable HANDLE thread_token; is being initialized by this call if(!OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, &thread_token)) { which is likely to succeed, but even if it does not there is another call if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &thread_token)) { that creates the handle. However, no CloseHandle is called, which causes the handle to leak. We need to change the code like this HANDLE thread_token; -> HANDLE thread_token=NULL; Finished: if(real_path != NULL) { free(real_path); real_path = NULL; } -> Finished: if (thread_token) CloseHandle(thread_token); if(real_path != NULL) { free(real_path); real_path = NULL; }