]> granicus.if.org Git - php/commitdiff
Fix bug #78094: File Search Problem Excessive Time
authorChristoph M. Becker <cmbecker69@gmx.de>
Thu, 6 Jun 2019 13:54:12 +0000 (15:54 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Thu, 6 Jun 2019 13:55:46 +0000 (15:55 +0200)
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.

win32/ioutil.c

index 7f8948192e916b76d58602685b0c1803a291ab2b..669876da38548c9f51283896329e92370400cfec 100644 (file)
@@ -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));
+                       }
                }
        }