diff options
author | Andrey Hristov <andrey@php.net> | 2011-01-11 13:02:57 +0000 |
---|---|---|
committer | Andrey Hristov <andrey@php.net> | 2011-01-11 13:02:57 +0000 |
commit | ddbbcdce49090c06183261c6dca9c340ed9d1d21 (patch) | |
tree | a083494699c2010585a2b62c9f7b89fa9f5e01cc /ext/mysqlnd/mysqlnd_wireprotocol.c | |
parent | d5af830385ccbf1000694ecdb6a5dcd63513a9f4 (diff) | |
download | php-git-ddbbcdce49090c06183261c6dca9c340ed9d1d21.tar.gz |
Use common code to handle initial authentication and
COM_CHANGE_USER
Diffstat (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c')
-rw-r--r-- | ext/mysqlnd/mysqlnd_wireprotocol.c | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 0c68f68e91..f3a4ba4c1e 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -447,7 +447,7 @@ void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const sc /* }}} */ -#define AUTH_WRITE_BUFFER_LEN (MYSQLND_HEADER_SIZE + MYSQLND_MAX_ALLOWED_USER_LEN + SHA1_MAX_LENGTH + MYSQLND_MAX_ALLOWED_DB_LEN + 1 + 128) +#define AUTH_WRITE_BUFFER_LEN (MYSQLND_HEADER_SIZE + MYSQLND_MAX_ALLOWED_USER_LEN + SCRAMBLE_LENGTH + MYSQLND_MAX_ALLOWED_DB_LEN + 1 + 128) /* {{{ php_mysqlnd_auth_write */ static @@ -460,19 +460,21 @@ size_t php_mysqlnd_auth_write(void *_packet, MYSQLND * conn TSRMLS_DC) DBG_ENTER("php_mysqlnd_auth_write"); - int4store(p, packet->client_flags); - p+= 4; + if (!packet->is_change_user_packet) { + int4store(p, packet->client_flags); + p+= 4; - int4store(p, packet->max_packet_size); - p+= 4; + int4store(p, packet->max_packet_size); + p+= 4; - int1store(p, packet->charset_no); - p++; + int1store(p, packet->charset_no); + p++; - memset(p, 0, 23); /* filler */ - p+= 23; + memset(p, 0, 23); /* filler */ + p+= 23; + } - if (!packet->send_half_packet) { + if (packet->send_auth_data || packet->is_change_user_packet) { len = MIN(strlen(packet->user), MYSQLND_MAX_ALLOWED_USER_LEN); memcpy(p, packet->user, len); p+= len; @@ -481,10 +483,10 @@ size_t php_mysqlnd_auth_write(void *_packet, MYSQLND * conn TSRMLS_DC) /* copy scrambled pass*/ if (packet->password && packet->password[0]) { /* In 4.1 we use CLIENT_SECURE_CONNECTION and thus the len of the buf should be passed */ - int1store(p, SHA1_MAX_LENGTH); + int1store(p, SCRAMBLE_LENGTH); p++; php_mysqlnd_scramble((zend_uchar*)p, packet->server_scramble_buf, (zend_uchar*)packet->password); - p+= SHA1_MAX_LENGTH; + p+= SCRAMBLE_LENGTH; } else { /* Zero length */ int1store(p, 0); @@ -492,16 +494,29 @@ size_t php_mysqlnd_auth_write(void *_packet, MYSQLND * conn TSRMLS_DC) } if (packet->db) { + /* CLIENT_CONNECT_WITH_DB should have been set */ size_t real_db_len = MIN(MYSQLND_MAX_ALLOWED_DB_LEN, packet->db_len); memcpy(p, packet->db, real_db_len); p+= real_db_len; *p++= '\0'; } - /* Handle CLIENT_CONNECT_WITH_DB */ /* no \0 for no DB */ - } - DBG_RETURN(conn->net->m.send(conn, buffer, p - buffer - MYSQLND_HEADER_SIZE TSRMLS_CC)); + if (packet->is_change_user_packet && packet->charset_no) { + int2store(p, packet->charset_no); + p+= 2; + } + } + if (packet->is_change_user_packet) { + if (PASS != conn->m->simple_command(conn, COM_CHANGE_USER, buffer + MYSQLND_HEADER_SIZE, p - buffer - MYSQLND_HEADER_SIZE, + PROT_LAST /* the caller will handle the OK packet */, + packet->silent, TRUE TSRMLS_CC)) { + DBG_RETURN(0); + } + DBG_RETURN(p - buffer - MYSQLND_HEADER_SIZE); + } else { + DBG_RETURN(conn->net->m.send(conn, buffer, p - buffer - MYSQLND_HEADER_SIZE TSRMLS_CC)); + } } /* }}} */ |