andrey                                   Fri, 14 Jan 2011 20:04:17 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=307493

Log:
Update on the mysqlnd auth plugins, changed the plugin
structure and where they load themselves.
0xFE packets (method switch) needs to be done, additional
wire-level packet to be created to be parsed and the packet
doesn't fit the PACKET_OK structure anymore.

Changed paths:
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_auth.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_priv.h
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd.c	2011-01-14 20:02:49 UTC (rev 307492)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd.c	2011-01-14 20:04:17 UTC (rev 307493)
@@ -177,10 +177,10 @@
 		mnd_pefree(conn->host_info, pers);
 		conn->host_info = NULL;
 	}
-	if (conn->scramble) {
-		DBG_INF("Freeing scramble");
-		mnd_pefree(conn->scramble, pers);
-		conn->scramble = NULL;
+	if (conn->auth_plugin_data) {
+		DBG_INF("Freeing auth_plugin_data");
+		mnd_pefree(conn->auth_plugin_data, pers);
+		conn->auth_plugin_data = NULL;
 	}
 	if (conn->last_message) {
 		mnd_pefree(conn->last_message, pers);
@@ -524,15 +524,15 @@
 			auth_plugin = mysqlnd_plugin_find(plugin_name);
 			efree(plugin_name);
 			if (!auth_plugin) {
-				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Server requested authentication method uknown to the client [%s]", requested_protocol);
-				SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "Server requested authentication method uknown to the client");
+				php_error_docref(NULL TSRMLS_CC, E_WARNING, "The server requested authentication method uknown to the client [%s]", requested_protocol);
+				SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method uknown to the client");
 				break;
 			}

 			DBG_INF("plugin found");

-			ret = auth_plugin->methods.auth_handshake(conn, user, passwd, db, db_len, passwd_len, greet_packet, options, mysql_flags,
-													  &switch_to_auth_protocol TSRMLS_CC);
+			ret = mysqlnd_auth_handshake(conn, user, passwd, db, db_len, passwd_len, greet_packet, options, mysql_flags,
+										 auth_plugin, &switch_to_auth_protocol TSRMLS_CC);
 			DBG_INF_FMT("switch_to_auth_protocol=%s", switch_to_auth_protocol? switch_to_auth_protocol:"n/a");
 		} while (ret == FAIL && switch_to_auth_protocol != NULL);

@@ -1942,6 +1942,7 @@
 		db = "";
 	}

+
 	{
 		char * switch_to_auth_protocol = NULL;
 		const char * requested_protocol = NULL;
@@ -1961,13 +1962,15 @@
 			efree(plugin_name);
 			if (!auth_plugin) {
 				if (!silent) {
-					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Server requested authentication method uknown to the client [%s]", requested_protocol);
+					php_error_docref(NULL TSRMLS_CC, E_WARNING, "The server requested authentication method uknown to the client [%s]", requested_protocol);
 				}
-				SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "Server requested authentication method uknown to the client");
+				SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method uknown to the client");
 				break;
 			}
 			DBG_INF("plugin found");
