]> granicus.if.org Git - php/commitdiff
Fix bug #76809 (SSL settings aren't respected when persistent connection is reused)
authorFábio Souto <fabio.souto@miniclip.com>
Mon, 3 Sep 2018 16:18:37 +0000 (17:18 +0100)
committerJoe Watkins <krakjoe@php.net>
Thu, 3 Oct 2019 04:56:21 +0000 (06:56 +0200)
NEWS
ext/mysqli/mysqli_nonapi.c

diff --git a/NEWS b/NEWS
index 17d77557bfe1c05ad918b1feb6a2df46abbf6e56..550de2e252887e96e06a40fb4abee297e6070c8b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,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)
+
 - Standard:
   . Fixed bug #76342 (file_get_contents waits twice specified timeout).
     (Thomas Calvet)
index bc72c838af9c407447b1d8778e1cd2ab799317ed..89b605cf87142621e5fbb4eeacb41917fe3c97a2 100644 (file)
@@ -61,10 +61,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;
@@ -189,6 +191,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;
                                                        }
@@ -241,8 +270,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