]> granicus.if.org Git - php/commitdiff
Fix negotiaton of MySQL auth plugin
authorJohannes Schlüter <johannes@php.net>
Tue, 20 Feb 2018 22:13:03 +0000 (23:13 +0100)
committerJohannes Schlüter <johannes@php.net>
Tue, 20 Feb 2018 22:13:03 +0000 (23:13 +0100)
NEWS
ext/mysqlnd/mysqlnd.c

diff --git a/NEWS b/NEWS
index 7a240b392607f6dce113d93853254e75f05423a5..a69c4a2f6c663f0016b418fe99bacabeb039feca 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -24,6 +24,9 @@ PHP                                                                        NEWS
   . Fixed bug #75579 (Interned strings buffer overflow may cause crash).
     (Dmitry)
 
+- myslqnd
+  . Fixed negotiaton of MySQL authenticaton plugin. (Johannes)
+
 - PCRE:
   . Fixed bug #74183 (preg_last_error not returning error code after error).
     (Andrew Nester)
index 40ca48e3f4ac4f913a5cecfe84cbbad55bde5074..ef138f8bfd1f1b608811ebeeb455d6059a000d7b 100644 (file)
@@ -596,11 +596,15 @@ mysqlnd_run_authentication(
                struct st_mysqlnd_authentication_plugin * auth_plugin = conn->m->fetch_auth_plugin_by_name(requested_protocol);
 
                if (!auth_plugin) {
-                       php_error_docref(NULL, E_WARNING, "The server requested authentication method unknown to the client [%s]", requested_protocol);
-                       SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method unknown to the client");
-                       goto end;
+                       if (first_call) {
+                               mnd_pefree(requested_protocol, FALSE);
+                               requested_protocol = mnd_pestrdup(MYSQLND_DEFAULT_AUTH_PROTOCOL, FALSE);
+                       } else {
+                               php_error_docref(NULL, E_WARNING, "The server requested authentication method unknown to the client [%s]", requested_protocol);
+                               SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method unknown to the client");
+                               goto end;
+                       }
                }
-               DBG_INF("plugin found");
 
                {
                        zend_uchar * switch_to_auth_protocol_data = NULL;
@@ -625,9 +629,12 @@ mysqlnd_run_authentication(
 
                        DBG_INF_FMT("salt(%d)=[%.*s]", plugin_data_len, plugin_data_len, plugin_data);
                        /* The data should be allocated with malloc() */
-                       scrambled_data =
-                               auth_plugin->methods.get_auth_data(NULL, &scrambled_data_len, conn, user, passwd, passwd_len,
-                                                                                                  plugin_data, plugin_data_len, options, &conn->net->data->options, mysql_flags);
+                       if (auth_plugin) {
+                               scrambled_data =
+                                       auth_plugin->methods.get_auth_data(NULL, &scrambled_data_len, conn, user, passwd, passwd_len,
+                                                                                                          plugin_data, plugin_data_len, options, &conn->net->data->options, mysql_flags);
+                       }
+
                        if (conn->error_info->error_no) {
                                goto end;
                        }