-			ret = auth_plugin->methods.auth_change_user(conn, user, strlen(user), passwd, db, strlen(db), passwd_len, silent, &switch_to_auth_protocol TSRMLS_CC);
+			ret = mysqlnd_auth_change_user(conn, user, strlen(user), passwd, db, strlen(db), passwd_len, silent,
+										   auth_plugin, &switch_to_auth_protocol TSRMLS_CC);
+
 			DBG_INF_FMT("switch_to_auth_protocol=%s", switch_to_auth_protocol? switch_to_auth_protocol:"n/a");
 		} while (ret == FAIL && switch_to_auth_protocol != NULL);
 		if (ret == PASS) {

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_auth.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_auth.c	2011-01-14 20:02:49 UTC (rev 307492)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_auth.c	2011-01-14 20:04:17 UTC (rev 307493)
@@ -30,8 +30,8 @@


 /* {{{ mysqlnd_native_auth_handshake */
-static enum_func_status
-mysqlnd_native_auth_handshake(MYSQLND * conn,
+enum_func_status
+mysqlnd_auth_handshake(MYSQLND * conn,
 							  const char * const user,
 							  const char * const passwd,
 							  const char * const db,
@@ -40,6 +40,7 @@
 							  const MYSQLND_PACKET_GREET * const greet_packet,
 							  const MYSQLND_OPTIONS * const options,
 							  unsigned long mysql_flags,
+							  struct st_mysqlnd_authentication_plugin * auth_plugin,
 							  char ** switch_to_auth_protocol
 							  TSRMLS_DC)
 {
@@ -50,14 +51,6 @@

 	DBG_ENTER("mysqlnd_native_auth_handshake");

-	/* 5.5.x reports 21 as scramble length because it needs to show the length of the data before the plugin name */
-	if (greet_packet->scramble_buf_len != SCRAMBLE_LENGTH && (greet_packet->scramble_buf_len != 21)) {
-		/* mysql_native_password only works with SCRAMBLE_LENGTH scramble */
-		SET_CLIENT_ERROR(conn->error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "The server sent wrong length for scramble");
-		DBG_ERR_FMT("The server sent wrong length for scramble %u. Expected %u", greet_packet->scramble_buf_len, SCRAMBLE_LENGTH);
-		goto end;
-	}
-
 	ok_packet = conn->protocol->m.get_ok_packet(conn->protocol, FALSE TSRMLS_CC);
 	auth_packet = conn->protocol->m.get_auth_packet(conn->protocol, FALSE TSRMLS_CC);

@@ -80,18 +73,22 @@

 	auth_packet->send_auth_data = TRUE;
 	auth_packet->user		= user;
-	auth_packet->password	= passwd;
 	auth_packet->db			= db;
 	auth_packet->db_len		= db_len;

-	auth_packet->server_scramble_buf_len = greet_packet->scramble_buf_len;
-	conn->scramble = auth_packet->server_scramble_buf = mnd_pemalloc(auth_packet->server_scramble_buf_len, conn->persistent);
-	if (!conn->scramble) {
+	conn->auth_plugin_data_len = greet_packet->auth_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);
 		goto end;
 	}
-	memcpy(auth_packet->server_scramble_buf, greet_packet->scramble_buf, greet_packet->scramble_buf_len);
+	memcpy(conn->auth_plugin_data, greet_packet->auth_plugin_data, greet_packet->auth_plugin_data_len);

+	auth_packet->auth_data =
+		auth_plugin->methods.get_auth_data(NULL, &auth_packet->auth_data_len, conn, user, passwd, passwd_len,
+										   conn->auth_plugin_data, conn->auth_plugin_data_len, options, mysql_flags TSRMLS_CC);
+
+
 	if (!PACKET_WRITE(auth_packet, conn)) {
 		CONN_SET_STATE(conn, CONN_QUIT_SENT);
 		SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
@@ -118,6 +115,7 @@
 	conn->charset = mysqlnd_find_charset_nr(auth_packet->charset_no);
 	ret = PASS;
 end:
+	mnd_efree(auth_packet->auth_data);
 	PACKET_FREE(auth_packet);
 	PACKET_FREE(ok_packet);
 	DBG_RETURN(ret);
@@ -126,8 +124,8 @@


 /* {{{ mysqlnd_native_auth_change_user */
-static enum_func_status
-mysqlnd_native_auth_change_user(MYSQLND * const conn,
+enum_func_status
+mysqlnd_auth_change_user(MYSQLND * const conn,
 								const char * const user,
 								const size_t user_len,
 								const char * const passwd,
@@ -135,6 +133,7 @@
 								const size_t db_len,
 								const size_t passwd_len,
 								const zend_bool silent,
+								struct st_mysqlnd_authentication_plugin * auth_plugin,
 								char ** switch_to_auth_protocol
 								TSRMLS_DC)
 {
@@ -156,13 +155,17 @@
 		SET_OOM_ERROR(conn->error_info);
 		goto end;
 	}
+
 	auth_packet->is_change_user_packet = TRUE;
 	auth_packet->user		= user;
-	auth_packet->password	= passwd;
 	auth_packet->db			= db;
 	auth_packet->db_len		= db_len;
-	auth_packet->server_scramble_buf = conn->scramble;
 	auth_packet->silent		= silent;
+
+	auth_packet->auth_data =
+		auth_plugin->methods.get_auth_data(NULL, &auth_packet->auth_data_len, conn, user, passwd, passwd_len,
+										   conn->auth_plugin_data, conn->auth_plugin_data_len, NULL /* options */, 0 /* mysql_flags */ TSRMLS_CC);
+
 	if (mysqlnd_get_server_version(conn) >= 50123) {
 		auth_packet->charset_no	= conn->charset->nr;
 		p+=2;
@@ -225,12 +228,47 @@
 		SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, mysqlnd_old_passwd);
 	}
 end:
+	mnd_efree(auth_packet->auth_data);
 	PACKET_FREE(auth_packet);
 	PACKET_FREE(chg_user_resp);
 	DBG_RETURN(ret);
 }
 /* }}} */

+
+/* {{{ mysqlnd_native_auth_get_auth_data */
+static zend_uchar *
+mysqlnd_native_auth_get_auth_data(struct st_mysqlnd_authentication_plugin * self,
+								  size_t * auth_data_len,
+								  MYSQLND * conn, const char * const user, const char * const passwd,
+								  const size_t passwd_len, zend_uchar * auth_plugin_data, size_t auth_plugin_data_len,
+								  const MYSQLND_OPTIONS * const options, unsigned long mysql_flags
+								  TSRMLS_DC)
+{
+	zend_uchar * ret = NULL;
+	DBG_ENTER("mysqlnd_native_auth_get_auth_data");
+	*auth_data_len = 0;
+
+	/* 5.5.x reports 21 as scramble length because it needs to show the length of the data before the plugin name */
+	if (auth_plugin_data_len != SCRAMBLE_LENGTH && (auth_plugin_data_len != 21)) {
+		/* mysql_native_password only works with SCRAMBLE_LENGTH scramble */
+		SET_CLIENT_ERROR(conn->error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "The server sent wrong length for scramble");
+		DBG_ERR_FMT("The server sent wrong length for scramble %u. Expected %u", auth_plugin_data_len, SCRAMBLE_LENGTH);
+		DBG_RETURN(NULL);
+	}
+
+	/* copy scrambled pass*/
+	if (passwd && passwd_len) {
+		ret = mnd_emalloc(SCRAMBLE_LENGTH);
+		*auth_data_len = SCRAMBLE_LENGTH;
+		/* In 4.1 we use CLIENT_SECURE_CONNECTION and thus the len of the buf should be passed */
+		php_mysqlnd_scramble((zend_uchar*)ret, auth_plugin_data, (zend_uchar*)passwd, passwd_len);
+	}
+	DBG_RETURN(ret);
+}
+/* }}} */
+
+
 static struct st_mysqlnd_authentication_plugin mysqlnd_native_auth_plugin =
 {
 	{
@@ -249,11 +287,11 @@
 		}
 	},
 	{/* methods */
-		mysqlnd_native_auth_handshake,
-		mysqlnd_native_auth_change_user
+		mysqlnd_native_auth_get_auth_data
 	}
 };

+
 /* {{{ mysqlnd_native_authentication_plugin_register */
 void
 mysqlnd_native_authentication_plugin_register(TSRMLS_D)

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_priv.h
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_priv.h	2011-01-14 20:02:49 UTC (rev 307492)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_priv.h	2011-01-14 20:04:17 UTC (rev 307493)
@@ -196,6 +196,36 @@

 void mysqlnd_example_plugin_register(TSRMLS_D);

+struct st_mysqlnd_packet_greet;
+struct st_mysqlnd_authentication_plugin;
+
+enum_func_status
+mysqlnd_auth_handshake(MYSQLND * conn,
+						const char * const user,
+						const char * const passwd,
+						const char * const db,
+						const size_t db_len,
+						const size_t passwd_len,
+						const struct st_mysqlnd_packet_greet * const greet_packet,
+						const MYSQLND_OPTIONS * const options,
+						unsigned long mysql_flags,
+						struct st_mysqlnd_authentication_plugin * auth_plugin,
+						char ** switch_to_auth_protocol
+						TSRMLS_DC);
+
+enum_func_status
+mysqlnd_auth_change_user(MYSQLND * const conn,
+								const char * const user,
+								const size_t user_len,
+								const char * const passwd,
+								const char * const db,
+								const size_t db_len,
+								const size_t passwd_len,
+								const zend_bool silent,
+								struct st_mysqlnd_authentication_plugin * auth_plugin,
+								char ** switch_to_auth_protocol
+								TSRMLS_DC);
+
 #endif	/* MYSQLND_PRIV_H */



Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h	2011-01-14 20:02:49 UTC (rev 307492)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h	2011-01-14 20:04:17 UTC (rev 307493)
@@ -736,7 +736,8 @@
 	uint64_t		thread_id;
 	char			*server_version;
 	char			*host_info;
-	unsigned char	*scramble;
+	zend_uchar		*auth_plugin_data;
+	size_t			auth_plugin_data_len;
 	const MYSQLND_CHARSET *charset;
 	const MYSQLND_CHARSET *greet_charset;
 	char			*connect_or_select_db;
@@ -964,21 +965,22 @@
 	unsigned int counter;
 };

