Commit 6c81552d authored by monty@mashka.mysql.fi's avatar monty@mashka.mysql.fi

Better fix for GRANT bug

parent e10fd444
...@@ -1644,7 +1644,8 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) ...@@ -1644,7 +1644,8 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables)
found_table=1; found_table=1;
Field *find=find_field_in_table(thd,tables->table,name,length, Field *find=find_field_in_table(thd,tables->table,name,length,
grant_option && grant_option &&
tables->grant.want_privilege ,1); tables->table->grant.want_privilege,
1);
if (find) if (find)
{ {
if (find == WRONG_GRANT) if (find == WRONG_GRANT)
...@@ -1683,7 +1684,9 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) ...@@ -1683,7 +1684,9 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables)
for (; tables ; tables=tables->next) for (; tables ; tables=tables->next)
{ {
Field *field=find_field_in_table(thd,tables->table,name,length, Field *field=find_field_in_table(thd,tables->table,name,length,
grant_option && tables->grant.want_privilege ,allow_rowid); grant_option &&
tables->table->grant.want_privilege,
allow_rowid);
if (field) if (field)
{ {
if (field == WRONG_GRANT) if (field == WRONG_GRANT)
......
...@@ -10,10 +10,11 @@ use strict; ...@@ -10,10 +10,11 @@ use strict;
use vars qw($dbh $user_dbh $opt_help $opt_Information $opt_force $opt_debug use vars qw($dbh $user_dbh $opt_help $opt_Information $opt_force $opt_debug
$opt_verbose $opt_server $opt_root_user $opt_password $opt_user $opt_verbose $opt_server $opt_root_user $opt_password $opt_user
$opt_database $opt_host $version $user $tables_cols $columns_cols); $opt_database $opt_host $version $user $tables_cols $columns_cols
$opt_silent);
$version="1.0"; $version="1.1";
$opt_help=$opt_Information=$opt_force=$opt_debug=$opt_verbose=0; $opt_help=$opt_Information=$opt_force=$opt_debug=$opt_verbose=$opt_silent=0;
$opt_host="localhost", $opt_host="localhost",
$opt_server="mysql"; $opt_server="mysql";
$opt_root_user="root"; $opt_root_user="root";
...@@ -21,7 +22,7 @@ $opt_password=""; ...@@ -21,7 +22,7 @@ $opt_password="";
$opt_user="grant_user"; $opt_user="grant_user";
$opt_database="grant_test"; $opt_database="grant_test";
GetOptions("Information","help","server=s","root-user=s","password=s","user","database=s","force","host=s","debug","verbose") || usage(); GetOptions("Information","help","server=s","root-user=s","password=s","user","database=s","force","host=s","debug","verbose","silent") || usage();
usage() if ($opt_help || $opt_Information); usage() if ($opt_help || $opt_Information);
$user="$opt_user\@$opt_host"; $user="$opt_user\@$opt_host";
...@@ -477,7 +478,10 @@ sub user_connect ...@@ -477,7 +478,10 @@ sub user_connect
$password, { PrintError => 0}); $password, { PrintError => 0});
if (!$user_dbh) if (!$user_dbh)
{ {
print "$DBI::errstr\n"; if ($opt_verbose || !$ignore_error)
{
print "Error on connect: $DBI::errstr\n";
}
if (!$ignore_error) if (!$ignore_error)
{ {
die "The above should not have failed!"; die "The above should not have failed!";
...@@ -492,7 +496,7 @@ sub user_connect ...@@ -492,7 +496,7 @@ sub user_connect
sub safe_query sub safe_query
{ {
my ($query,$ignore_error)=@_; my ($query,$ignore_error)=@_;
if (do_query($dbh,$query)) if (do_query($dbh,$query, $ignore_error))
{ {
if (!defined($ignore_error)) if (!defined($ignore_error))
{ {
...@@ -509,7 +513,7 @@ sub safe_query ...@@ -509,7 +513,7 @@ sub safe_query
sub user_query sub user_query
{ {
my ($query,$ignore_error)=@_; my ($query,$ignore_error)=@_;
if (do_query($user_dbh,$query)) if (do_query($user_dbh,$query, $ignore_error))
{ {
if (!defined($ignore_error)) if (!defined($ignore_error))
{ {
...@@ -525,8 +529,8 @@ sub user_query ...@@ -525,8 +529,8 @@ sub user_query
sub do_query sub do_query
{ {
my ($my_dbh, $query)=@_; my ($my_dbh, $query, $ignore_error)=@_;
my ($sth,$row,$tab,$col,$found); my ($sth, $row, $tab, $col, $found, $fatal_error);
print "$query\n" if ($opt_debug || $opt_verbose); print "$query\n" if ($opt_debug || $opt_verbose);
if (!($sth= $my_dbh->prepare($query))) if (!($sth= $my_dbh->prepare($query)))
...@@ -535,13 +539,19 @@ sub do_query ...@@ -535,13 +539,19 @@ sub do_query
return 1; return 1;
} }
if (!$sth->execute) if (!$sth->execute)
{
$fatal_error= ($DBI::errstr =~ /parse error/);
if (!$ignore_error || $opt_verbose || $fatal_error)
{ {
print "Error in execute: $DBI::errstr\n"; print "Error in execute: $DBI::errstr\n";
die if ($DBI::errstr =~ /parse error/); }
die if ($fatal_error);
$sth->finish; $sth->finish;
return 1; return 1;
} }
$found=0; $found=0;
if (!$opt_silent)
{
while (($row=$sth->fetchrow_arrayref)) while (($row=$sth->fetchrow_arrayref))
{ {
$found=1; $found=1;
...@@ -555,6 +565,7 @@ sub do_query ...@@ -555,6 +565,7 @@ sub do_query
print "\n"; print "\n";
} }
print "\n" if ($found); print "\n" if ($found);
}
$sth->finish; $sth->finish;
return 0; return 0;
} }
...@@ -9,13 +9,13 @@ drop database grant_test ...@@ -9,13 +9,13 @@ drop database grant_test
Error in execute: Can't drop database 'grant_test'. Database doesn't exist Error in execute: Can't drop database 'grant_test'. Database doesn't exist
create database grant_test create database grant_test
Connecting grant_user Connecting grant_user
Access denied for user: '@localhost' to database 'grant_test' Error on connect: Access denied for user: '@localhost' to database 'grant_test'
grant select on *.* to grant_user@localhost grant select on *.* to grant_user@localhost
set password FOR grant_user2@localhost = password('test') set password FOR grant_user2@localhost = password('test')
Error in execute: Can't find any matching row in the user table Error in execute: Can't find any matching row in the user table
set password FOR grant_user=password('test') set password FOR grant_user=password('test')
Connecting grant_user Connecting grant_user
Access denied for user: 'grant_user@localhost' (Using password: NO) Error on connect: Access denied for user: 'grant_user@localhost' (Using password: NO)
set password FOR grant_user='' set password FOR grant_user=''
Connecting grant_user Connecting grant_user
select * from mysql.user where user = 'grant_user' select * from mysql.user where user = 'grant_user'
...@@ -48,7 +48,7 @@ Error in execute: The host or user argument to GRANT is too long ...@@ -48,7 +48,7 @@ Error in execute: The host or user argument to GRANT is too long
grant select on grant_test.test to grant_user with grant option grant select on grant_test.test to grant_user with grant option
Error in execute: grant command denied to user: 'grant_user@localhost' for table 'test' Error in execute: grant command denied to user: 'grant_user@localhost' for table 'test'
set password FOR ''@''='' set password FOR ''@''=''
Error in execute: You are using MySQL as an anonymous users and anonymous users are not allowed to change passwords Error in execute: Can't find any matching row in the user table
set password FOR root@localhost = password('test') set password FOR root@localhost = password('test')
Error in execute: Access denied for user: 'grant_user@localhost' to database 'mysql' Error in execute: Access denied for user: 'grant_user@localhost' to database 'mysql'
revoke select on *.* from grant_user@localhost revoke select on *.* from grant_user@localhost
...@@ -86,7 +86,7 @@ select count(*) from grant_test.test ...@@ -86,7 +86,7 @@ select count(*) from grant_test.test
revoke ALL PRIVILEGES on *.* from grant_user@localhost revoke ALL PRIVILEGES on *.* from grant_user@localhost
Connecting grant_user Connecting grant_user
Access denied for user: 'grant_user@localhost' to database 'grant_test' Error on connect: Access denied for user: 'grant_user@localhost' to database 'grant_test'
delete from user where user='grant_user' delete from user where user='grant_user'
flush privileges flush privileges
delete from user where user='grant_user' delete from user where user='grant_user'
...@@ -133,7 +133,7 @@ insert into grant_test.test values (6,0) ...@@ -133,7 +133,7 @@ insert into grant_test.test values (6,0)
Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test' Error in execute: Access denied for user: 'grant_user@localhost' to database 'grant_test'
REVOKE GRANT OPTION on grant_test.* from grant_user@localhost REVOKE GRANT OPTION on grant_test.* from grant_user@localhost
Connecting grant_user Connecting grant_user
Access denied for user: 'grant_user@localhost' to database 'grant_test' Error on connect: Access denied for user: 'grant_user@localhost' to database 'grant_test'
grant ALL PRIVILEGES on grant_test.* to grant_user@localhost grant ALL PRIVILEGES on grant_test.* to grant_user@localhost
Connecting grant_user Connecting grant_user
select * from mysql.user where user = 'grant_user' select * from mysql.user where user = 'grant_user'
...@@ -156,7 +156,7 @@ localhost grant_user N N N N N N N N N N N N N N ...@@ -156,7 +156,7 @@ localhost grant_user N N N N N N N N N N N N N N
select * from mysql.db where user = 'grant_user' select * from mysql.db where user = 'grant_user'
Connecting grant_user Connecting grant_user
Access denied for user: 'grant_user@localhost' to database 'grant_test' Error on connect: Access denied for user: 'grant_user@localhost' to database 'grant_test'
grant create on grant_test.test2 to grant_user@localhost grant create on grant_test.test2 to grant_user@localhost
Connecting grant_user Connecting grant_user
create table grant_test.test2 (a int not null) create table grant_test.test2 (a int not null)
......
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