Skip to content

Commit 9a2b42a

Browse files
fabiomsoutokrakjoe
authored andcommitted
Fix bug #76809 (SSL settings aren't respected when persistent connection is reused)
1 parent 05560b6 commit 9a2b42a

File tree

2 files changed

+57
-4
lines changed

2 files changed

+57
-4
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ PHP NEWS
1616
. Fixed bug #78609 (mb_check_encoding() no longer supports stringable
1717
objects). (cmb)
1818

19+
- MySQLi:
20+
. Fixed bug #76809 (SSL settings aren't respected when persistent connections
21+
are used). (fabiomsouto)
22+
1923
- Standard:
2024
. Fixed bug #76342 (file_get_contents waits twice specified timeout).
2125
(Thomas Calvet)

ext/mysqli/mysqli_nonapi.c

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,12 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
6161
MY_MYSQL *mysql = NULL;
6262
MYSQLI_RESOURCE *mysqli_resource = NULL;
6363
zval *object = getThis();
64-
char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL;
65-
size_t hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
66-
zend_bool persistent = FALSE;
67-
zend_long port = 0, flags = 0;
64+
char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL,
65+
*ssl_key = NULL, *ssl_cert = NULL, *ssl_ca = NULL, *ssl_capath = NULL,
66+
*ssl_cipher = NULL;
67+
size_t hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
68+
zend_bool persistent = FALSE, ssl = FALSE;
69+
zend_long port = 0, flags = 0;
6870
zend_string *hash_key = NULL;
6971
zend_bool new_connection = FALSE;
7072
zend_resource *le;
@@ -189,6 +191,33 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
189191

190192
goto end;
191193
} else {
194+
#ifdef MYSQLI_USE_MYSQLND
195+
if (mysql->mysql->data->vio->data->ssl) {
196+
/* copy over pre-existing ssl settings so we can reuse them when reconnecting */
197+
ssl = TRUE;
198+
199+
ssl_key = my_estrdup(mysql->mysql->data->vio->data->options.ssl_key);
200+
ssl_cert = my_estrdup(mysql->mysql->data->vio->data->options.ssl_cert);
201+
ssl_ca = my_estrdup(mysql->mysql->data->vio->data->options.ssl_ca);
202+
ssl_capath = my_estrdup(mysql->mysql->data->vio->data->options.ssl_capath);
203+
ssl_cipher = my_estrdup(mysql->mysql->data->vio->data->options.ssl_cipher);
204+
}
205+
#else
206+
if (mysql->mysql->options.ssl_key
207+
|| mysql->mysql->options.ssl_cert
208+
|| mysql->mysql->options.ssl_ca
209+
|| mysql->mysql->options.ssl_capath
210+
|| mysql->mysql->options.ssl_cipher) {
211+
/* copy over pre-existing ssl settings so we can reuse them when reconnecting */
212+
ssl = TRUE;
213+
214+
ssl_key = my_estrdup(mysql->mysql->options.ssl_key);
215+
ssl_cert = my_estrdup(mysql->mysql->options.ssl_cert);
216+
ssl_ca = my_estrdup(mysql->mysql->options.ssl_ca);
217+
ssl_capath = my_estrdup(mysql->mysql->options.ssl_capath);
218+
ssl_cipher = my_estrdup(mysql->mysql->options.ssl_cipher);
219+
}
220+
#endif
192221
mysqli_close(mysql->mysql, MYSQLI_CLOSE_IMPLICIT);
193222
mysql->mysql = NULL;
194223
}
@@ -241,8 +270,28 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
241270
/* BC for prior to bug fix #53425 */
242271
flags |= CLIENT_MULTI_RESULTS;
243272

273+
if (ssl) {
274+
/* if we're here, this means previous conn was ssl, repopulate settings */
275+
mysql_ssl_set(mysql->mysql, ssl_key, ssl_cert, ssl_ca, ssl_capath, ssl_cipher);
276+
277+
my_efree(ssl_key);
278+
my_efree(ssl_cert);
279+
my_efree(ssl_ca);
280+
my_efree(ssl_capath);
281+
my_efree(ssl_cipher);
282+
}
244283
if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname, port, socket, flags) == NULL)
245284
#else
285+
if (ssl) {
286+
/* if we're here, this means previous conn was ssl, repopulate settings */
287+
mysql_ssl_set(mysql->mysql, ssl_key, ssl_cert, ssl_ca, ssl_capath, ssl_cipher);
288+
289+
my_efree(ssl_key);
290+
my_efree(ssl_cert);
291+
my_efree(ssl_ca);
292+
my_efree(ssl_capath);
293+
my_efree(ssl_cipher);
294+
}
246295
if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len,
247296
port, socket, flags, MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA) == NULL)
248297
#endif

0 commit comments

Comments
 (0)