-struct st_mysqlnd_packet_greet;
+struct st_mysqlnd_authentication_plugin;

+typedef zend_uchar * (*func_auth_plugin__get_auth_data)(struct st_mysqlnd_authentication_plugin * self,
+														size_t * auth_data_len,
+														MYSQLND * conn, const char * const user, const char * const passwd,
+														const size_t passwd_len, zend_uchar * auth_plugin_data, size_t auth_plugin_data_len,
+														const MYSQLND_OPTIONS * const options, unsigned long mysql_flags
+														TSRMLS_DC);
+
 struct st_mysqlnd_authentication_plugin
 {
 	struct st_mysqlnd_plugin_header plugin_header;
 	struct {
-		enum_func_status (*auth_handshake)(MYSQLND * conn, const char * const user, const char * const passwd, const char * const db,
-										   const size_t db_len, const size_t passwd_len, const struct st_mysqlnd_packet_greet * const greet_packet,
-										   const MYSQLND_OPTIONS * const options, unsigned long mysql_flags,
-										   char ** switch_to_auth_protocol TSRMLS_DC);
-
-		enum_func_status (*auth_change_user)(MYSQLND * const conn, const char * const user, const size_t user_len, const char * const passwd,
-											 const char * const db, const size_t db_len, const size_t passwd_len, const zend_bool silent,
-											 char ** switch_to_auth_protocol TSRMLS_DC);
+		func_auth_plugin__get_auth_data get_auth_data;
 	} methods;
 };

