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/mysqlnd | ahristov | 12 Mar |