1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

ext/sockets: GH-20532 socket_addrinfo_lookup() sets EAI error code on resolution failures with a new optional argument.

close GH-20534
This commit is contained in:
David Carlier
2025-11-19 21:19:33 +00:00
parent 0f4fd2d03c
commit 44d6417bd7
6 changed files with 236 additions and 5 deletions

2
NEWS
View File

@@ -86,6 +86,8 @@ PHP NEWS
transmitted data can remain unacknowledged. (James Lucas)
. Added AF_UNSPEC support for sock_addrinfo_lookup() as a sole umbrella for
AF_INET* family only. (David Carlier)
. Fixed GH-20532 (socket_addrinfo_lookup gives the error code with a new optional
parameter). (David Carlier)
- SPL:
. DirectoryIterator key can now work better with filesystem supporting larger

View File

@@ -77,6 +77,11 @@ PHP 8.6 UPGRADE NOTES
- Phar:
. Phar::mungServer() now supports reference values.
- Sockets:
. socket_addrinfo_lookup() now has an additional optional argument $error
when not null, and on failure, gives the error code (one of the EAI_*
constants).
- Zip:
. ZipArchive::extractTo now raises a TypeError for the
files argument if one or more of the entries is not
@@ -112,6 +117,23 @@ PHP 8.6 UPGRADE NOTES
- Sockets:
. TCP_USER_TIMEOUT (Linux only).
. AF_UNSPEC.
. EAI_BADFLAGS.
. EAI_NONAME.
. EAI_AGAIN.
. EAI_FAIL.
. EAI_NODATA.
. EAI_FAMILY.
. EAI_SOCKTYPE.
. EAI_SERVICE.
. EAI_ADDRFAMILY.
. EAI_SYSTEM.
. EAI_OVERFLOW
. EAI_INPROGRESS.
. EAI_CANCELED.
. EAI_NOTCANCELED.
. EAI_ALLDONE.
. EAI_INTR.
. EAI_IDN_ENCODE.
========================================
11. Changes to INI File Handling

View File

