Commit cbae2943 authored by unknown's avatar unknown

Merge MariaDB 5.1->5.2.

parents 094f4cf7 47c5018f
...@@ -1686,4 +1686,10 @@ SELECT length(CAST(b AS CHAR)) FROM ubig; ...@@ -1686,4 +1686,10 @@ SELECT length(CAST(b AS CHAR)) FROM ubig;
length(CAST(b AS CHAR)) length(CAST(b AS CHAR))
20 20
DROP TABLE ubig; DROP TABLE ubig;
select 1 from information_schema.tables where table_schema=repeat('a', 2000);
1
grant usage on *.* to mysqltest_1@localhost;
select 1 from information_schema.tables where table_schema=repeat('a', 2000);
1
drop user mysqltest_1@localhost;
End of 5.1 tests. End of 5.1 tests.
...@@ -1438,6 +1438,17 @@ SELECT length(CAST(b AS CHAR)) FROM ubig; ...@@ -1438,6 +1438,17 @@ SELECT length(CAST(b AS CHAR)) FROM ubig;
DROP TABLE ubig; DROP TABLE ubig;
#
# Bug #13889741: HANDLE_FATAL_SIGNAL IN _DB_ENTER_ | HANDLE_FATAL_SIGNAL IN STRNLEN
#
select 1 from information_schema.tables where table_schema=repeat('a', 2000);
grant usage on *.* to mysqltest_1@localhost;
connect (con1, localhost, mysqltest_1,,);
connection con1;
select 1 from information_schema.tables where table_schema=repeat('a', 2000);
connection default;
disconnect con1;
drop user mysqltest_1@localhost;
--echo End of 5.1 tests. --echo End of 5.1 tests.
......
...@@ -35,7 +35,7 @@ void pack_dirname(char * to, const char *from) ...@@ -35,7 +35,7 @@ void pack_dirname(char * to, const char *from)
int cwd_err; int cwd_err;
size_t d_length,length,UNINIT_VAR(buff_length); size_t d_length,length,UNINIT_VAR(buff_length);
char * start; char * start;
char buff[FN_REFLEN]; char buff[FN_REFLEN + 1];
DBUG_ENTER("pack_dirname"); DBUG_ENTER("pack_dirname");
(void) intern_filename(to,from); /* Change to intern name */ (void) intern_filename(to,from); /* Change to intern name */
...@@ -132,7 +132,7 @@ size_t cleanup_dirname(register char *to, const char *from) ...@@ -132,7 +132,7 @@ size_t cleanup_dirname(register char *to, const char *from)
reg3 char * from_ptr; reg3 char * from_ptr;
reg4 char * start; reg4 char * start;
char parent[5], /* for "FN_PARENTDIR" */ char parent[5], /* for "FN_PARENTDIR" */
buff[FN_REFLEN+1],*end_parentdir; buff[FN_REFLEN + 1],*end_parentdir;
#ifdef BACKSLASH_MBTAIL #ifdef BACKSLASH_MBTAIL
CHARSET_INFO *fs= fs_character_set(); CHARSET_INFO *fs= fs_character_set();
#endif #endif
...@@ -245,7 +245,7 @@ my_bool my_use_symdir=0; /* Set this if you want to use symdirs */ ...@@ -245,7 +245,7 @@ my_bool my_use_symdir=0; /* Set this if you want to use symdirs */
#ifdef USE_SYMDIR #ifdef USE_SYMDIR
void symdirget(char *dir) void symdirget(char *dir)
{ {
char buff[FN_REFLEN+1]; char buff[FN_REFLEN + 1];
char *pos=strend(dir); char *pos=strend(dir);
if (dir[0] && pos[-1] != FN_DEVCHAR && my_access(dir, F_OK)) if (dir[0] && pos[-1] != FN_DEVCHAR && my_access(dir, F_OK))
{ {
...@@ -295,7 +295,7 @@ void symdirget(char *dir) ...@@ -295,7 +295,7 @@ void symdirget(char *dir)
size_t normalize_dirname(char *to, const char *from) size_t normalize_dirname(char *to, const char *from)
{ {
size_t length; size_t length;
char buff[FN_REFLEN]; char buff[FN_REFLEN + 1];
DBUG_ENTER("normalize_dirname"); DBUG_ENTER("normalize_dirname");
/* /*
...@@ -423,7 +423,7 @@ static char * NEAR_F expand_tilde(char * *path) ...@@ -423,7 +423,7 @@ static char * NEAR_F expand_tilde(char * *path)
size_t unpack_filename(char * to, const char *from) size_t unpack_filename(char * to, const char *from)
{ {
size_t length, n_length, buff_length; size_t length, n_length, buff_length;
char buff[FN_REFLEN]; char buff[FN_REFLEN + 1];
DBUG_ENTER("unpack_filename"); DBUG_ENTER("unpack_filename");
length=dirname_part(buff, from, &buff_length);/* copy & convert dirname */ length=dirname_part(buff, from, &buff_length);/* copy & convert dirname */
...@@ -459,7 +459,7 @@ size_t system_filename(char * to, const char *from) ...@@ -459,7 +459,7 @@ size_t system_filename(char * to, const char *from)
int libchar_found; int libchar_found;
size_t length; size_t length;
char * to_pos,from_pos,pos; char * to_pos,from_pos,pos;
char buff[FN_REFLEN]; char buff[FN_REFLEN + 1];
DBUG_ENTER("system_filename"); DBUG_ENTER("system_filename");
libchar_found=0; libchar_found=0;
...@@ -516,7 +516,7 @@ size_t system_filename(char * to, const char *from) ...@@ -516,7 +516,7 @@ size_t system_filename(char * to, const char *from)
char *intern_filename(char *to, const char *from) char *intern_filename(char *to, const char *from)
{ {
size_t length, to_length; size_t length, to_length;
char buff[FN_REFLEN]; char buff[FN_REFLEN + 1];
if (from == to) if (from == to)
{ /* Dirname may destroy from */ { /* Dirname may destroy from */
strmov(buff,from); strmov(buff,from);
......
...@@ -258,18 +258,21 @@ int Url_http::send(const char* data, size_t data_length) ...@@ -258,18 +258,21 @@ int Url_http::send(const char* data, size_t data_length)
Extract the first string between <h1>...</h1> tags Extract the first string between <h1>...</h1> tags
and put it as a server reply into the error log. and put it as a server reply into the error log.
*/ */
len= 0;
for (;;) for (;;)
{ {
size_t i= vio_read(vio, (uchar*)buf + len, sizeof(buf) - len - 1); size_t i= sizeof(buf) - len - 1;
if (i)
i= vio_read(vio, (uchar*)buf + len, i);
if ((int)i <= 0) if ((int)i <= 0)
break; break;
len+= i; len+= i;
} }
if (len && len < sizeof(buf)) if (len)
{ {
char *from; char *from;
buf[len+1]= 0; // safety buf[len]= 0; // safety
if ((from= strstr(buf, "<h1>"))) if ((from= strstr(buf, "<h1>")))
{ {
......
...@@ -5623,8 +5623,9 @@ int TC_LOG_MMAP::open(const char *opt_name) ...@@ -5623,8 +5623,9 @@ int TC_LOG_MMAP::open(const char *opt_name)
syncing= 0; syncing= 0;
active=pages; active=pages;
DBUG_ASSERT(npages >= 2);
pool=pages+1; pool=pages+1;
pool_last=pages+npages-1; pool_last_ptr= &((pages+npages-1)->next);
return 0; return 0;
...@@ -5655,8 +5656,8 @@ void TC_LOG_MMAP::get_active_from_pool() ...@@ -5655,8 +5656,8 @@ void TC_LOG_MMAP::get_active_from_pool()
do do
{ {
best_p= p= &pool; best_p= p= &pool;
if ((*p)->waiters == 0) // can the first page be used ? if ((*p)->waiters == 0 && (*p)->free > 0) // can the first page be used ?
break; // yes - take it. break; // yes - take it.
best_free=0; // no - trying second strategy best_free=0; // no - trying second strategy
for (p=&(*p)->next; *p; p=&(*p)->next) for (p=&(*p)->next; *p; p=&(*p)->next)
...@@ -5673,10 +5674,10 @@ void TC_LOG_MMAP::get_active_from_pool() ...@@ -5673,10 +5674,10 @@ void TC_LOG_MMAP::get_active_from_pool()
safe_mutex_assert_owner(&LOCK_active); safe_mutex_assert_owner(&LOCK_active);
active=*best_p; active=*best_p;
if ((*best_p)->next) // unlink the page from the pool /* Unlink the page from the pool. */
*best_p=(*best_p)->next; if (!(*best_p)->next)
else pool_last_ptr= best_p;
pool_last=*best_p; *best_p=(*best_p)->next;
pthread_mutex_unlock(&LOCK_pool); pthread_mutex_unlock(&LOCK_pool);
pthread_mutex_lock(&active->lock); pthread_mutex_lock(&active->lock);
...@@ -5783,12 +5784,9 @@ int TC_LOG_MMAP::log_xid(THD *thd, my_xid xid) ...@@ -5783,12 +5784,9 @@ int TC_LOG_MMAP::log_xid(THD *thd, my_xid xid)
pthread_mutex_unlock(&LOCK_active); pthread_mutex_unlock(&LOCK_active);
pthread_mutex_lock(&p->lock); pthread_mutex_lock(&p->lock);
p->waiters++; p->waiters++;
for (;;) while (p->state == DIRTY && syncing)
{ {
int not_dirty = p->state != DIRTY;
pthread_mutex_unlock(&p->lock); pthread_mutex_unlock(&p->lock);
if (not_dirty || !syncing)
break;
pthread_cond_wait(&p->cond, &LOCK_sync); pthread_cond_wait(&p->cond, &LOCK_sync);
pthread_mutex_lock(&p->lock); pthread_mutex_lock(&p->lock);
} }
...@@ -5840,8 +5838,8 @@ int TC_LOG_MMAP::sync() ...@@ -5840,8 +5838,8 @@ int TC_LOG_MMAP::sync()
/* page is synced. let's move it to the pool */ /* page is synced. let's move it to the pool */
pthread_mutex_lock(&LOCK_pool); pthread_mutex_lock(&LOCK_pool);
pool_last->next=syncing; (*pool_last_ptr)=syncing;
pool_last=syncing; pool_last_ptr=&(syncing->next);
syncing->next=0; syncing->next=0;
syncing->state= err ? ERROR : POOL; syncing->state= err ? ERROR : POOL;
pthread_cond_signal(&COND_pool); // in case somebody's waiting pthread_cond_signal(&COND_pool); // in case somebody's waiting
......
...@@ -81,7 +81,7 @@ class TC_LOG_MMAP: public TC_LOG ...@@ -81,7 +81,7 @@ class TC_LOG_MMAP: public TC_LOG
my_off_t file_length; my_off_t file_length;
uint npages, inited; uint npages, inited;
uchar *data; uchar *data;
struct st_page *pages, *syncing, *active, *pool, *pool_last; struct st_page *pages, *syncing, *active, *pool, **pool_last_ptr;
/* /*
note that, e.g. LOCK_active is only used to protect note that, e.g. LOCK_active is only used to protect
'active' pointer, to protect the content of the active page 'active' pointer, to protect the content of the active page
......
...@@ -1352,14 +1352,20 @@ ulong acl_get(const char *host, const char *ip, ...@@ -1352,14 +1352,20 @@ ulong acl_get(const char *host, const char *ip,
acl_entry *entry; acl_entry *entry;
DBUG_ENTER("acl_get"); DBUG_ENTER("acl_get");
VOID(pthread_mutex_lock(&acl_cache->lock)); tmp_db= strmov(strmov(key, ip ? ip : "") + 1, user) + 1;
end=strmov((tmp_db=strmov(strmov(key, ip ? ip : "")+1,user)+1),db); end= strnmov(tmp_db, db, key + sizeof(key) - tmp_db);
if (end >= key + sizeof(key)) // db name was truncated
DBUG_RETURN(0); // no privileges for an invalid db name
if (lower_case_table_names) if (lower_case_table_names)
{ {
my_casedn_str(files_charset_info, tmp_db); my_casedn_str(files_charset_info, tmp_db);
db=tmp_db; db=tmp_db;
} }
key_length= (size_t) (end-key); key_length= (size_t) (end-key);
VOID(pthread_mutex_lock(&acl_cache->lock));
if (!db_is_pattern && (entry=(acl_entry*) acl_cache->search((uchar*) key, if (!db_is_pattern && (entry=(acl_entry*) acl_cache->search((uchar*) key,
key_length))) key_length)))
{ {
...@@ -4364,11 +4370,17 @@ static bool check_grant_db_routine(THD *thd, const char *db, HASH *hash) ...@@ -4364,11 +4370,17 @@ static bool check_grant_db_routine(THD *thd, const char *db, HASH *hash)
bool check_grant_db(THD *thd,const char *db) bool check_grant_db(THD *thd,const char *db)
{ {
Security_context *sctx= thd->security_ctx; Security_context *sctx= thd->security_ctx;
char helping [SAFE_NAME_LEN + USERNAME_LENGTH+2]; char helping [SAFE_NAME_LEN + USERNAME_LENGTH+2], *end;
uint len; uint len;
bool error= TRUE; bool error= TRUE;
len= (uint) (strmov(strmov(helping, sctx->priv_user) + 1, db) - helping) + 1; end= strmov(helping, sctx->priv_user) + 1;
end= strnmov(end, db, helping + sizeof(helping) - end);
if (end >= helping + sizeof(helping)) // db name was truncated
return 1; // no privileges for an invalid db name
len= (uint) (end - helping) + 1;
rw_rdlock(&LOCK_grant); rw_rdlock(&LOCK_grant);
......
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