mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Merge MariaDB 5.1->5.2.
This commit is contained in:
@@ -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;
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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 */
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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>")))
|
||||||
{
|
{
|
||||||
|
20
sql/log.cc
20
sql/log.cc
@@ -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,7 +5656,7 @@ 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
|
||||||
@@ -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. */
|
||||||
|
if (!(*best_p)->next)
|
||||||
|
pool_last_ptr= best_p;
|
||||||
*best_p=(*best_p)->next;
|
*best_p=(*best_p)->next;
|
||||||
else
|
|
||||||
pool_last=*best_p;
|
|
||||||
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)
|
|||||||
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()
|
|||||||
|
|
||||||
/* 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
|
|||||||
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,
|
|||||||
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)
|
|||||||
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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user