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) ...@@ -276,6 +276,7 @@ inline double ulonglong2double(ulonglong value)
#define HAVE_ISAM /* We want to have support for ISAM in 4.0 */ #define HAVE_ISAM /* We want to have support for ISAM in 4.0 */
#define HAVE_QUERY_CACHE #define HAVE_QUERY_CACHE
#define SPRINTF_RETURNS_INT #define SPRINTF_RETURNS_INT
#define HAVE_SETFILEPOINTER
#ifdef NOT_USED #ifdef NOT_USED
#define HAVE_SNPRINTF /* Gave link error */ #define HAVE_SNPRINTF /* Gave link error */
......
...@@ -108,3 +108,6 @@ flush privileges; ...@@ -108,3 +108,6 @@ flush privileges;
drop table t1; drop table t1;
GRANT FILE on mysqltest.* to mysqltest_1@localhost; GRANT FILE on mysqltest.* to mysqltest_1@localhost;
Wrong usage of DB GRANT and GLOBAL PRIVILEGES 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'; ...@@ -72,5 +72,10 @@ delete from mysql.tables_priv where user='mysqltest_1';
delete from mysql.columns_priv where user='mysqltest_1'; delete from mysql.columns_priv where user='mysqltest_1';
flush privileges; flush privileges;
drop table t1; drop table t1;
#
# Test some error conditions
#
--error 1221 --error 1221
GRANT FILE on mysqltest.* to mysqltest_1@localhost; GRANT FILE on mysqltest.* to mysqltest_1@localhost;
select 1; -- To test that the previous command didn't cause problems
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
MyFlags Flags MyFlags Flags
DESCRIPTION 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 RETURN VALUE
0 Ok 0 Ok
...@@ -38,73 +38,60 @@ ...@@ -38,73 +38,60 @@
*/ */
int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) 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_ENTER("my_chsize");
DBUG_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength, DBUG_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength,
MyFlags)); 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)); oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE));
DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize)); DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
#ifdef __WIN__
if (oldsize > newlength) if (oldsize > newlength)
#if defined(HAVE_SETFILEPOINTER)
/* This is for the moment only true on windows */
{ {
LARGE_INTEGER new_length; LARGE_INTEGER new_length;
HANDLE win_file; HANDLE win_file= (HANDLE) _get_osfhandle(fd);
win_file= (HANDLE)_get_osfhandle(fd);
new_length.QuadPart = newlength; new_length.QuadPart = newlength;
if (SetFilePointerEx(win_file,new_length,NULL,FILE_BEGIN)) if (SetFilePointerEx(win_file,new_length,NULL,FILE_BEGIN))
{ {
if (SetEndOfFile(win_file)) if (SetEndOfFile(win_file))
DBUG_RETURN(0); DBUG_RETURN(0);
} }
DBUG_PRINT("error",("errno: %d",errno)); my_errno= errno;
my_errno=errno; goto err;
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno);
DBUG_RETURN(1);
} }
#elif defined(HAVE_CHSIZE) #elif defined(HAVE_FTRUNCATE)
if (oldsize > newlength || filler == 0)
{ {
if (chsize(fd,(off_t) newlength)) if (ftruncate(fd, (off_t) newlength))
{ {
DBUG_PRINT("error",("errno: %d",errno)); my_errno= errno;
my_errno=errno; goto err;
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); DBUG_RETURN(0);
} }
} #elif defined(HAVE_CHSIZE)
#elif defined(HAVE_FTRUNCATE)
if (oldsize > newlength)
{ {
if (ftruncate(fd, (off_t) newlength)) if (chsize(fd, (off_t) newlength))
{ {
my_errno=errno; my_errno=errno;
DBUG_PRINT("error",("errno: %d",errno)); goto err;
if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), errno);
DBUG_RETURN(1);
} }
DBUG_RETURN(0); DBUG_RETURN(0);
} }
#else #else
if (oldsize > newlength) {
{ /* Fill diff with null */ /*
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))); VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE)));
swap(my_off_t, newlength, oldsize); swap(my_off_t, newlength, oldsize);
} }
#endif #endif
/* Full file with 0 until it's as big as requested */
/* Full file with 'filler' until it's as big as requested */
bfill(buff, IO_SIZE, filler); bfill(buff, IO_SIZE, filler);
while (newlength-oldsize > IO_SIZE) while (newlength-oldsize > IO_SIZE)
{ {
...@@ -115,12 +102,10 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) ...@@ -115,12 +102,10 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags)
if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP))) if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP)))
goto err; goto err;
DBUG_RETURN(0); DBUG_RETURN(0);
err:
err:
DBUG_PRINT("error", ("errno: %d", errno));
if (MyFlags & MY_WME) if (MyFlags & MY_WME)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),my_errno); my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), my_errno);
DBUG_PRINT("error",("errno: %d",my_errno));
DBUG_RETURN(1); DBUG_RETURN(1);
}
} /* my_chsize */ } /* my_chsize */
...@@ -798,7 +798,8 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond) ...@@ -798,7 +798,8 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond)
table_map ref_tables=cond->used_tables(); table_map ref_tables=cond->used_tables();
if (cond->type() != Item::FUNC_ITEM) if (cond->type() != Item::FUNC_ITEM)
{ // Should be a field { // 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(0);
DBUG_RETURN(new SEL_TREE(SEL_TREE::MAYBE)); DBUG_RETURN(new SEL_TREE(SEL_TREE::MAYBE));
} }
......
...@@ -2370,7 +2370,7 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, ...@@ -2370,7 +2370,7 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list,
else else
{ {
net_printf(&thd->net,ER_WRONG_USAGE,"DB GRANT","GLOBAL PRIVILEGES"); 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, ...@@ -1490,11 +1490,15 @@ add_key_field(KEY_FIELD **key_fields,uint and_level,
} }
} }
DBUG_ASSERT(num_values == 1); 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 */ /* Store possible eq field */
(*key_fields)->field=field; (*key_fields)->field=field;
(*key_fields)->eq_func=eq_func; (*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)->level=(*key_fields)->const_level=and_level;
(*key_fields)->exists_optimize=exists_optimize; (*key_fields)->exists_optimize=exists_optimize;
(*key_fields)++; (*key_fields)++;
...@@ -1582,6 +1586,8 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, ...@@ -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) if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM)
{ {
Item *tmp=new Item_null; Item *tmp=new Item_null;
if (!tmp) // Should never be true
return;
add_key_field(key_fields,*and_level, add_key_field(key_fields,*and_level,
((Item_field*) (cond_func->arguments()[0]))->field, ((Item_field*) (cond_func->arguments()[0]))->field,
cond_func->functype() == Item_func::ISNULL_FUNC, 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