diff --git a/ext/sockets/socket_addrinfo_lookup.php b/ext/sockets/socket_addrinfo_lookup.php index b46add4f2b5..3142181a578 100644 --- a/ext/sockets/socket_addrinfo_lookup.php +++ b/ext/sockets/socket_addrinfo_lookup.php @@ -44,7 +44,9 @@ public function execute(Frame $frame): void throw new \LogicException('socket_addrinfo_lookup() requires VM context'); } - $host = VmString::coerceTypedStringBuiltinArg($frame->calledArgs[0], 'socket_addrinfo_lookup', 0, 'host'); + // Z_PARAM_STR — soft-null outside strict_types; strict → TypeError (#30337). + // userArgIndex is 0-based for Argument/parameter #N messages (same as socket_connect). + $host = VmString::stringBuiltinArgForFrame($frame, 0, 'socket_addrinfo_lookup', 0, 'host', false); $service = null; if ($argc >= 2) { $service = VmString::coerceNullableStringBuiltinArg( diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 4a23f24e78a..2fc8eaed8fb 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -211,6 +211,7 @@ ./test/compliance/SocketErrorNullOptionalVMTest.php ./test/compliance/SocketBindSoftNullVMTest.php ./test/compliance/SocketConnectSoftNullVMTest.php + ./test/compliance/SocketAddrinfoLookupSoftNullVMTest.php ./test/compliance/SocketSendtoSoftNullVMTest.php ./test/compliance/SocketWriteSoftNullVMTest.php ./test/compliance/SocketSendSoftNullVMTest.php diff --git a/test/compliance/SocketAddrinfoLookupSoftNullVMTest.php b/test/compliance/SocketAddrinfoLookupSoftNullVMTest.php new file mode 100644 index 00000000000..4074454b6ca --- /dev/null +++ b/test/compliance/SocketAddrinfoLookupSoftNullVMTest.php @@ -0,0 +1,30 @@ + self::parsePHPT( + __DIR__.'/cases/sockets/socket_addrinfo_lookup_soft_null.phpt', + 'socket_addrinfo_lookup_soft_null.phpt' + ); + yield 'socket_addrinfo_lookup_null_strict.phpt' => self::parsePHPT( + __DIR__.'/cases/sockets/socket_addrinfo_lookup_null_strict.phpt', + 'socket_addrinfo_lookup_null_strict.phpt' + ); + } + + public function setUp(): void + { + $this->BIN = realpath(__DIR__.'/../../bin/vm.php'); + } +} diff --git a/test/compliance/cases/sockets/socket_addrinfo_lookup_null_strict.phpt b/test/compliance/cases/sockets/socket_addrinfo_lookup_null_strict.phpt new file mode 100644 index 00000000000..5c72491e255 --- /dev/null +++ b/test/compliance/cases/sockets/socket_addrinfo_lookup_null_strict.phpt @@ -0,0 +1,14 @@ +--TEST-- +stdlib socket_addrinfo_lookup(null) TypeError under strict_types (#30337, ext/sockets/sockets.c) +--FILE-- +getMessage(), "\n"; +} +--EXPECT-- +TypeError:socket_addrinfo_lookup(): Argument #1 ($host) must be of type string, null given diff --git a/test/compliance/cases/sockets/socket_addrinfo_lookup_soft_null.phpt b/test/compliance/cases/sockets/socket_addrinfo_lookup_soft_null.phpt new file mode 100644 index 00000000000..0b3f9e4c43f --- /dev/null +++ b/test/compliance/cases/sockets/socket_addrinfo_lookup_soft_null.phpt @@ -0,0 +1,14 @@ +--TEST-- +stdlib socket_addrinfo_lookup(null) soft-null Deprecated+false (#30337, ext/sockets/sockets.c) +--FILE-- +getMessage(), "\n"; +} +--EXPECTF-- +PHP Deprecated: socket_addrinfo_lookup(): Passing null to parameter #1 ($host) of type string is deprecated in %s on line %d +false diff --git a/test/repro/issue_30337_socket_addrinfo_lookup_soft_null.php b/test/repro/issue_30337_socket_addrinfo_lookup_soft_null.php new file mode 100644 index 00000000000..53701f2da8c --- /dev/null +++ b/test/repro/issue_30337_socket_addrinfo_lookup_soft_null.php @@ -0,0 +1,13 @@ +getMessage(), "\n"; +}