summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <Sinisa@sinisa.nasamreza.org>2002-06-25 21:20:10 +0300
committerunknown <Sinisa@sinisa.nasamreza.org>2002-06-25 21:20:10 +0300
commitea20da9d4dcc64ba6317c71c9138015bdc55b3ed (patch)
treef4a378e5c4a12d1d735ff95e378a82f208cbb5cb
parent7243131d2e1c8187dd7fb686f54322e6e19c1332 (diff)
downloadmariadb-git-ea20da9d4dcc64ba6317c71c9138015bdc55b3ed.tar.gz
Fix for a user management system that resources can be reset to zero
with a GRANT statement.
-rw-r--r--sql/sql_acl.cc12
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_yacc.yy3
-rw-r--r--sql/structs.h2
4 files changed, 11 insertions, 8 deletions
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index cdfe2f2e5b3..aff6c206b28 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -652,11 +652,11 @@ static void acl_update_user(const char *user, const char *host,
acl_user->host.hostname && !strcmp(host,acl_user->host.hostname))
{
acl_user->access=privileges;
- if (mqh->questions)
+ if (mqh->bits & 1)
acl_user->user_resource.questions=mqh->questions;
- if (mqh->updates)
+ if (mqh->bits & 2)
acl_user->user_resource.updates=mqh->updates;
- if (mqh->connections)
+ if (mqh->bits & 4)
acl_user->user_resource.connections=mqh->connections;
#ifdef HAVE_OPENSSL
acl_user->ssl_type=ssl_type;
@@ -1300,11 +1300,11 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo,
#endif /* HAVE_OPENSSL */
USER_RESOURCES mqh = thd->lex.mqh;
- if (mqh.questions)
+ if (mqh.bits & 1)
table->field[28]->store((longlong) mqh.questions);
- if (mqh.updates)
+ if (mqh.bits & 2)
table->field[29]->store((longlong) mqh.updates);
- if (mqh.connections)
+ if (mqh.bits & 4)
table->field[30]->store((longlong) mqh.connections);
mqh_used = mqh_used || mqh.questions || mqh.updates || mqh.connections;
}
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index f3b5f45ae6b..7124066bd3b 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -392,7 +392,7 @@ static void reset_mqh(THD *thd, LEX_USER *lu, bool get_them=false)
if (lu) // for GRANT
{
USER_CONN *uc;
- volatile uint temp_len=lu->user.length+lu->host.length+2;
+ uint temp_len=lu->user.length+lu->host.length+2;
char temp_user[USERNAME_LENGTH+HOSTNAME_LENGTH+2];
memcpy(temp_user,lu->user.str,lu->user.length);
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index dcb5f680357..7b3dc7db52e 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -3669,14 +3669,17 @@ grant_option:
| MAX_QUERIES_PER_HOUR ULONG_NUM
{
Lex->mqh.questions=$2;
+ Lex->mqh.bits |= 1;
}
| MAX_UPDATES_PER_HOUR ULONG_NUM
{
Lex->mqh.updates=$2;
+ Lex->mqh.bits |= 2;
}
| MAX_CONNECTIONS_PER_HOUR ULONG_NUM
{
Lex->mqh.connections=$2;
+ Lex->mqh.bits |= 4;
};
begin:
diff --git a/sql/structs.h b/sql/structs.h
index 75280b34715..00b9c6153fe 100644
--- a/sql/structs.h
+++ b/sql/structs.h
@@ -163,7 +163,7 @@ typedef struct st_lex_user {
typedef struct user_resources {
- uint questions, updates, connections;
+ uint questions, updates, connections, bits;
} USER_RESOURCES;
typedef struct user_conn {