Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ PHP NEWS
. Fixed crypt() tests on musl when using --with-external-libcrypt
(Michael Orlitzky).

- Streams:
. Fixed bug GH-16889 (stream_select() timeout useless for pipes on Windows).
(cmb)

- Windows:
. Fixed bug GH-10992 (Improper long path support for relative paths). (cmb,
nielsdos)
Expand Down
3 changes: 3 additions & 0 deletions UPGRADING
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,9 @@ PHP 8.5 UPGRADE NOTES
PHP_RELEASE_VERSION are now always numbers. Previously, they have been
strings for buildconf builds.

* --enable-sanitzer is now supported for MSVC builds. This enables ASan and
debug assertions, and is supported as of MSVC 16.10 and Windows 10.

* COM:
. The extension is now build shared by default; previously it defaulted to a
static extension, although the official Windows binaries built a shared
Expand Down
16 changes: 6 additions & 10 deletions ext/intl/config.w32
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
ARG_ENABLE("intl", "Enable internationalization support", "no");

if (PHP_INTL != "no") {
if (CHECK_LIB("icuuc.lib", "intl", PHP_INTL) &&
if (CHECK_LIB("icudt.lib", "intl", PHP_INTL) &&
CHECK_LIB("icuin.lib", "intl", PHP_INTL) &&
CHECK_LIB("icuio.lib", "intl", PHP_INTL) &&
CHECK_LIB("icuuc.lib", "intl", PHP_INTL) &&
CHECK_HEADER_ADD_INCLUDE("unicode/utf.h", "CFLAGS_INTL")) {
// always build as shared - zend_strtod.c/ICU type conflict
EXTENSION("intl", "php_intl.c intl_convert.c intl_convertcpp.cpp intl_error.c ", true,
Expand Down Expand Up @@ -116,16 +119,9 @@ if (PHP_INTL != "no") {
codepointiterator_methods.cpp ",
"intl");

ADD_FLAG("LIBS_INTL", "icudt.lib icuin.lib icuio.lib");

/* Compat for ICU before 58.1.*/
if (CHECK_LIB("icule.lib", "intl", PHP_INTL)) {
ADD_FLAG("LIBS_INTL", "icule.lib");
}
if (CHECK_LIB("iculx.lib", "intl", PHP_INTL)) {
ADD_FLAG("LIBS_INTL", "iculx.lib");
}

CHECK_LIB("icule.lib", "intl", PHP_INTL);
CHECK_LIB("iculx.lib", "intl", PHP_INTL);
ADD_FLAG("CFLAGS_INTL", "/std:c++17 /EHsc /DUNISTR_FROM_CHAR_EXPLICIT=explicit /DUNISTR_FROM_STRING_EXPLICIT=explicit /DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1 /DU_HIDE_OBSOLETE_UTF_OLD_H=1");
} else {
WARNING("intl not enabled; libraries and/or headers not found");
Expand Down
11 changes: 2 additions & 9 deletions ext/standard/tests/streams/bug49936_win32.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,10 @@ default_socket_timeout=2

$dir = 'ftp://your:self@localhost/';

var_dump(opendir($dir));
var_dump(opendir($dir));
var_dump(@opendir($dir));
var_dump(@opendir($dir));

?>
--EXPECTF--
Warning: opendir(): connect() failed: %s in %s on line %d

Warning: opendir(ftp://...@localhost/): Failed to open directory: operation failed in %s on line %d
bool(false)

Warning: opendir(): connect() failed: %s in %s on line %d

Warning: opendir(ftp://...@localhost/): Failed to open directory: operation failed in %s on line %d
bool(false)
5 changes: 3 additions & 2 deletions ext/standard/tests/streams/bug60602.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ if (is_resource($p)) {
$data = '';

while (1) {
$r = [$pipes[1]];
$w = $e = NULL;
$n = stream_select($pipes, $w, $e, 300);
$n = stream_select($r, $w, $e, 300);

if ($n === false) {
echo "no streams \n";
Expand All @@ -29,7 +30,7 @@ if (is_resource($p)) {
proc_terminate($p, 9);
break;
} else if ($n > 0) {
$line = fread($pipes[1], 8192);
$line = fread($r[0], 8192);
if (strlen($line) == 0) {
/* EOF */
break;
Expand Down
5 changes: 3 additions & 2 deletions ext/standard/tests/streams/bug64770.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ if (is_resource($p)) {
$data = '';

while (1) {
$r = [$pipes[1]];
$w = $e = NULL;
$n = stream_select($pipes, $w, $e, 300);
$n = stream_select($r, $w, $e, 300);

if ($n === false) {
echo "no streams \n";
Expand All @@ -29,7 +30,7 @@ if (is_resource($p)) {
proc_terminate($p, 9);
break;
} else if ($n > 0) {
$line = fread($pipes[1], 8192);
$line = fread($r[0], 8192);
if (strlen($line) == 0) {
/* EOF */
break;
Expand Down
26 changes: 26 additions & 0 deletions ext/standard/tests/streams/gh16889.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
--TEST--
GH-16889 (stream_select() timeout useless for pipes on Windows)
--FILE--
<?php
$desc = [
["pipe", "r"],
["pipe", "w"],
["pipe", "w"],
];
// open process which won't produce output for 10s
$proc = proc_open([PHP_BINARY, "-r", "sleep(10); echo 'finish';"], $desc, $pipes);
$read = [$pipes[1]];
$write = null;
$except = null;
$time0 = microtime(true);
// select STDOUT pipe of process for 1ms
if (stream_select($read, $write, $except, 0, 1000)) {
var_dump(fread($read[0], 1));
}
// avoid blocking of finishing the test process
proc_terminate($proc);
$time1 = microtime(true);
var_dump($time1 - $time0 < 1);
?>
--EXPECT--
bool(true)
16 changes: 14 additions & 2 deletions win32/build/config.w32
Original file line number Diff line number Diff line change
Expand Up @@ -356,8 +356,20 @@ if (PHP_SECURITY_FLAGS == "yes") {
}

ARG_WITH("uncritical-warn-choke", "Disable some uncritical warnings", "yes");
ARG_ENABLE("sanitizer", "Enable ASan and UBSan extensions", "no");
if (CLANG_TOOLSET) {
ARG_ENABLE("sanitizer", "Enable ASan (and UBSan) extensions", "no");
if (PHP_SANITIZER == "yes" && PHP_DEBUG == "yes") {
ERROR("Use of both --enable-sanitizer and --enable-debug not allowed.");
}
if (PHP_SANITIZER == "yes" && PHP_DEBUG_PACK == "no") {
ERROR("--enable-sanitizer requires --enable-debug-pack");
}
if (VS_TOOLSET) {
if (PHP_SANITIZER == "yes") {
if (COMPILER_NUMERIC_VERSION < 1929) {
ERROR("MSVC at least 16.10 required for sanitation plugins");
}
}
} else if (CLANG_TOOLSET) {
if (PHP_UNCRITICAL_WARN_CHOKE != "no") {
ADD_FLAG("CFLAGS", "-Wno-ignored-attributes -Wno-deprecated-declarations -Wno-missing-braces " +
"-Wno-logical-op-parentheses -Wno-msvc-include -Wno-invalid-source-encoding -Wno-unknown-pragmas " +
Expand Down
10 changes: 8 additions & 2 deletions win32/build/confutils.js
Original file line number Diff line number Diff line change
Expand Up @@ -1246,6 +1246,8 @@ function SAPI(sapiname, file_list, makefiletarget, cflags, obj_dir)
if (PHP_SANITIZER == "yes") {
if (CLANG_TOOLSET) {
add_asan_opts("CFLAGS_" + SAPI, "LIBS_" + SAPI, (is_lib ? "ARFLAGS_" : "LDFLAGS_") + SAPI);
} else if (VS_TOOLSET) {
ADD_FLAG("CFLAGS", "/fsanitize=address");
}
}

Expand Down Expand Up @@ -3442,8 +3444,12 @@ function toolset_setup_build_mode()
ADD_FLAG("LDFLAGS", "/incremental:no /debug /opt:ref,icf");
}
ADD_FLAG("CFLAGS", "/LD /MD");
if (PHP_SANITIZER == "yes" && CLANG_TOOLSET) {
ADD_FLAG("CFLAGS", "/Od /D NDebug /D NDEBUG /D ZEND_WIN32_NEVER_INLINE /D ZEND_DEBUG=0");
if (PHP_SANITIZER == "yes") {
if (VS_TOOLSET) {
ADD_FLAG("CFLAGS", "/Ox /U NDebug /U NDEBUG /D ZEND_DEBUG=1");
} else if (CLANG_TOOLSET) {
ADD_FLAG("CFLAGS", "/Od /D NDebug /D NDEBUG /D ZEND_WIN32_NEVER_INLINE /D ZEND_DEBUG=0");
}
} else {
// Equivalent to Release_TSInline build -> best optimization
ADD_FLAG("CFLAGS", "/Ox /D NDebug /D NDEBUG /GF /D ZEND_DEBUG=0");
Expand Down
14 changes: 11 additions & 3 deletions win32/select.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
* - If you supply only sockets, this simply passes through to winsock select().
* - If you supply file handles, there is no way to distinguish between
* ready for read/write or OOB, so any set in which the handle is found will
* be marked as ready.
* be marked as ready. Pipes will be checked if they are ready for read, though.
* - If you supply a mixture of handles and sockets, the system will interleave
* calls between select() and WaitForMultipleObjects(). The time slicing may
* cause this function call to take up to 100 ms longer than you specified.
Expand Down Expand Up @@ -135,15 +135,23 @@ PHPAPI int php_select(php_socket_t max_fd, fd_set *rfds, fd_set *wfds, fd_set *e
for (i = 0; i < n_handles; i++) {
if (WAIT_OBJECT_0 == WaitForSingleObject(handles[i], 0)) {
if (SAFE_FD_ISSET(handle_slot_to_fd[i], rfds)) {
FD_SET((uint32_t)handle_slot_to_fd[i], &aread);
DWORD avail_read = 0;
if (GetFileType(handles[i]) != FILE_TYPE_PIPE
|| !PeekNamedPipe(handles[i], NULL, 0, NULL, &avail_read, NULL)
|| avail_read > 0
) {
FD_SET((uint32_t)handle_slot_to_fd[i], &aread);
retcode++;
}
}
if (SAFE_FD_ISSET(handle_slot_to_fd[i], wfds)) {
FD_SET((uint32_t)handle_slot_to_fd[i], &awrite);
retcode++;
}
if (SAFE_FD_ISSET(handle_slot_to_fd[i], efds)) {
FD_SET((uint32_t)handle_slot_to_fd[i], &aexcept);
retcode++;
}
retcode++;
}
}
}
Expand Down
Loading