]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-5.4' into PHP-5.5
authorXinchen Hui <laruence@php.net>
Tue, 5 Nov 2013 03:08:09 +0000 (11:08 +0800)
committerXinchen Hui <laruence@php.net>
Tue, 5 Nov 2013 03:08:09 +0000 (11:08 +0800)
Conflicts:
configure.in
ext/mysqlnd/mysqlnd.c
main/php_version.h

1  2 
ext/mysqlnd/mysqlnd.c

index 169577ff97997d650fe4786a2e5a78cb51131397,6eb34e40922b673695370953d069189d9a4ff672..c9e134f7a3ee6de4361304f9f7afac24f3a3265f
@@@ -2247,14 -2125,114 +2247,13 @@@ MYSQLND_METHOD(mysqlnd_conn_data, chang
        }
        if (!db) {
                db = "";
        }
  
 -      {
 -              zend_bool first_call = TRUE;
 -              char * switch_to_auth_protocol = NULL;
 -              size_t switch_to_auth_protocol_len = 0;
 -              char * requested_protocol = NULL;
 -              zend_uchar * plugin_data;
 -              size_t plugin_data_len;
 -
 -              plugin_data_len = conn->auth_plugin_data_len;
 -              plugin_data = mnd_emalloc(plugin_data_len);
 -              if (!plugin_data) {
 -                      ret = FAIL;
 -                      goto end;
 -              }
 -              memcpy(plugin_data, conn->auth_plugin_data, plugin_data_len);
 -
 -              requested_protocol = mnd_pestrdup(conn->options->auth_protocol? conn->options->auth_protocol:"mysql_native_password", FALSE);
 -              if (!requested_protocol) {
 -                      ret = FAIL;
 -                      goto end;
 -              }
 -
 -              do {
 -                      struct st_mysqlnd_authentication_plugin * auth_plugin;
 -                      {
 -                              char * plugin_name = NULL;
 -
 -                              mnd_sprintf(&plugin_name, 0, "auth_plugin_%s", requested_protocol);
 -
 -                              DBG_INF_FMT("looking for %s auth plugin", plugin_name);
 -                              auth_plugin = mysqlnd_plugin_find(plugin_name);
 -                              mnd_sprintf_free(plugin_name);
 -
 -                              if (!auth_plugin) {
 -                                      php_error_docref(NULL TSRMLS_CC, 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");
 -                                      break;
 -                              }
 -                      }
 -                      DBG_INF("plugin found");
 -
 -                      {
 -                              zend_uchar * switch_to_auth_protocol_data = NULL;
 -                              size_t switch_to_auth_protocol_data_len = 0;
 -                              zend_uchar * scrambled_data = NULL;
 -                              size_t scrambled_data_len = 0;
 -
 -                              switch_to_auth_protocol = NULL;
 -                              switch_to_auth_protocol_len = 0;
 -
 -                              if (conn->auth_plugin_data) {
 -                                      mnd_pefree(conn->auth_plugin_data, conn->persistent);
 -                                      conn->auth_plugin_data = NULL;
 -                              }
 -                              conn->auth_plugin_data_len = plugin_data_len;
 -                              conn->auth_plugin_data = mnd_pemalloc(conn->auth_plugin_data_len, conn->persistent);
 -                              if (!conn->auth_plugin_data) {
 -                                      SET_OOM_ERROR(*conn->error_info);
 -                                      ret = FAIL;
 -                                      goto end;
 -                              }
 -                              memcpy(conn->auth_plugin_data, plugin_data, plugin_data_len);
 -
 -                              DBG_INF_FMT("salt=[%*.s]", plugin_data_len - 1, 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, 0, conn->server_capabilities TSRMLS_CC);
 -
 -
 -                              ret = mysqlnd_auth_change_user(conn, user, strlen(user), passwd, passwd_len, db, strlen(db), silent,
 -                                                                                         first_call,
 -                                                                                         requested_protocol,
 -                                                                                         scrambled_data, scrambled_data_len,
 -                                                                                         &switch_to_auth_protocol, &switch_to_auth_protocol_len,
 -                                                                                         &switch_to_auth_protocol_data, &switch_to_auth_protocol_data_len
 -                                                                                         TSRMLS_CC);
 -
 -                              first_call = FALSE;
 -                              free(scrambled_data);
 -
 -                              DBG_INF_FMT("switch_to_auth_protocol=%s", switch_to_auth_protocol? switch_to_auth_protocol:"n/a");
 -                              if (requested_protocol) {
 -                                      mnd_efree(requested_protocol);
 -                              }
 -                              requested_protocol = switch_to_auth_protocol;
 +      /* XXX: passwords that have \0 inside work during auth, but in this case won't work with change user */
 +      ret = mysqlnd_run_authentication(conn, user, passwd, strlen(passwd), db, strlen(db),
 +                                                                      conn->auth_plugin_data, conn->auth_plugin_data_len, conn->options->auth_protocol,
 +                                                                      0 /*charset not used*/, conn->options, conn->server_capabilities, silent, TRUE/*is_change*/ TSRMLS_CC);
  
 -                              if (plugin_data) {
 -                                      mnd_efree(plugin_data);
 -                              }
 -                              plugin_data_len = switch_to_auth_protocol_data_len;
 -                              plugin_data = switch_to_auth_protocol_data;
 -                      }
 -                      DBG_INF_FMT("conn->error_info->error_no = %d", conn->error_info->error_no);
 -              } while (ret == FAIL && conn->error_info->error_no == 0 && switch_to_auth_protocol != NULL);
 -              if (plugin_data) {
 -                      mnd_efree(plugin_data);
 -              }
 -              if (ret == PASS) {
 -                      conn->m->set_client_option(conn, MYSQLND_OPT_AUTH_PROTOCOL, requested_protocol TSRMLS_CC);
 -              }
 -              if (requested_protocol) {
 -                      mnd_efree(requested_protocol);
 -              }
 -      }
        /*
          Here we should close all statements. Unbuffered queries should not be a
          problem as we won't allow sending COM_CHANGE_USER.