Bug #67563 [Com]: mysqli compiled with mysqlnd does not take ipv6 adress as parameter

From: Date: Sat, 05 Aug 2017 12:06:04 +0000
Subject: Bug #67563 [Com]: mysqli compiled with mysqlnd does not take ipv6 adress as parameter
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-210528@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=67563&edit=1 ID: 67563 Comment by: seb35 at seb35 dot fr Reported by: bugs-php dot a2 at x25 dot pl Summary: mysqli compiled with mysqlnd does not take ipv6 adress as parameter Status: Open Type: Bug Package: MySQLi related PHP Version: 7.0.5 Block user comment: N Private report: N New Comment: Well, the codebase where I conducted my search appeared to be a bit old (24 March 2017), and there were changes since this date on parse_ip_address_ex in main/streams/xp_socket.c due to #74216. I guess there will be soon other changes related to parsing of "double ports" (e.g. "127.0.0.1:53:80") and it could affect this bug, possibly solving it. Previous Comments: ------------------------------------------------------------------------ [2017-08-05 11:29:58] seb35 at seb35 dot fr I don’t know well the PHP codebase, so I studied the code, searching occurences of "php_network_getaddresses" and found that this function is used in 3 other functions (all in main/network.c). One step further, it seems two functions are in charge of the parsing of IP addresses: * php_network_parse_network_address_with_port in main/network.c * parse_ip_address_ex in main/streams/xp_socket.c (used for mysqli_connect) Both expect IPv6 to be enclosed in brackets, with port after the closing bracket (e.g. "[2001:db8::]:80"). The algorithm of these both functions is as follows: 1. if the first character is '[', it is considered an IPv6 address with port; 2. else it is considered an IPv4 address with port or an hostname with port. One or two of the following proposed changes could be implemented to solve this bug. A) A first proposed change could be the following algorithm: 1. if the first character is '[', it is considered an IPv6 address with port; 2. else, if the string contains two colons, it is considered an IPv6 with port (*); 3. else it is considered an IPv4 address with port or an hostname with port. Such a change would have a more general scope in PHP codebase, it will solve the issue for this bug, but possibly for other similar bugs related to IPv6 parsing. (*) an IPv6 with port contains at least two colons, at least one ':' in IPv6 and one ':' for port (e.g. "2001:db8:::80"). Given the port must be provided to these both functions, there is no ambiguity, and the last colon is the delimiter for the port. B) A second proposed change would be to add brackets around IPv6 addresses without port when needed. Such a change should be done in each occurence of IPv6 parsing in the whole PHP codebase. -- For reference, the parsing of host in URI is described in RFC 3986, section 3.2.2. ------------------------------------------------------------------------ [2016-04-15 00:03:29] bugs-php dot a2 at x25 dot pl -- ------------------------------------------------------------------------ [2016-04-15 00:01:59] bugs-php dot a2 at x25 dot pl How many more years is needed for simple patch for mysqlnd (or mysqli) to unify how ipv6 mysql adress should be passed regardless of underlying lib? (it should be without brackets so hostnames would work) ------------------------------------------------------------------------ [2015-04-18 14:30:11] bobe at webnaute dot net Here is some tests: PDO mysql + mysqlnd: [::1] => ok ::1 => getaddrinfo failed mysqli_connect() + mysqlnd: [::1] => ok ::1 => getaddrinfo failed mysql_connect() + mysqlnd: [::1] => Failed to parse IPv6 address "[:3306" ::1 => No such file or directory PDO mysql + libmysqlclient: [::1] => SQLSTATE[HY000] [2005] Unknown MySQL server host '[::1]' ::1 => ok mysqli_connect() + libmysqlclient: [::1] => (HY000/2005): Unknown MySQL server host '[::1]' ::1 => ok mysql_connect() + libmysqlclient: [::1] => Unknown MySQL server host '[' (2) ::1 => Can't connect to local MySQL server through socket '1' ------------------------------------------------------------------------ [2015-04-18 13:48:50] bobe at webnaute dot net There is a real problem here because mysqlnd wants the IPv6 address to be enclosed in brackets (illogical since mysqli_connect() or PDO wants a host, not a url). But when using libmysqlclient, these extensions wants the IPv6 address NOT to be enclosed in brackets. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=67563 -- Edit this bug report at https://bugs.php.net/bug.php?id=67563&edit=1

« previous php.bugs (#210528) next »