WPDB: Fix the parsing of sockets which contain colons within the socket name (used on some cloud providers).

Props natacado.
Fixes #42634 for trunk.


git-svn-id: https://develop.svn.wordpress.org/trunk@42226 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Dion Hulse 2017-11-24 05:51:31 +00:00
parent 555eab6391
commit b8c4faff72
2 changed files with 42 additions and 3 deletions

View File

@ -1643,14 +1643,21 @@ class wpdb {
$socket = null;
$is_ipv6 = false;
// First peel off the socket parameter from the right, if it exists.
$socket_pos = strpos( $host, ':/' );
if ( $socket_pos !== false ) {
$socket = substr( $host, $socket_pos + 1 );
$host = substr( $host, 0, $socket_pos );
}
// We need to check for an IPv6 address first.
// An IPv6 address will always contain at least two colons.
if ( substr_count( $host, ':' ) > 1 ) {
$pattern = '#^(?:\[)?(?<host>[0-9a-fA-F:]+)(?:\]:(?<port>[\d]+))?(?:/(?<socket>.+))?#';
$pattern = '#^(?:\[)?(?<host>[0-9a-fA-F:]+)(?:\]:(?<port>[\d]+))?#';
$is_ipv6 = true;
} else {
// We seem to be dealing with an IPv4 address.
$pattern = '#^(?<host>[^:/]*)(?::(?<port>[\d]+))?(?::(?<socket>.+))?#';
$pattern = '#^(?<host>[^:/]*)(?::(?<port>[\d]+))?#';
}
$matches = array();
@ -1662,7 +1669,7 @@ class wpdb {
}
$host = '';
foreach ( array( 'host', 'port', 'socket' ) as $component ) {
foreach ( array( 'host', 'port' ) as $component ) {
if ( ! empty( $matches[ $component ] ) ) {
$$component = $matches[ $component ];
}

View File

@ -1558,6 +1558,14 @@ class Tests_DB extends WP_UnitTestCase {
'/tmp/mysql.sock',
false,
),
array(
':/tmp/mysql:with_colon.sock',
false,
'',
null,
'/tmp/mysql:with_colon.sock',
false,
),
array(
'127.0.0.1',
false,
@ -1574,6 +1582,14 @@ class Tests_DB extends WP_UnitTestCase {
null,
false,
),
array(
'127.0.0.1:3306:/tmp/mysql:with_colon.sock',
false,
'127.0.0.1',
'3306',
'/tmp/mysql:with_colon.sock',
false,
),
array(
'example.com',
false,
@ -1606,6 +1622,14 @@ class Tests_DB extends WP_UnitTestCase {
'/tmp/mysql.sock',
false,
),
array(
'localhost:/tmp/mysql:with_colon.sock',
false,
'localhost',
null,
'/tmp/mysql:with_colon.sock',
false,
),
array(
'0000:0000:0000:0000:0000:0000:0000:0001',
false,
@ -1638,6 +1662,14 @@ class Tests_DB extends WP_UnitTestCase {
null,
true,
),
array(
'[::1]:3306:/tmp/mysql:with_colon.sock',
false,
'::1',
'3306',
'/tmp/mysql:with_colon.sock',
true,
),
array(
'2001:0db8:0000:0000:0000:ff00:0042:8329',
false,