summaryrefslogtreecommitdiff
path: root/libmysql
diff options
context:
space:
mode:
authorunknown <davi@moksha.local/moksha.com.br>2007-10-23 09:05:39 -0300
committerunknown <davi@moksha.local/moksha.com.br>2007-10-23 09:05:39 -0300
commit22e972ffeb8af1f6bc100eea38fb15483805bde8 (patch)
tree37e49aba17df23c28dfa5cecbf45295942af08a6 /libmysql
parentd927461052084fc876151c42ea9502b5bf3fef4a (diff)
downloadmariadb-git-22e972ffeb8af1f6bc100eea38fb15483805bde8.tar.gz
Bug#31669 Buffer overflow in mysql_change_user()
The problem is that when copying the supplied username and database, no bounds checking is performed on the fixed-length buffer. A sufficiently large (> 512) user string can easily cause stack corruption. Since this API can be used from PHP and other programs, this is a serious problem. The solution is to increase the buffer size to the accepted size in similar functions and perform bounds checking when copying the username and database. libmysql/libmysql.c: Increase the buffer size and perform bounds checking when copying the supplied arguments. tests/mysql_client_test.c: Add test case for Bug#31669
Diffstat (limited to 'libmysql')
-rw-r--r--libmysql/libmysql.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index c7bdfc4c42c..5c015bd6b0f 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -706,7 +706,8 @@ int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd)
my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
const char *passwd, const char *db)
{
- char buff[512],*end=buff;
+ char buff[USERNAME_LENGTH+SCRAMBLED_PASSWORD_CHAR_LENGTH+NAME_LEN+2];
+ char *end= buff;
int rc;
DBUG_ENTER("mysql_change_user");
@@ -716,7 +717,7 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
passwd="";
/* Store user into the buffer */
- end=strmov(end,user)+1;
+ end= strmake(end, user, USERNAME_LENGTH) + 1;
/* write scrambled password according to server capabilities */
if (passwd[0])
@@ -736,7 +737,7 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
else
*end++= '\0'; /* empty password */
/* Add database if needed */
- end= strmov(end, db ? db : "") + 1;
+ end= strmake(end, db ? db : "", NAME_LEN) + 1;
/* Write authentication package */
simple_command(mysql,COM_CHANGE_USER, buff,(ulong) (end-buff),1);