Commit d8876ff2 authored by Harin Vadodaria's avatar Harin Vadodaria

Bug#15912213: BUFFER OVERFLOW IN ACL_GET()

      
Description: A very large database name causes buffer
             overflow in functions acl_get() and
             check_grant_db() in sql_acl.cc. It happens
             due to an unguarded string copy operation.
             This puts required sanity checks before
             copying db string to destination buffer.
parent e5424d19
...@@ -1581,11 +1581,20 @@ ulong acl_get(const char *host, const char *ip, ...@@ -1581,11 +1581,20 @@ ulong acl_get(const char *host, const char *ip,
{ {
ulong host_access= ~(ulong)0, db_access= 0; ulong host_access= ~(ulong)0, db_access= 0;
uint i; uint i;
size_t key_length; size_t key_length, copy_length;
char key[ACL_KEY_LENGTH],*tmp_db,*end; char key[ACL_KEY_LENGTH],*tmp_db,*end;
acl_entry *entry; acl_entry *entry;
DBUG_ENTER("acl_get"); DBUG_ENTER("acl_get");
copy_length= (size_t) (strlen(ip ? ip : "") +
strlen(user ? user : "") +
strlen(db ? db : ""));
/*
Make sure that strmov() operations do not result in buffer overflow.
*/
if (copy_length >= ACL_KEY_LENGTH)
DBUG_RETURN(0);
mysql_mutex_lock(&acl_cache->lock); mysql_mutex_lock(&acl_cache->lock);
end=strmov((tmp_db=strmov(strmov(key, ip ? ip : "")+1,user)+1),db); end=strmov((tmp_db=strmov(strmov(key, ip ? ip : "")+1,user)+1),db);
if (lower_case_table_names) if (lower_case_table_names)
...@@ -4942,6 +4951,16 @@ bool check_grant_db(THD *thd,const char *db) ...@@ -4942,6 +4951,16 @@ bool check_grant_db(THD *thd,const char *db)
char helping [NAME_LEN+USERNAME_LENGTH+2]; char helping [NAME_LEN+USERNAME_LENGTH+2];
uint len; uint len;
bool error= TRUE; bool error= TRUE;
size_t copy_length;
copy_length= (size_t) (strlen(sctx->priv_user ? sctx->priv_user : "") +
strlen(db ? db : ""));
/*
Make sure that strmov() operations do not result in buffer overflow.
*/
if (copy_length >= (NAME_LEN+USERNAME_LENGTH+2))
return 1;
len= (uint) (strmov(strmov(helping, sctx->priv_user) + 1, db) - helping) + 1; len= (uint) (strmov(strmov(helping, sctx->priv_user) + 1, db) - helping) + 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment