mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Merge branch 'PHP-8.5'
* PHP-8.5: Fix bug #67563: mysqli compiled with mysqlnd does not take ipv6 adress as parameter
This commit is contained in:
40
ext/mysqli/tests/bug67563.phpt
Normal file
40
ext/mysqli/tests/bug67563.phpt
Normal file
@@ -0,0 +1,40 @@
|
||||
--TEST--
|
||||
Fix bug #67563 (mysqli compiled with mysqlnd does not take ipv6 adress as parameter)
|
||||
--EXTENSIONS--
|
||||
mysqli
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once 'connect.inc';
|
||||
|
||||
if ($host !== '127.0.0.1')
|
||||
die('skip local test');
|
||||
|
||||
if (@stream_socket_client('udp://[::1]:8888') === false)
|
||||
die('skip no IPv6 support 2');
|
||||
|
||||
if (!$link = @my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
|
||||
die(sprintf("SKIP Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
|
||||
$host, $user, $db, $port, $socket));
|
||||
}
|
||||
?>
|
||||
--INI--
|
||||
max_execution_time=240
|
||||
--FILE--
|
||||
<?php
|
||||
require_once 'connect.inc';
|
||||
|
||||
$hosts = ['::1', "[::1]:$port"];
|
||||
|
||||
foreach ($hosts as $host) {
|
||||
if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
|
||||
printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=%s dbname=%s, port=%s, socket=%s\n",
|
||||
$host, $user, $passwd, $db, $port, $socket);
|
||||
} else {
|
||||
$link->close();
|
||||
}
|
||||
}
|
||||
|
||||
print "done!";
|
||||
?>
|
||||
--EXPECT--
|
||||
done!
|
||||
@@ -508,6 +508,16 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn,
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* ipv6 addresses have at least two colons, which is how we can differentiate between domain names and addresses */
|
||||
static bool mysqlnd_fast_is_ipv6_address(const char *s)
|
||||
{
|
||||
const char *first_colon = strchr(s, ':');
|
||||
if (!first_colon) {
|
||||
return false;
|
||||
}
|
||||
return strchr(first_colon + 1, ':') != NULL;
|
||||
}
|
||||
|
||||
/* {{{ mysqlnd_conn_data::get_scheme */
|
||||
static MYSQLND_STRING
|
||||
MYSQLND_METHOD(mysqlnd_conn_data, get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_CSTRING hostname, MYSQLND_CSTRING *socket_or_pipe, unsigned int port, bool * unix_socket, bool * named_pipe)
|
||||
@@ -537,7 +547,13 @@ MYSQLND_METHOD(mysqlnd_conn_data, get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_
|
||||
if (!port) {
|
||||
port = 3306;
|
||||
}
|
||||
transport.l = mnd_sprintf(&transport.s, 0, "tcp://%s:%u", hostname.s, port);
|
||||
|
||||
/* ipv6 addresses are in the format [address]:port */
|
||||
if (hostname.s[0] != '[' && mysqlnd_fast_is_ipv6_address(hostname.s)) {
|
||||
transport.l = mnd_sprintf(&transport.s, 0, "tcp://[%s]:%u", hostname.s, port);
|
||||
} else {
|
||||
transport.l = mnd_sprintf(&transport.s, 0, "tcp://%s:%u", hostname.s, port);
|
||||
}
|
||||
}
|
||||
DBG_INF_FMT("transport=%s", transport.s? transport.s:"OOM");
|
||||
DBG_RETURN(transport);
|
||||
|
||||
Reference in New Issue
Block a user