@@ -61,10 +61,12 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
6161MY_MYSQL * mysql = NULL ;
6262MYSQLI_RESOURCE * mysqli_resource = NULL ;
6363zval * 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 ;
6870zend_string * hash_key = NULL ;
6971zend_bool new_connection = FALSE;
7072zend_resource * le ;
@@ -189,6 +191,33 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
189191
190192goto 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
192221mysqli_close (mysql -> mysql , MYSQLI_CLOSE_IMPLICIT );
193222mysql -> 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 */
242271flags |= 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+ }
244283if (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+ }
246295if (mysqlnd_connect (mysql -> mysql , hostname , username , passwd , passwd_len , dbname , dbname_len ,
247296port , socket , flags , MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA ) == NULL )
248297#endif
0 commit comments