+
 #endif /* MYSQLND_STRUCTS_H */

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c	2011-01-14 20:02:49 UTC (rev 307492)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c	2011-01-14 20:04:17 UTC (rev 307493)
@@ -314,8 +314,8 @@
 	PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "greeting", PROT_GREET_PACKET);
 	BAIL_IF_NO_MORE_DATA;

-	packet->scramble_buf = &packet->intern_scramble_buf;
-	packet->scramble_buf_len = sizeof(packet->intern_scramble_buf);
+	packet->auth_plugin_data = packet->intern_auth_plugin_data;
+	packet->auth_plugin_data_len = sizeof(packet->intern_auth_plugin_data);

 	if (packet->header.size < sizeof(buf)) {
 		/*
@@ -353,7 +353,7 @@
 	p+=4;
 	BAIL_IF_NO_MORE_DATA;

-	memcpy(packet->scramble_buf, p, SCRAMBLE_LENGTH_323);
+	memcpy(packet->auth_plugin_data, p, SCRAMBLE_LENGTH_323);
 	p+= SCRAMBLE_LENGTH_323;
 	BAIL_IF_NO_MORE_DATA;

@@ -379,8 +379,8 @@
 	BAIL_IF_NO_MORE_DATA;

 	if ((size_t) (p - buf) < packet->header.size) {
-		/* scramble_buf is split into two parts */
-		memcpy(packet->scramble_buf + SCRAMBLE_LENGTH_323, p, SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323);
+		/* auth_plugin_data is split into two parts */
+		memcpy(packet->auth_plugin_data + SCRAMBLE_LENGTH_323, p, SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323);
 		p+= SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323;
 		p++; /* 0x0 at the end of the scramble and thus last byte in the packet in 5.1 and previous */
 	} else {
@@ -395,19 +395,19 @@
     	/* Additional 16 bits for server capabilities */
 		packet->server_capabilities |= uint2korr(pad_start) << 16;
 		/* And a length of the server scramble in one byte */
-		packet->scramble_buf_len = uint1korr(pad_start + 2);
-		if (packet->scramble_buf_len > SCRAMBLE_LENGTH) {
+		packet->auth_plugin_data_len = uint1korr(pad_start + 2);
+		if (packet->auth_plugin_data_len > SCRAMBLE_LENGTH) {
 			/* more data*/
-			char * new_scramble_buf = emalloc(packet->scramble_buf_len);
-			if (!new_scramble_buf) {
+			zend_uchar * new_auth_plugin_data = emalloc(packet->auth_plugin_data_len);
+			if (!new_auth_plugin_data) {
 				goto premature_end;
 			}
 			/* copy what we already have */
-			memcpy(new_scramble_buf, packet->scramble_buf, SCRAMBLE_LENGTH);
+			memcpy(new_auth_plugin_data, packet->auth_plugin_data, SCRAMBLE_LENGTH);
 			/* add additional scramble data 5.5+ sent us */
-			memcpy(new_scramble_buf + SCRAMBLE_LENGTH, p, packet->scramble_buf_len - SCRAMBLE_LENGTH);
-			p+= (packet->scramble_buf_len - SCRAMBLE_LENGTH);
-			packet->scramble_buf = new_scramble_buf;
+			memcpy(new_auth_plugin_data + SCRAMBLE_LENGTH, p, packet->auth_plugin_data_len - SCRAMBLE_LENGTH);
+			p+= (packet->auth_plugin_data_len - SCRAMBLE_LENGTH);
+			packet->auth_plugin_data = new_auth_plugin_data;
 		}
 	}

@@ -423,7 +423,7 @@

 	DBG_INF_FMT("server_capabilities=%u charset_no=%u server_status=%i auth_protocol=%s scramble_length=%u",
 				packet->server_capabilities, packet->charset_no, packet->server_status,
-				packet->auth_protocol? packet->auth_protocol:"n/a", packet->scramble_buf_len);
+				packet->auth_protocol? packet->auth_protocol:"n/a", packet->auth_plugin_data_len);

 	DBG_RETURN(PASS);
 premature_end:
@@ -444,9 +444,9 @@
 		efree(p->server_version);
 		p->server_version = NULL;
 	}
