diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 53fa8d33dad6b..18e80ddda32ab 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -127,6 +127,9 @@ PHP_FUNCTION(stream_socket_client) if (timeout_is_null) { timeout = (double)FG(default_socket_timeout); + } else if (!zend_finite(timeout)) { + zend_argument_value_error(4, "must be a finite value"); + RETURN_THROWS(); } context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT); @@ -279,6 +282,9 @@ PHP_FUNCTION(stream_socket_accept) if (timeout_is_null) { timeout = (double)FG(default_socket_timeout); + } else if (!zend_finite(timeout)) { + zend_argument_value_error(2, "must be a finite value"); + RETURN_THROWS(); } php_stream_from_zval(stream, zstream); diff --git a/ext/standard/tests/streams/non_finite_values.phpt b/ext/standard/tests/streams/non_finite_values.phpt new file mode 100644 index 0000000000000..5dba0d3b48266 --- /dev/null +++ b/ext/standard/tests/streams/non_finite_values.phpt @@ -0,0 +1,31 @@ +--TEST-- +Non-finite timeout values in stream functions +--FILE-- +getMessage(), "\n"; + } +} +fclose($socket); + +foreach ([NAN, -NAN, INF, -INF] as $value) { + try { + stream_socket_client("tcp://0.0.0.0:14781", timeout: $value); + } catch (ValueError $e) { + echo $e->getMessage(), "\n"; + } +} +?> +--EXPECT-- +stream_socket_accept(): Argument #2 ($timeout) must be a finite value +stream_socket_accept(): Argument #2 ($timeout) must be a finite value +stream_socket_accept(): Argument #2 ($timeout) must be a finite value +stream_socket_accept(): Argument #2 ($timeout) must be a finite value +stream_socket_client(): Argument #4 ($timeout) must be a finite value +stream_socket_client(): Argument #4 ($timeout) must be a finite value +stream_socket_client(): Argument #4 ($timeout) must be a finite value +stream_socket_client(): Argument #4 ($timeout) must be a finite value