Commit ccd82890 authored by unknown's avatar unknown

Cleanups to recent patches

Fix packet error when using wrong GRANT command


include/config-win.h:
  Changed back to test for HAVE_SETFILEPOINTER instead of operating system
mysql-test/r/grant.result:
  Extra test to catch wrong packet bug
mysql-test/t/grant.test:
  Extra test to catch wrong packet bug
mysys/my_chsize.c:
  Cleanup
sql/opt_range.cc:
  Fix to recent BETWEEN patch
sql/sql_acl.cc:
  Fix packet error when using wrong GRANT command
sql/sql_select.cc:
  Cleanups
  Added not critical out-of-memory check
parent 5c9e0cdc
......@@ -276,6 +276,7 @@ inline double ulonglong2double(ulonglong value)
#define HAVE_ISAM /* We want to have support for ISAM in 4.0 */
#define HAVE_QUERY_CACHE
#define SPRINTF_RETURNS_INT
#define HAVE_SETFILEPOINTER
#ifdef NOT_USED
#define HAVE_SNPRINTF /* Gave link error */
......
......@@ -108,3 +108,6 @@ flush privileges;
drop table t1;
GRANT FILE on mysqltest.* to mysqltest_1@localhost;
Wrong usage of DB GRANT and GLOBAL PRIVILEGES
select 1;
1
1
......@@ -72,5 +72,10 @@ delete from mysql.tables_priv where user='mysqltest_1';
delete from mysql.columns_priv where user='mysqltest_1';
flush privileges;
drop table t1;
#
# Test some error conditions
#
--error 1221
GRANT FILE on mysqltest.* to mysqltest_1@localhost;
select 1; -- To test that the previous command didn't cause problems
......@@ -30,7 +30,7 @@
MyFlags Flags
DESCRIPTION
my_chsize() truncates file if shorter, else fill with the filler character
my_chsize() truncates file if shorter else fill with the filler character
RETURN VALUE
0 Ok
......@@ -38,89 +38,74 @@
*/
int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags)
{
my_off_t oldsize;
char buff[IO_SIZE];
DBUG_ENTER("my_chsize");
DBUG_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength,
MyFlags));
/* if file is shorter, expand with null, else fill unused part with null */
{
my_off_t oldsize;
char buff[IO_SIZE];
oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE));
DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE));
DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
#ifdef __WIN__
if (oldsize > newlength)
{
LARGE_INTEGER new_length;
HANDLE win_file;
win_file= (HANDLE)_get_osfhandle(fd);
new_length.QuadPart = newlength;
if (SetFilePointerEx(win_file,new_length,NULL,FILE_BEGIN))
{
if (SetEndOfFile(win_file))
DBUG_RETURN(0);
}
DBUG_PRINT("error",("errno: %d",errno));
my_errno=errno;
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno);
DBUG_RETURN(1);
}
#elif defined(HAVE_CHSIZE)
if (oldsize > newlength || filler == 0)
if (oldsize > newlength)
#if defined(HAVE_SETFILEPOINTER)
/* This is for the moment only true on windows */
{
LARGE_INTEGER new_length;
HANDLE win_file= (HANDLE) _get_osfhandle(fd);
new_length.QuadPart = newlength;
if (SetFilePointerEx(win_file,new_length,NULL,FILE_BEGIN))
{
if (chsize(fd,(off_t) newlength))
{
DBUG_PRINT("error",("errno: %d",errno));
my_errno=errno;
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno);
DBUG_RETURN(1);
}
else
{
if (filler == 0)
DBUG_RETURN(0);
}
if (SetEndOfFile(win_file))
DBUG_RETURN(0);
}
my_errno= errno;
goto err;
}
#elif defined(HAVE_FTRUNCATE)
if (oldsize > newlength)
{
if (ftruncate(fd, (off_t) newlength))
{
if (ftruncate(fd, (off_t) newlength))
{
my_errno=errno;
DBUG_PRINT("error",("errno: %d",errno));
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), errno);
DBUG_RETURN(1);
}
DBUG_RETURN(0);
}
#else
if (oldsize > newlength)
{ /* Fill diff with null */
VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE)));
swap(my_off_t, newlength, oldsize);
my_errno= errno;
goto err;
}
#endif
/* Full file with 0 until it's as big as requested */
bfill(buff, IO_SIZE, filler);
while (newlength-oldsize > IO_SIZE)
DBUG_RETURN(0);
}
#elif defined(HAVE_CHSIZE)
{
if (chsize(fd, (off_t) newlength))
{
if (my_write(fd,(byte*) buff,IO_SIZE,MYF(MY_NABP)))
goto err;
oldsize+= IO_SIZE;
}
if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP)))
my_errno=errno;
goto err;
}
DBUG_RETURN(0);
err:
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),my_errno);
DBUG_PRINT("error",("errno: %d",my_errno));
DBUG_RETURN(1);
}
} /* my_chsize */
#else
{
/*
Fill space between requested length and true length with 'filler'
We should never come here on any modern machine
*/
VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE)));
swap(my_off_t, newlength, oldsize);
}
#endif
/* Full file with 'filler' until it's as big as requested */
bfill(buff, IO_SIZE, filler);
while (newlength-oldsize > IO_SIZE)
{
if (my_write(fd,(byte*) buff,IO_SIZE,MYF(MY_NABP)))
goto err;
oldsize+= IO_SIZE;
}
if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP)))
goto err;
DBUG_RETURN(0);
err:
DBUG_PRINT("error", ("errno: %d", errno));
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), my_errno);
DBUG_RETURN(1);
} /* my_chsize */
......@@ -798,7 +798,8 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond)
table_map ref_tables=cond->used_tables();
if (cond->type() != Item::FUNC_ITEM)
{ // Should be a field
if (ref_tables & param->current_table)
if ((ref_tables & param->current_table) ||
(ref_tables & ~(param->prev_tables | param->read_tables)))
DBUG_RETURN(0);
DBUG_RETURN(new SEL_TREE(SEL_TREE::MAYBE));
}
......
......@@ -2370,7 +2370,7 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list,
else
{
net_printf(&thd->net,ER_WRONG_USAGE,"DB GRANT","GLOBAL PRIVILEGES");
result= -1;
result= 1;
}
}
}
......
......@@ -1490,11 +1490,15 @@ add_key_field(KEY_FIELD **key_fields,uint and_level,
}
}
DBUG_ASSERT(num_values == 1);
// DBUG_ASSERT(eq_func); /* QQ: Can I uncomment this ASSERT ? */
/*
For the moment eq_func is always true. This slot is reserved for future
extensions where we want to remembers other things than just eq comparisons
*/
DBUG_ASSERT(eq_func);
/* Store possible eq field */
(*key_fields)->field=field;
(*key_fields)->eq_func=eq_func;
(*key_fields)->val=*value;
(*key_fields)->val= *value;
(*key_fields)->level=(*key_fields)->const_level=and_level;
(*key_fields)->exists_optimize=exists_optimize;
(*key_fields)++;
......@@ -1582,6 +1586,8 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level,
if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM)
{
Item *tmp=new Item_null;
if (!tmp) // Should never be true
return;
add_key_field(key_fields,*and_level,
((Item_field*) (cond_func->arguments()[0]))->field,
cond_func->functype() == Item_func::ISNULL_FUNC,
......
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