From: Andrey Hristov Date: Mon, 2 Nov 2015 15:35:59 +0000 (+0100) Subject: MNDR: X-Git-Tag: php-7.1.0alpha1~778 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e30e884e53c2cfed646a218122daeaa9a81f2d45;p=php MNDR: - move COM_INIT_DE result handling to the command --- diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 3fb0d36a13..f37d5139a9 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -284,9 +284,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, free_contents)(MYSQLND_CONN_DATA * conn) mnd_pefree(conn->passwd, pers); conn->passwd = NULL; } - if (conn->connect_or_select_db) { - mnd_pefree(conn->connect_or_select_db, pers); - conn->connect_or_select_db = NULL; + if (conn->connect_or_select_db.s) { + mnd_pefree(conn->connect_or_select_db.s, pers); + conn->connect_or_select_db.s = NULL; } if (conn->unix_socket) { mnd_pefree(conn->unix_socket, pers); @@ -925,10 +925,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn, conn->passwd = mnd_pestrndup(passwd, passwd_len, conn->persistent); conn->passwd_len = passwd_len; conn->port = port; - conn->connect_or_select_db = mnd_pestrndup(db, db_len, conn->persistent); - conn->connect_or_select_db_len = db_len; + conn->connect_or_select_db.s = mnd_pestrndup(db, db_len, conn->persistent); + conn->connect_or_select_db.l = db_len; - if (!conn->user || !conn->passwd || !conn->connect_or_select_db) { + if (!conn->user || !conn->passwd || !conn->connect_or_select_db.s) { SET_OOM_ERROR(conn->error_info); goto err; /* OOM */ } @@ -1538,23 +1538,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, select_db)(MYSQLND_CONN_DATA * const conn, con command->free_command(command); } - /* - The server sends 0 but libmysql doesn't read it and has established - a protocol of giving back -1. Thus we have to follow it :( - */ - UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); - if (ret == PASS) { - if (conn->connect_or_select_db) { - mnd_pefree(conn->connect_or_select_db, conn->persistent); - } - conn->connect_or_select_db = mnd_pestrndup(db, db_len, conn->persistent); - conn->connect_or_select_db_len = db_len; - if (!conn->connect_or_select_db) { - /* OOM */ - SET_OOM_ERROR(conn->error_info); - ret = FAIL; - } - } conn->m->local_tx_end(conn, this_func, ret); } DBG_RETURN(ret); diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 8c15a7b885..468e11b973 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -985,8 +985,7 @@ struct st_mysqlnd_connection_data size_t auth_plugin_data_len; const MYSQLND_CHARSET *charset; const MYSQLND_CHARSET *greet_charset; - char *connect_or_select_db; - unsigned int connect_or_select_db_len; + MYSQLND_STRING connect_or_select_db; MYSQLND_INFILE infile; unsigned int protocol_version; zend_ulong max_packet_size; diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 975239011f..8cfbec3c14 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -3020,6 +3020,7 @@ mysqlnd_com_init_db_run(void *cmd) struct st_mysqlnd_protocol_com_init_db_command * command = (struct st_mysqlnd_protocol_com_init_db_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + const MYSQLND_CSTRING db = command->context.db; DBG_ENTER("mysqlnd_com_init_db_run"); @@ -3036,6 +3037,24 @@ mysqlnd_com_init_db_run(void *cmd) conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } + /* + The server sends 0 but libmysql doesn't read it and has established + a protocol of giving back -1. Thus we have to follow it :( + */ + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); + if (ret == PASS) { + if (conn->connect_or_select_db.s) { + mnd_pefree(conn->connect_or_select_db.s, conn->persistent); + } + conn->connect_or_select_db.s = mnd_pestrndup(db.s, db.l, conn->persistent); + conn->connect_or_select_db.l = db.l; + if (!conn->connect_or_select_db.s) { + /* OOM */ + SET_OOM_ERROR(conn->error_info); + ret = FAIL; + } + } + DBG_RETURN(ret); } /* }}} */