-	if (p->scramble_buf && p->scramble_buf != &p->intern_scramble_buf) {
-		efree(p->scramble_buf);
-		p->scramble_buf = NULL;
+	if (p->auth_plugin_data && p->auth_plugin_data != p->intern_auth_plugin_data) {
+		efree(p->auth_plugin_data);
+		p->auth_plugin_data = NULL;
 	}
 	if (p->auth_protocol) {
 		efree(p->auth_protocol);
@@ -472,7 +472,7 @@


 /* {{{ php_mysqlnd_scramble */
-void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const password)
+void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const password, size_t password_len)
 {
 	PHP_SHA1_CTX context;
 	zend_uchar sha1[SHA1_MAX_LENGTH];
@@ -480,7 +480,7 @@

 	/* Phase 1: hash password */
 	PHP_SHA1Init(&context);
-	PHP_SHA1Update(&context, password, strlen((char *)password));
+	PHP_SHA1Update(&context, password, password_len);
 	PHP_SHA1Final(sha1, &context);

 	/* Phase 2: hash sha1 */
@@ -500,7 +500,7 @@
 /* }}} */


-#define AUTH_WRITE_BUFFER_LEN (MYSQLND_HEADER_SIZE + MYSQLND_MAX_ALLOWED_USER_LEN + SCRAMBLE_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 + 1024)

 /* {{{ php_mysqlnd_auth_write */
 static
@@ -533,18 +533,21 @@
 		p+= len;
 		*p++ = '\0';

-		/* 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, SCRAMBLE_LENGTH);
-			p++;
-			php_mysqlnd_scramble((zend_uchar*)p, packet->server_scramble_buf, (zend_uchar*)packet->password);
-			p+= SCRAMBLE_LENGTH;
-		} else {
-			/* Zero length */
-			int1store(p, 0);
-			p++;
+		/* defensive coding */
+		if (!packet->auth_data) {
+			packet->auth_data = 0;
 		}
+		int1store(p, packet->auth_data_len);
+		++p;
+/*!!!!! is the buffer big enough ??? */
+		if ((sizeof(buffer) - (p - buffer)) < packet->auth_data_len) {
+			DBG_ERR("the stack buffer was not enough!!");
+			DBG_RETURN(0);
+		}
+		if (packet->auth_data_len) {
+			memcpy(p, packet->auth_data, packet->auth_data_len);
+			p+= packet->auth_data_len;
+		}

 		if (packet->db) {
 			/* CLIENT_CONNECT_WITH_DB should have been set */
@@ -555,9 +558,18 @@
 		}
 		/* no \0 for no DB */

-		if (packet->is_change_user_packet && packet->charset_no) {
-			int2store(p, packet->charset_no);
-			p+= 2;
+		if (packet->is_change_user_packet) {
+			if (packet->charset_no) {
+				int2store(p, packet->charset_no);
+				p+= 2;
+			}
+		} else {
+			if (packet->auth_plugin_name) {
+				size_t len = MIN(strlen(packet->auth_plugin_name), sizeof(buffer) - (p - buffer) - 1);
+				memcpy(p, packet->auth_plugin_name, len);
+				p+= len;
+				*p++= '\0';
+			}
 		}
 	}
 	if (packet->is_change_user_packet) {

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h	2011-01-14 20:02:49 UTC (rev 307492)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h	2011-01-14 20:04:17 UTC (rev 307493)
@@ -70,9 +70,9 @@
 	uint8_t		protocol_version;
 	char		*server_version;
 	uint32_t	thread_id;
-	zend_uchar	intern_scramble_buf[SCRAMBLE_LENGTH];
-	zend_uchar	* scramble_buf;
-	size_t		scramble_buf_len;
+	zend_uchar	intern_auth_plugin_data[SCRAMBLE_LENGTH];
+	zend_uchar	* auth_plugin_data;
+	size_t		auth_plugin_data_len;
 	/* 1 byte pad */
 	uint32_t	server_capabilities;
 	uint8_t		charset_no;
@@ -92,22 +92,18 @@
 	MYSQLND_PACKET_HEADER		header;
 	uint32_t	client_flags;
 	uint32_t	max_packet_size;
-	uint8_t	charset_no;
-	/* 23 byte pad */
+	uint8_t		charset_no;
 	const char	*user;
-	/* 8 byte scramble */
+	zend_uchar	*auth_data;
+	size_t		auth_data_len;
 	const char	*db;
-	/* 12 byte scramble */
-
+	char		*auth_plugin_name;
 	/* Here the packet ends. This is user supplied data */
-	const char	*password;
-	/* +1 for \0 because of scramble() */
-	unsigned char	*server_scramble_buf;
-	size_t			server_scramble_buf_len;
-	size_t			db_len;
-	zend_bool		send_auth_data;
-	zend_bool		is_change_user_packet;
-	zend_bool		silent;
+	size_t		db_len;
+	zend_bool	send_auth_data;
+	zend_bool	is_change_user_packet;
+	zend_bool	silent;
+
 } MYSQLND_PACKET_AUTH;

 /* OK packet */
@@ -255,7 +251,7 @@
 } MYSQLND_PACKET_CHG_USER_RESPONSE;


-PHPAPI void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const pass);
+PHPAPI void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const pass, size_t pass_len);

 unsigned long	php_mysqlnd_net_field_length(zend_uchar **packet);
 zend_uchar *	php_mysqlnd_net_store_length(zend_uchar *packet, uint64_t length);
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to