List:Commits« Previous MessageNext Message »
From:ahristov Date:March 12 2007 10:22am
Subject:PHP mysqlnd svn commit: r96 - trunk/ext/mysqli/mysqlnd
View as plain text  
Author: ahristov
Date: 2007-03-12 11:22:35 +0100 (Mon, 12 Mar 2007)
New Revision: 96

Modified:
   trunk/ext/mysqli/mysqlnd/mysqlnd.c
Log:
Fix possible stack overrun


Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.c	2007-03-12 09:58:08 UTC (rev 95)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.c	2007-03-12 10:22:35 UTC (rev 96)
@@ -27,7 +27,9 @@
 
 #define MYSQLND_SILENT
 
-
+/* the server doesn't support 4byte utf8, but let's make it forward compatible */
+#define MYSQLND_MAX_ALLOWED_USER_LEN	256  /* 64 char * 4byte */
+#define MYSQLND_MAX_ALLOWED_DB_LEN		256  /* 64 char * 4byte */
 /*
   TODO :
   - Don't bind so tightly the metadata with the result set. This means
@@ -2077,10 +2079,11 @@
 	  Stack space is not that expensive, so use a bit more to be protected against
 	  stack overrungs.
 	*/
-	int user_len;
+	size_t user_len;
 	enum_func_status ret;
 	php_mysql_packet_chg_user_resp chg_user_resp;
-	char buffer[768], *p = buffer;
+	size_t buf_len = MYSQLND_MAX_ALLOWED_USER_LEN + 1 + SCRAMBLE_LENGTH +
MYSQLND_MAX_ALLOWED_DB_LEN + 1;
+	char buffer[buf_len], *p = buffer;
 
 	if (!user) {
 		user = "";
@@ -2094,7 +2097,7 @@
 
 	/* 1. user ASCIIZ */
 	user_len = strlen(user);
-	memcpy(p, user, user_len);
+	memcpy(p, user, MIN(user_len, MYSQLND_MAX_ALLOWED_DB_LEN));
 	p += user_len;
 	*p++ = '\0';
 
@@ -2109,8 +2112,8 @@
 
 	/* 3. db ASCIIZ */
 	if (db[0]) {
-		int db_len = strlen(db);
-		memcpy(p, db, db_len);
+		size_t db_len = strlen(db);
+		memcpy(p, db, MIN(db_len, MYSQLND_MAX_ALLOWED_DB_LEN));
 		p += db_len;
 	}
 	*p++ = '\0';

Thread
PHP mysqlnd svn commit: r96 - trunk/ext/mysqli/mysqlndahristov12 Mar