@@ -2751,16 +2751,18 @@ PHP_FUNCTION(socket_addrinfo_lookup)
{
zend_string *service = NULL;
zend_string *hostname, *key;
zval *hint, *zhints = NULL;
zval *hint, *zhints = NULL, *error_code = NULL;
int ret = 0;
struct addrinfo hints, *result, *rp;
php_addrinfo *res;
ZEND_PARSE_PARAMETERS_START(1, 3)
ZEND_PARSE_PARAMETERS_START(1, 4)
Z_PARAM_STR(hostname)
Z_PARAM_OPTIONAL
Z_PARAM_STR_OR_NULL(service)
Z_PARAM_ARRAY(zhints)
Z_PARAM_ZVAL_OR_NULL(error_code)
ZEND_PARSE_PARAMETERS_END();
memset(&hints, 0, sizeof(hints));
@@ -2848,7 +2850,10 @@ PHP_FUNCTION(socket_addrinfo_lookup)
} ZEND_HASH_FOREACH_END();
}
if (getaddrinfo(ZSTR_VAL(hostname), service ? ZSTR_VAL(service) : NULL, &hints, &result) != 0) {
if ((ret = getaddrinfo(ZSTR_VAL(hostname), service ? ZSTR_VAL(service) : NULL, &hints, &result)) != 0) {
if (error_code) {
ZEND_TRY_ASSIGN_REF_LONG(error_code, ret);
}
RETURN_FALSE;
}

View File

@@ -2067,6 +2067,136 @@ const SHUT_WR = UNKNOWN;
const SHUT_RDWR = UNKNOWN;
#endif
#ifdef EAI_BADFLAGS
/**
* @var int
* @cvalue EAI_BADFLAGS
*/
const EAI_BADFLAGS = UNKNOWN;
#endif
#ifdef EAI_NONAME
/**
* @var int
* @cvalue EAI_NONAME
*/
const EAI_NONAME = UNKNOWN;
#endif
#ifdef EAI_AGAIN
/**
* @var int
* @cvalue EAI_AGAIN
*/
const EAI_AGAIN = UNKNOWN;
#endif
#ifdef EAI_FAIL
/**
* @var int
* @cvalue EAI_FAIL
*/
const EAI_FAIL = UNKNOWN;
#endif
#ifdef EAI_NODATA
/**
* @var int
* @cvalue EAI_NODATA
*/
const EAI_NODATA = UNKNOWN;
#endif
#ifdef EAI_FAMILY
/**
* @var int
* @cvalue EAI_FAMILY
*/
const EAI_FAMILY = UNKNOWN;
#endif
#ifdef EAI_SOCKTYPE
/**
* @var int
* @cvalue EAI_SOCKTYPE
*/
const EAI_SOCKTYPE = UNKNOWN;
#endif
#ifdef EAI_SERVICE
/**
* @var int
* @cvalue EAI_SERVICE
*/
const EAI_SERVICE = UNKNOWN;
#endif
#ifdef EAI_ADDRFAMILY
/**
* @var int
* @cvalue EAI_ADDRFAMILY
*/
const EAI_ADDRFAMILY = UNKNOWN;
#else
#ifdef EAI_FAMILY
/**
* @var int
* @cvalue EAI_FAMILY
*/
const EAI_ADDRFAMILY = UNKNOWN;
#else
#endif
#endif
#ifdef EAI_SYSTEM
/**
* @var int
* @cvalue EAI_SYSTEM
*/
const EAI_SYSTEM = UNKNOWN;
#endif
#ifdef EAI_OVERFLOW
/**
* @var int
* @cvalue EAI_OVERFLOW
*/
const EAI_OVERFLOW = UNKNOWN;
#endif
#ifdef EAI_INPROGRESS
/**
* @var int
* @cvalue EAI_INPROGRESS
*/
const EAI_INPROGRESS = UNKNOWN;
#endif
#ifdef EAI_CANCELED
/**
* @var int
* @cvalue EAI_CANCELED
*/
const EAI_CANCELED = UNKNOWN;
#endif
#ifdef EAI_NOTCANCELED
/**
* @var int
* @cvalue EAI_NOTCANCELED
*/
const EAI_NOTCANCELED = UNKNOWN;
#endif
#ifdef EAI_ALLDONE
/**
* @var int
* @cvalue EAI_ALLDONE
*/
const EAI_ALLDONE = UNKNOWN;
#endif
#ifdef EAI_INTR
/**
* @var int
* @cvalue EAI_INTR
*/
const EAI_INTR = UNKNOWN;
#endif
#ifdef EAI_IDN_ENCODE
/**
* @var int
* @cvalue EAI_IDN_ENCODE
*/
const EAI_IDN_ENCODE = UNKNOWN;
#endif
/**
* @strict-properties
* @not-serializable
@@ -2187,9 +2317,10 @@ function socket_cmsg_space(int $level, int $type, int $num = 0): ?int {}
/**
* @return array<int, AddressInfo>|false
* @param int $error_code
* @refcount 1
*/
function socket_addrinfo_lookup(string $host, ?string $service = null, array $hints = []): array|false {}
function socket_addrinfo_lookup(string $host, ?string $service = null, array $hints = [], &$error_code = null): array|false {}
function socket_addrinfo_connect(AddressInfo $address): Socket|false {}

View File

@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: a89c4e54ab913728e10baf8f32b45323495d685b */
* Stub hash: 5e71ef16f2121bd6c75794673d0e0a394759ff8b */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_socket_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1)
@@ -184,6 +184,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_socket_addrinfo_lookup, 0, 1, MA
ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, service, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, hints, IS_ARRAY, 0, "[]")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, error_code, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_socket_addrinfo_connect, 0, 1, Socket, MAY_BE_FALSE)
@@ -1054,6 +1055,60 @@ static void register_sockets_symbols(int module_number)
REGISTER_LONG_CONSTANT("SHUT_WR", SHUT_WR, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SHUT_RDWR", SHUT_RDWR, CONST_PERSISTENT);
#endif
#if defined(EAI_BADFLAGS)
REGISTER_LONG_CONSTANT("EAI_BADFLAGS", EAI_BADFLAGS, CONST_PERSISTENT);
#endif
#if defined(EAI_NONAME)
REGISTER_LONG_CONSTANT("EAI_NONAME", EAI_NONAME, CONST_PERSISTENT);
#endif
#if defined(EAI_AGAIN)
REGISTER_LONG_CONSTANT("EAI_AGAIN", EAI_AGAIN, CONST_PERSISTENT);
#endif
#if defined(EAI_FAIL)
REGISTER_LONG_CONSTANT("EAI_FAIL", EAI_FAIL, CONST_PERSISTENT);
#endif
#if defined(EAI_NODATA)
REGISTER_LONG_CONSTANT("EAI_NODATA", EAI_NODATA, CONST_PERSISTENT);
#endif
#if defined(EAI_FAMILY)
REGISTER_LONG_CONSTANT("EAI_FAMILY", EAI_FAMILY, CONST_PERSISTENT);
#endif
#if defined(EAI_SOCKTYPE)
REGISTER_LONG_CONSTANT("EAI_SOCKTYPE", EAI_SOCKTYPE, CONST_PERSISTENT);
#endif
#if defined(EAI_SERVICE)
REGISTER_LONG_CONSTANT("EAI_SERVICE", EAI_SERVICE, CONST_PERSISTENT);
#endif
#if defined(EAI_ADDRFAMILY)
REGISTER_LONG_CONSTANT("EAI_ADDRFAMILY", EAI_ADDRFAMILY, CONST_PERSISTENT);
#endif
#if !(defined(EAI_ADDRFAMILY)) && defined(EAI_FAMILY)
REGISTER_LONG_CONSTANT("EAI_ADDRFAMILY", EAI_FAMILY, CONST_PERSISTENT);
#endif
#if defined(EAI_SYSTEM)
REGISTER_LONG_CONSTANT("EAI_SYSTEM", EAI_SYSTEM, CONST_PERSISTENT);
#endif
#if defined(EAI_OVERFLOW)
REGISTER_LONG_CONSTANT("EAI_OVERFLOW", EAI_OVERFLOW, CONST_PERSISTENT);
#endif
#if defined(EAI_INPROGRESS)
REGISTER_LONG_CONSTANT("EAI_INPROGRESS", EAI_INPROGRESS, CONST_PERSISTENT);
#endif
#if defined(EAI_CANCELED)
REGISTER_LONG_CONSTANT("EAI_CANCELED", EAI_CANCELED, CONST_PERSISTENT);
#endif
#if defined(EAI_NOTCANCELED)
REGISTER_LONG_CONSTANT("EAI_NOTCANCELED", EAI_NOTCANCELED, CONST_PERSISTENT);
#endif
#if defined(EAI_ALLDONE)
REGISTER_LONG_CONSTANT("EAI_ALLDONE", EAI_ALLDONE, CONST_PERSISTENT);
#endif
#if defined(EAI_INTR)
REGISTER_LONG_CONSTANT("EAI_INTR", EAI_INTR, CONST_PERSISTENT);
#endif
#if defined(EAI_IDN_ENCODE)
REGISTER_LONG_CONSTANT("EAI_IDN_ENCODE", EAI_IDN_ENCODE, CONST_PERSISTENT);
#endif
}
static zend_class_entry *register_class_Socket(void)

View File

@@ -0,0 +1,16 @@
--TEST--
GH-20562 - socket_addrinfo_lookup() returns error codes on resolution failures.
--EXTENSIONS--
sockets
--FILE--
<?php
$error_code = 0;
var_dump(socket_addrinfo_lookup(".whynot", null, [], $error_code) === false && $error_code === EAI_NONAME);
var_dump(socket_addrinfo_lookup("2001:db8::1", null, ['ai_family' => AF_INET], $error_code) === false && in_array($error_code, [EAI_FAMILY, EAI_ADDRFAMILY, EAI_NONAME, EAI_NODATA]));
var_dump(socket_addrinfo_lookup("example.com", "http", ['ai_socktype' => SOCK_RAW, 'ai_flags' => 2147483647], $error_code) === false && in_array($error_code, [EAI_SOCKTYPE, EAI_SERVICE, EAI_BADFLAGS, EAI_NONAME]));
?>
--EXPECT--
bool(true)
bool(true)
bool(true)