Skip to content

Commit f4d078b

Browse files
committed
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)
2 parents 5b1bb23 + 9a2b42a commit f4d078b

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
@@ -20,6 +20,10 @@ PHP NEWS
2020
. Fixed bug #78609 (mb_check_encoding() no longer supports stringable
2121
objects). (cmb)
2222

23+
- MySQLi:
24+
. Fixed bug #76809 (SSL settings aren't respected when persistent connections
25+
are used). (fabiomsouto)
26+
2327
- Mysqlnd:
2428
. Fixed bug #78525 (Memory leak in pdo when reusing native prepared
2529
statements). (Nikita)

ext/mysqli/mysqli_nonapi.c

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,12 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
5454
MY_MYSQL *mysql = NULL;
5555
MYSQLI_RESOURCE *mysqli_resource = NULL;
5656
zval *object = getThis();
57-
char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL;
58-
size_t hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
59-
zend_bool persistent = FALSE;
60-
zend_long port = 0, flags = 0;
57+
char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL,
58+
*ssl_key = NULL, *ssl_cert = NULL, *ssl_ca = NULL, *ssl_capath = NULL,
59+
*ssl_cipher = NULL;
60+
size_t hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
61+
zend_bool persistent = FALSE, ssl = FALSE;
62+
zend_long port = 0, flags = 0;
6163
zend_string *hash_key = NULL;
6264
zend_bool new_connection = FALSE;
6365
zend_resource *le;
@@ -182,6 +184,33 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
182184

183185
goto end;
184186
} else {
187+
#ifdef MYSQLI_USE_MYSQLND
188+
if (mysql->mysql->data->vio->data->ssl) {
189+
/* copy over pre-existing ssl settings so we can reuse them when reconnecting */
190+
ssl = TRUE;
191+
192+
ssl_key = my_estrdup(mysql->mysql->data->vio->data->options.ssl_key);
193+
ssl_cert = my_estrdup(mysql->mysql->data->vio->data->options.ssl_cert);
194+
ssl_ca = my_estrdup(mysql->mysql->data->vio->data->options.ssl_ca);
195+
ssl_capath = my_estrdup(mysql->mysql->data->vio->data->options.ssl_capath);
196+
ssl_cipher = my_estrdup(mysql->mysql->data->vio->data->options.ssl_cipher);
197+
}
198+
#else
199+
if (mysql->mysql->options.ssl_key
200+
|| mysql->mysql->options.ssl_cert
201+
|| mysql->mysql->options.ssl_ca
202+
|| mysql->mysql->options.ssl_capath
203+
|| mysql->mysql->options.ssl_cipher) {
204+
/* copy over pre-existing ssl settings so we can reuse them when reconnecting */
205+
ssl = TRUE;
206+
207+
ssl_key = my_estrdup(mysql->mysql->options.ssl_key);
208+
ssl_cert = my_estrdup(mysql->mysql->options.ssl_cert);
209+
ssl_ca = my_estrdup(mysql->mysql->options.ssl_ca);
210+
ssl_capath = my_estrdup(mysql->mysql->options.ssl_capath);
211+
ssl_cipher = my_estrdup(mysql->mysql->options.ssl_cipher);
212+
}
213+
#endif
185214
mysqli_close(mysql->mysql, MYSQLI_CLOSE_IMPLICIT);
186215
mysql->mysql = NULL;
187216
}
@@ -232,8 +261,28 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
232261
/* BC for prior to bug fix #53425 */
233262
flags |= CLIENT_MULTI_RESULTS;
234263

264+
if (ssl) {
265+
/* if we're here, this means previous conn was ssl, repopulate settings */
266+
mysql_ssl_set(mysql->mysql, ssl_key, ssl_cert, ssl_ca, ssl_capath, ssl_cipher);
267+
268+
my_efree(ssl_key);
269+
my_efree(ssl_cert);
270+
my_efree(ssl_ca);
271+
my_efree(ssl_capath);
272+
my_efree(ssl_cipher);
273+
}
235274
if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname, port, socket, flags) == NULL)
236275
#else
276+
if (ssl) {
277+
/* if we're here, this means previous conn was ssl, repopulate settings */
278+
mysql_ssl_set(mysql->mysql, ssl_key, ssl_cert, ssl_ca, ssl_capath, ssl_cipher);
279+
280+
my_efree(ssl_key);
281+
my_efree(ssl_cert);
282+
my_efree(ssl_ca);
283+
my_efree(ssl_capath);
284+
my_efree(ssl_cipher);
285+
}
237286
if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len,
238287
port, socket, flags, MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA) == NULL)
239288
#endif

0 commit comments

Comments
 (0)