summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2013-05-08 14:32:32 +0200
committerSergei Golubchik <sergii@pisem.net>2013-05-08 14:32:32 +0200
commit4a0f2563d3d1747a4704e6241380071efbeb3882 (patch)
treeeacf17c38fb72c458fe134b8d8fde0dfdfce6eb2
parent61ed0ebe7388d8302f2de7144de41da32bf085ba (diff)
downloadmariadb-git-4a0f2563d3d1747a4704e6241380071efbeb3882.tar.gz
MDEV-4462 mysqld gets SIGFPE when mysql.user table is empty
avoid divison by zero
-rw-r--r--mysql-test/r/empty_user_table.result8
-rw-r--r--mysql-test/t/empty_user_table.test18
-rw-r--r--sql/sql_acl.cc6
3 files changed, 32 insertions, 0 deletions
diff --git a/mysql-test/r/empty_user_table.result b/mysql-test/r/empty_user_table.result
new file mode 100644
index 00000000000..df9d803e5c0
--- /dev/null
+++ b/mysql-test/r/empty_user_table.result
@@ -0,0 +1,8 @@
+create table t1 as select * from mysql.user;
+truncate table mysql.user;
+flush privileges;
+connect(localhost,u1,,test,MASTER_PORT,MASTER_SOCKET);
+ERROR 28000: Access denied for user 'u1'@'localhost' (using password: NO)
+insert mysql.user select * from t1;
+drop table t1;
+flush privileges;
diff --git a/mysql-test/t/empty_user_table.test b/mysql-test/t/empty_user_table.test
new file mode 100644
index 00000000000..7e672cc64f6
--- /dev/null
+++ b/mysql-test/t/empty_user_table.test
@@ -0,0 +1,18 @@
+#
+# MDEV-4462 mysqld gets SIGFPE when mysql.user table is empty
+#
+
+source include/not_embedded.inc;
+
+create table t1 as select * from mysql.user;
+truncate table mysql.user;
+flush privileges;
+
+--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
+--error ER_ACCESS_DENIED_ERROR
+connect (fail,localhost,u1);
+
+insert mysql.user select * from t1;
+drop table t1;
+flush privileges;
+
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 29922aa5321..9983c52abb5 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -7367,6 +7367,12 @@ static bool find_mpvio_user(MPVIO_EXT *mpvio, Security_context *sctx)
cs->coll->hash_sort(cs, (uchar*) sctx->user, strlen(sctx->user), &nr1, &nr2);
pthread_mutex_lock(&acl_cache->lock);
+ if (!acl_users.elements)
+ {
+ pthread_mutex_unlock(&acl_cache->lock);
+ login_failed_error(mpvio->thd);
+ return 1;
+ }
uint i= nr1 % acl_users.elements;
ACL_USER *acl_user_tmp= dynamic_element(&acl_users, i, ACL_USER*);
mpvio->acl_user= acl_user_tmp->copy(mpvio->thd->mem_root);