From b8c4faff7284aaba7e12e1c2dcbf647bb6721ba6 Mon Sep 17 00:00:00 2001 From: Dion Hulse Date: Fri, 24 Nov 2017 05:51:31 +0000 Subject: [PATCH] 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 --- src/wp-includes/wp-db.php | 13 ++++++++++--- tests/phpunit/tests/db.php | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/wp-db.php b/src/wp-includes/wp-db.php index 19f79c42b0..d37e51370e 100644 --- a/src/wp-includes/wp-db.php +++ b/src/wp-includes/wp-db.php @@ -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 = '#^(?:\[)?(?[0-9a-fA-F:]+)(?:\]:(?[\d]+))?(?:/(?.+))?#'; + $pattern = '#^(?:\[)?(?[0-9a-fA-F:]+)(?:\]:(?[\d]+))?#'; $is_ipv6 = true; } else { // We seem to be dealing with an IPv4 address. - $pattern = '#^(?[^:/]*)(?::(?[\d]+))?(?::(?.+))?#'; + $pattern = '#^(?[^:/]*)(?::(?[\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 ]; } diff --git a/tests/phpunit/tests/db.php b/tests/phpunit/tests/db.php index 91dae71e55..65b79b8eb4 100644 --- a/tests/phpunit/tests/db.php +++ b/tests/phpunit/tests/db.php @@ -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,