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";
+}