summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Watkins <krakjoe@php.net>2019-10-03 06:56:45 +0200
committerJoe Watkins <krakjoe@php.net>2019-10-03 06:57:05 +0200
commitf4d078b1c7b34debccaaac85f066e2781dc9e919 (patch)
treeb86f51f06c615e31a6e9544b0971f56d50327762
parent5b1bb23edfbdf00cfafa9655cf07ef99546cdfa8 (diff)
parent9a2b42a5c1144e6a50c742d6a6d2007828830b24 (diff)
downloadphp-git-f4d078b1c7b34debccaaac85f066e2781dc9e919.tar.gz
Merge branch 'PHP-7.2' into PHP-7.3
* PHP-7.2: Fix bug #76809 (SSL settings aren't respected when persistent connection is reused)
-rw-r--r--NEWS4
-rw-r--r--ext/mysqli/mysqli_nonapi.c57
2 files changed, 57 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 87b1a83b00..58a236345b 100644
--- a/NEWS
+++ b/NEWS
@@ -20,6 +20,10 @@ PHP NEWS
. Fixed bug #78609 (mb_check_encoding() no longer supports stringable
objects). (cmb)
+- MySQLi:
+ . Fixed bug #76809 (SSL settings aren't respected when persistent connections
+ are used). (fabiomsouto)
+
- Mysqlnd:
. Fixed bug #78525 (Memory leak in pdo when reusing native prepared
statements). (Nikita)
diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c
index 7b6c07d2e3..0f5714bf21 100644
--- a/ext/mysqli/mysqli_nonapi.c
+++ b/ext/mysqli/mysqli_nonapi.c
@@ -54,10 +54,12 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
MY_MYSQL *mysql = NULL;
MYSQLI_RESOURCE *mysqli_resource = NULL;
zval *object = getThis();
- char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL;
- size_t hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
- zend_bool persistent = FALSE;
- zend_long port = 0, flags = 0;
+ char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL,
+ *ssl_key = NULL, *ssl_cert = NULL, *ssl_ca = NULL, *ssl_capath = NULL,
+ *ssl_cipher = NULL;
+ size_t hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
+ zend_bool persistent = FALSE, ssl = FALSE;
+ zend_long port = 0, flags = 0;
zend_string *hash_key = NULL;
zend_bool new_connection = FALSE;
zend_resource *le;
@@ -182,6 +184,33 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
goto end;
} else {
+#ifdef MYSQLI_USE_MYSQLND
+ if (mysql->mysql->data->vio->data->ssl) {
+ /* copy over pre-existing ssl settings so we can reuse them when reconnecting */
+ ssl = TRUE;
+
+ ssl_key = my_estrdup(mysql->mysql->data->vio->data->options.ssl_key);
+ ssl_cert = my_estrdup(mysql->mysql->data->vio->data->options.ssl_cert);
+ ssl_ca = my_estrdup(mysql->mysql->data->vio->data->options.ssl_ca);
+ ssl_capath = my_estrdup(mysql->mysql->data->vio->data->options.ssl_capath);
+ ssl_cipher = my_estrdup(mysql->mysql->data->vio->data->options.ssl_cipher);
+ }
+#else
+ if (mysql->mysql->options.ssl_key
+ || mysql->mysql->options.ssl_cert
+ || mysql->mysql->options.ssl_ca
+ || mysql->mysql->options.ssl_capath
+ || mysql->mysql->options.ssl_cipher) {
+ /* copy over pre-existing ssl settings so we can reuse them when reconnecting */
+ ssl = TRUE;
+
+ ssl_key = my_estrdup(mysql->mysql->options.ssl_key);
+ ssl_cert = my_estrdup(mysql->mysql->options.ssl_cert);
+ ssl_ca = my_estrdup(mysql->mysql->options.ssl_ca);
+ ssl_capath = my_estrdup(mysql->mysql->options.ssl_capath);
+ ssl_cipher = my_estrdup(mysql->mysql->options.ssl_cipher);
+ }
+#endif
mysqli_close(mysql->mysql, MYSQLI_CLOSE_IMPLICIT);
mysql->mysql = NULL;
}
@@ -232,8 +261,28 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
/* BC for prior to bug fix #53425 */
flags |= CLIENT_MULTI_RESULTS;
+ if (ssl) {
+ /* if we're here, this means previous conn was ssl, repopulate settings */
+ mysql_ssl_set(mysql->mysql, ssl_key, ssl_cert, ssl_ca, ssl_capath, ssl_cipher);
+
+ my_efree(ssl_key);
+ my_efree(ssl_cert);
+ my_efree(ssl_ca);
+ my_efree(ssl_capath);
+ my_efree(ssl_cipher);
+ }
if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname, port, socket, flags) == NULL)
#else
+ if (ssl) {
+ /* if we're here, this means previous conn was ssl, repopulate settings */
+ mysql_ssl_set(mysql->mysql, ssl_key, ssl_cert, ssl_ca, ssl_capath, ssl_cipher);
+
+ my_efree(ssl_key);
+ my_efree(ssl_cert);
+ my_efree(ssl_ca);
+ my_efree(ssl_capath);
+ my_efree(ssl_cipher);
+ }
if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len,
port, socket, flags, MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA) == NULL)
#endif