summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-06-06 15:54:12 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2019-06-06 15:55:46 +0200
commitf5b44c7e8a55978b5e3c3511b310ab8f09beaa97 (patch)
treed2d475502d9f828d5b08157a9b5fd1229418ce73
parentc358c280df6e81facad4045320cfdb1149a91463 (diff)
downloadphp-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.c14
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));
+ }
}
}