diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2019-06-06 15:54:12 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2019-06-06 15:55:46 +0200 |
commit | f5b44c7e8a55978b5e3c3511b310ab8f09beaa97 (patch) | |
tree | d2d475502d9f828d5b08157a9b5fd1229418ce73 | |
parent | c358c280df6e81facad4045320cfdb1149a91463 (diff) | |
download | php-git-f5b44c7e8a55978b5e3c3511b310ab8f09beaa97.tar.gz |
Fix bug #78094: File Search Problem Excessive Time
Instead of checking GetBinaryType() for each file, we do a much cheaper
pre-check whether the filename extension matches .exe or .com, and call
GetBinaryType() only in this case. For BC we also report .bat and .cmd
files as executables again.
The patch has been provided by @weltling.
-rw-r--r-- | win32/ioutil.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/win32/ioutil.c b/win32/ioutil.c index 7f8948192e..669876da38 100644 --- a/win32/ioutil.c +++ b/win32/ioutil.c @@ -925,9 +925,19 @@ static int php_win32_ioutil_fstat_int(HANDLE h, php_win32_ioutil_stat_t *buf, co buf->st_mode = 0; if (!is_dir) { - DWORD type; - if (GetBinaryTypeW(pathw, &type)) { + if (pathw_len >= 4 && + pathw[pathw_len-4] == L'.') { + if (_wcsnicmp(pathw+pathw_len-3, L"exe", 3) == 0 || + _wcsnicmp(pathw+pathw_len-3, L"com", 3) == 0) { + DWORD type; + if (GetBinaryTypeW(pathw, &type)) { + buf->st_mode |= (S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)); + } + /* The below is actually incorrect, but keep for BC. */ + } else if (_wcsnicmp(pathw+pathw_len-3, L"bat", 3) == 0 || + _wcsnicmp(pathw+pathw_len-3, L"cmd", 3) == 0) { buf->st_mode |= (S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)); + } } } |