Merge lp:~sergei.glushchenko/percona-server/CVE-2012-5627-bug1172090-5.6 into lp:percona-server/5.6

Proposed by Sergei Glushchenko
Status: Merged
Approved by: Laurynas Biveinis
Approved revision: no longer in the source branch.
Merged at revision: 344
Proposed branch: lp:~sergei.glushchenko/percona-server/CVE-2012-5627-bug1172090-5.6
Merge into: lp:percona-server/5.6
Diff against target: 758 lines (+357/-171)
11 files modified
Percona-Server/client/mysqltest.cc (+4/-1)
Percona-Server/mysql-test/r/change_user_notembedded.result (+5/-0)
Percona-Server/mysql-test/r/failed_auth_3909.result (+20/-0)
Percona-Server/mysql-test/r/mysqltest.result (+3/-3)
Percona-Server/mysql-test/t/change_user_notembedded.test (+24/-0)
Percona-Server/mysql-test/t/failed_auth_3909.test (+37/-0)
Percona-Server/sql/sql_acl.cc (+48/-6)
Percona-Server/sql/sql_class.cc (+1/-0)
Percona-Server/sql/sql_class.h (+1/-0)
Percona-Server/sql/sql_parse.cc (+18/-1)
Percona-Server/tests/mysql_client_test.c (+196/-160)
To merge this branch: bzr merge lp:~sergei.glushchenko/percona-server/CVE-2012-5627-bug1172090-5.6
Reviewer Review Type Date Requested Status
Laurynas Biveinis (community) Approve
Review via email: mp+161800@code.launchpad.net

Description of the change

This is a manual merge fix for #1172090, #1171941 from 5.6

http://jenkins.percona.com/view/PS%205.6/job/percona-server-5.6-param/81/

To post a comment you must log in.
Revision history for this message
Laurynas Biveinis (laurynas-biveinis) wrote :

Same comment as for 5.5, also the sql_acl.cc bit in rev 342 belongs to 343 instead. It is benign enough though.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'Percona-Server/client/mysqltest.cc'
--- Percona-Server/client/mysqltest.cc 2013-03-05 12:46:43 +0000
+++ Percona-Server/client/mysqltest.cc 2013-05-01 09:25:43 +0000
@@ -4165,7 +4165,10 @@
4165 cur_con->name, ds_user.str, ds_passwd.str, ds_db.str));4165 cur_con->name, ds_user.str, ds_passwd.str, ds_db.str));
41664166
4167 if (mysql_change_user(mysql, ds_user.str, ds_passwd.str, ds_db.str))4167 if (mysql_change_user(mysql, ds_user.str, ds_passwd.str, ds_db.str))
4168 die("change user failed: %s", mysql_error(mysql));4168 handle_error(command, mysql_errno(mysql), mysql_error(mysql),
4169 mysql_sqlstate(mysql), &ds_res);
4170 else
4171 handle_no_error(command);
41694172
4170 dynstr_free(&ds_user);4173 dynstr_free(&ds_user);
4171 dynstr_free(&ds_passwd);4174 dynstr_free(&ds_passwd);
41724175
=== added file 'Percona-Server/mysql-test/r/change_user_notembedded.result'
--- Percona-Server/mysql-test/r/change_user_notembedded.result 1970-01-01 00:00:00 +0000
+++ Percona-Server/mysql-test/r/change_user_notembedded.result 2013-05-01 09:25:43 +0000
@@ -0,0 +1,5 @@
1ERROR 28000: Access denied for user 'foo'@'localhost' (using password: YES)
2ERROR 28000: Access denied for user 'foo'@'localhost' (using password: NO)
3ERROR 28000: Access denied for user 'foo'@'localhost' (using password: YES)
4ERROR 08S01: Unknown command
5ERROR 08S01: Unknown command
06
=== added file 'Percona-Server/mysql-test/r/failed_auth_3909.result'
--- Percona-Server/mysql-test/r/failed_auth_3909.result 1970-01-01 00:00:00 +0000
+++ Percona-Server/mysql-test/r/failed_auth_3909.result 2013-05-01 09:25:43 +0000
@@ -0,0 +1,20 @@
1optimize table mysql.user;
2Table Op Msg_type Msg_text
3mysql.user optimize status OK
4insert mysql.user (user,plugin) values ('foo','bar'),('bar','bar'),('baz','bar');
5Warnings:
6Warning 1364 Field 'ssl_cipher' doesn't have a default value
7Warning 1364 Field 'x509_issuer' doesn't have a default value
8Warning 1364 Field 'x509_subject' doesn't have a default value
9flush privileges;
10connect(localhost,u1,,test,MASTER_PORT,MASTER_SOCKET);
11ERROR HY000: Plugin 'bar' is not loaded
12connect(localhost,u2,,test,MASTER_PORT,MASTER_SOCKET);
13ERROR 28000: Access denied for user 'u2'@'localhost' (using password: NO)
14connect(localhost,u2,password,test,MASTER_PORT,MASTER_SOCKET);
15ERROR 28000: Access denied for user 'u2'@'localhost' (using password: YES)
16ERROR HY000: Plugin 'bar' is not loaded
17ERROR 28000: Access denied for user 'u2'@'localhost' (using password: NO)
18ERROR 28000: Access denied for user 'u2'@'localhost' (using password: YES)
19delete from mysql.user where plugin = 'bar';
20flush privileges;
021
=== modified file 'Percona-Server/mysql-test/r/mysqltest.result'
--- Percona-Server/mysql-test/r/mysqltest.result 2012-08-22 01:40:20 +0000
+++ Percona-Server/mysql-test/r/mysqltest.result 2013-05-01 09:25:43 +0000
@@ -929,9 +929,9 @@
929b varchar(255) YES NULL 929b varchar(255) YES NULL
930c datetime YES NULL 930c datetime YES NULL
931drop table t1;931drop table t1;
932mysqltest: At line 1: change user failed: Unknown database 'inexistent'932mysqltest: At line 1: query 'change_user root,,inexistent' failed: 1049: Unknown database 'inexistent'
933mysqltest: At line 1: change user failed: Access denied for user 'inexistent'@'localhost' (using password: NO)933mysqltest: At line 1: query 'change_user inexistent,,test' failed: 1045: Access denied for user 'inexistent'@'localhost' (using password: NO)
934mysqltest: At line 1: change user failed: Access denied for user 'root'@'localhost' (using password: YES)934mysqltest: At line 1: query 'change_user root,inexistent,test' failed: 1045: Access denied for user 'root'@'localhost' (using password: YES)
935REPLACED_FILE1.txt935REPLACED_FILE1.txt
936file1.txt936file1.txt
937file2.txt937file2.txt
938938
=== added file 'Percona-Server/mysql-test/t/change_user_notembedded.test'
--- Percona-Server/mysql-test/t/change_user_notembedded.test 1970-01-01 00:00:00 +0000
+++ Percona-Server/mysql-test/t/change_user_notembedded.test 2013-05-01 09:25:43 +0000
@@ -0,0 +1,24 @@
1source include/not_embedded.inc;
2
3#
4# MDEV-3915 COM_CHANGE_USER allows fast password brute-forcing
5#
6# only three failed change_user per connection.
7# successful change_user do NOT reset the counter
8#
9connect (test,localhost,root,,);
10connection test;
11--error 1045
12change_user foo,bar;
13--error 1045
14change_user foo;
15change_user;
16--error 1045
17change_user foo,bar;
18--error 1047
19change_user foo,bar;
20--error 1047
21change_user;
22disconnect test;
23connection default;
24
025
=== added file 'Percona-Server/mysql-test/t/failed_auth_3909.test'
--- Percona-Server/mysql-test/t/failed_auth_3909.test 1970-01-01 00:00:00 +0000
+++ Percona-Server/mysql-test/t/failed_auth_3909.test 2013-05-01 09:25:43 +0000
@@ -0,0 +1,37 @@
1source include/not_embedded.inc;
2
3#
4# MDEV-3909 remote user enumeration
5#
6# verify that for some failed login attemps (with wrong user names)
7# the server requests a plugin
8#
9optimize table mysql.user;
10insert mysql.user (user,plugin) values ('foo','bar'),('bar','bar'),('baz','bar');
11flush privileges;
12
13--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
14--error ER_PLUGIN_IS_NOT_LOADED
15connect (fail,localhost,u1);
16
17--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
18--error ER_ACCESS_DENIED_ERROR
19connect (fail,localhost,u2);
20
21--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
22--error ER_ACCESS_DENIED_ERROR
23connect (fail,localhost,u2,password);
24
25--error ER_PLUGIN_IS_NOT_LOADED
26change_user u1;
27
28--error ER_ACCESS_DENIED_ERROR
29change_user u2;
30
31--error ER_ACCESS_DENIED_ERROR
32change_user u2,password;
33
34delete from mysql.user where plugin = 'bar';
35flush privileges;
36
37
038
=== modified file 'Percona-Server/sql/sql_acl.cc'
--- Percona-Server/sql/sql_acl.cc 2013-03-05 12:46:43 +0000
+++ Percona-Server/sql/sql_acl.cc 2013-05-01 09:25:43 +0000
@@ -9126,6 +9126,7 @@
9126 uint pkt_len;9126 uint pkt_len;
9127 } cached_server_packet;9127 } cached_server_packet;
9128 int packets_read, packets_written; ///< counters for send/received packets9128 int packets_read, packets_written; ///< counters for send/received packets
9129 bool make_it_fail;
9129 /** when plugin returns a failure this tells us what really happened */9130 /** when plugin returns a failure this tells us what really happened */
9130 enum { SUCCESS, FAILURE, RESTART } status;9131 enum { SUCCESS, FAILURE, RESTART } status;
91319132
@@ -9488,14 +9489,14 @@
9488/**9489/**
9489 Finds acl entry in user database for authentication purposes.9490 Finds acl entry in user database for authentication purposes.
9490 9491
9491 Finds a user and copies it into mpvio. Reports an authentication9492 Finds a user and copies it into mpvio. Creates a fake user
9492 failure if a user is not found.9493 if no matching user account is found.
94939494
9494 @note find_acl_user is not the same, because it doesn't take into9495 @note find_acl_user is not the same, because it doesn't take into
9495 account the case when user is not empty, but acl_user->user is empty9496 account the case when user is not empty, but acl_user->user is empty
94969497
9497 @retval 0 found9498 @retval 0 found
9498 @retval 1 not found9499 @retval 1 error
9499*/9500*/
9500static bool find_mpvio_user(MPVIO_EXT *mpvio)9501static bool find_mpvio_user(MPVIO_EXT *mpvio)
9501{9502{
@@ -9530,8 +9531,32 @@
95309531
9531 if (!mpvio->acl_user)9532 if (!mpvio->acl_user)
9532 {9533 {
9533 login_failed_error(mpvio, mpvio->auth_info.password_used);9534 /*
9534 DBUG_RETURN (1);9535 A matching user was not found. Fake it. Take any user, make the
9536 authentication fail later.
9537 This way we get a realistically looking failure, with occasional
9538 "change auth plugin" requests even for nonexistent users. The ratio
9539 of "change auth plugin" request will be the same for real and
9540 nonexistent users.
9541 Note, that we cannot pick any user at random, it must always be
9542 the same user account for the incoming sctx->user name.
9543 */
9544 ulong nr1=1, nr2=4;
9545 CHARSET_INFO *cs= &my_charset_latin1;
9546 cs->coll->hash_sort(cs, (uchar*) mpvio->auth_info.user_name,
9547 mpvio->auth_info.user_name_length, &nr1, &nr2);
9548
9549 mysql_mutex_lock(&acl_cache->lock);
9550 uint i= nr1 % acl_users.elements;
9551 ACL_USER *acl_user_tmp= dynamic_element(&acl_users, i, ACL_USER*);
9552 mpvio->acl_user= acl_user_tmp->copy(mpvio->mem_root);
9553 make_lex_string_root(mpvio->mem_root,
9554 &mpvio->acl_user_plugin,
9555 acl_user_tmp->plugin.str,
9556 acl_user_tmp->plugin.length, 0);
9557 mysql_mutex_unlock(&acl_cache->lock);
9558
9559 mpvio->make_it_fail= true;
9535 }9560 }
95369561
9537 if (my_strcasecmp(system_charset_info, mpvio->acl_user->plugin.str,9562 if (my_strcasecmp(system_charset_info, mpvio->acl_user->plugin.str,
@@ -9638,6 +9663,9 @@
9638 uint passwd_len= (mpvio->client_capabilities & CLIENT_SECURE_CONNECTION ?9663 uint passwd_len= (mpvio->client_capabilities & CLIENT_SECURE_CONNECTION ?
9639 (uchar) (*passwd++) : strlen(passwd));9664 (uchar) (*passwd++) : strlen(passwd));
96409665
9666 if (passwd_len)
9667 mpvio->auth_info.password_used= PASSWORD_USED_YES;
9668
9641 db+= passwd_len + 1;9669 db+= passwd_len + 1;
9642 /*9670 /*
9643 Database name is always NUL-terminated, so in case of empty database9671 Database name is always NUL-terminated, so in case of empty database
@@ -10431,6 +10459,10 @@
10431 *buf= (uchar*) mpvio->cached_client_reply.pkt;10459 *buf= (uchar*) mpvio->cached_client_reply.pkt;
10432 mpvio->cached_client_reply.pkt= 0;10460 mpvio->cached_client_reply.pkt= 0;
10433 mpvio->packets_read++;10461 mpvio->packets_read++;
10462
10463 if (mpvio->make_it_fail)
10464 goto err;
10465
10434 DBUG_RETURN ((int) mpvio->cached_client_reply.pkt_len);10466 DBUG_RETURN ((int) mpvio->cached_client_reply.pkt_len);
10435 }10467 }
1043610468
@@ -10473,12 +10505,21 @@
10473 else10505 else
10474 *buf= mpvio->net->read_pos;10506 *buf= mpvio->net->read_pos;
1047510507
10508 if (mpvio->make_it_fail)
10509 goto err;
10510
10476 DBUG_RETURN((int)pkt_len);10511 DBUG_RETURN((int)pkt_len);
1047710512
10478err:10513err:
10479 if (mpvio->status == MPVIO_EXT::FAILURE)10514 if (mpvio->status == MPVIO_EXT::FAILURE)
10480 {10515 {
10481 my_error(ER_HANDSHAKE_ERROR, MYF(0));10516 if (!current_thd->is_error())
10517 {
10518 if (mpvio->make_it_fail)
10519 login_failed_error(mpvio, mpvio->auth_info.password_used);
10520 else
10521 my_error(ER_HANDSHAKE_ERROR, MYF(0));
10522 }
10482 }10523 }
10483 DBUG_RETURN(-1);10524 DBUG_RETURN(-1);
10484}10525}
@@ -10686,6 +10727,7 @@
10686#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */10727#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
10687 mpvio->vio_is_encrypted= 0;10728 mpvio->vio_is_encrypted= 0;
10688 mpvio->status= MPVIO_EXT::FAILURE;10729 mpvio->status= MPVIO_EXT::FAILURE;
10730 mpvio->make_it_fail= false;
1068910731
10690 mpvio->client_capabilities= thd->client_capabilities;10732 mpvio->client_capabilities= thd->client_capabilities;
10691 mpvio->mem_root= thd->mem_root;10733 mpvio->mem_root= thd->mem_root;
1069210734
=== modified file 'Percona-Server/sql/sql_class.cc'
--- Percona-Server/sql/sql_class.cc 2013-03-05 12:46:43 +0000
+++ Percona-Server/sql/sql_class.cc 2013-05-01 09:25:43 +0000
@@ -899,6 +899,7 @@
899 first_successful_insert_id_in_prev_stmt_for_binlog(0),899 first_successful_insert_id_in_prev_stmt_for_binlog(0),
900 first_successful_insert_id_in_cur_stmt(0),900 first_successful_insert_id_in_cur_stmt(0),
901 stmt_depends_on_first_successful_insert_id_in_prev_stmt(FALSE),901 stmt_depends_on_first_successful_insert_id_in_prev_stmt(FALSE),
902 failed_com_change_user(0),
902 m_examined_row_count(0),903 m_examined_row_count(0),
903 m_statement_psi(NULL),904 m_statement_psi(NULL),
904 m_idle_psi(NULL),905 m_idle_psi(NULL),
905906
=== modified file 'Percona-Server/sql/sql_class.h'
--- Percona-Server/sql/sql_class.h 2013-03-05 12:46:43 +0000
+++ Percona-Server/sql/sql_class.h 2013-05-01 09:25:43 +0000
@@ -2641,6 +2641,7 @@
2641 }2641 }
26422642
2643 ha_rows cuted_fields;2643 ha_rows cuted_fields;
2644 uint8 failed_com_change_user;
26442645
2645private:2646private:
2646 /**2647 /**
26472648
=== modified file 'Percona-Server/sql/sql_parse.cc'
--- Percona-Server/sql/sql_parse.cc 2013-03-31 06:08:39 +0000
+++ Percona-Server/sql/sql_parse.cc 2013-05-01 09:25:43 +0000
@@ -1252,7 +1252,22 @@
1252 const CHARSET_INFO *save_character_set_results=1252 const CHARSET_INFO *save_character_set_results=
1253 thd->variables.character_set_results;1253 thd->variables.character_set_results;
12541254
1255 auth_rc= acl_authenticate(thd, packet_length);1255 /* Ensure we don't free security_ctx->user in case we have to revert */
1256 thd->security_ctx->user= 0;
1257 thd->set_user_connect(0);
1258
1259 /*
1260 to limit COM_CHANGE_USER ability to brute-force passwords,
1261 we only allow three unsuccessful COM_CHANGE_USER per connection.
1262 */
1263 if (thd->failed_com_change_user >= 3)
1264 {
1265 my_message(ER_UNKNOWN_COM_ERROR, ER(ER_UNKNOWN_COM_ERROR), MYF(0));
1266 auth_rc= 1;
1267 }
1268 else
1269 auth_rc= acl_authenticate(thd, packet_length);
1270
1256 MYSQL_AUDIT_NOTIFY_CONNECTION_CHANGE_USER(thd);1271 MYSQL_AUDIT_NOTIFY_CONNECTION_CHANGE_USER(thd);
1257 if (auth_rc)1272 if (auth_rc)
1258 {1273 {
@@ -1264,6 +1279,8 @@
1264 thd->variables.collation_connection= save_collation_connection;1279 thd->variables.collation_connection= save_collation_connection;
1265 thd->variables.character_set_results= save_character_set_results;1280 thd->variables.character_set_results= save_character_set_results;
1266 thd->update_charset();1281 thd->update_charset();
1282 thd->failed_com_change_user++;
1283 my_sleep(1000000);
1267 }1284 }
1268 else1285 else
1269 {1286 {
12701287
=== modified file 'Percona-Server/tests/mysql_client_test.c'
--- Percona-Server/tests/mysql_client_test.c 2013-03-05 12:46:43 +0000
+++ Percona-Server/tests/mysql_client_test.c 2013-05-01 09:25:43 +0000
@@ -16266,6 +16266,7 @@
16266 const char *pw= "password";16266 const char *pw= "password";
16267 const char *db= "mysqltest_user_test_database";16267 const char *db= "mysqltest_user_test_database";
16268 int rc;16268 int rc;
16269 MYSQL *conn;
1626916270
16270 DBUG_ENTER("test_change_user");16271 DBUG_ENTER("test_change_user");
16271 myheader("test_change_user");16272 myheader("test_change_user");
@@ -16309,149 +16310,173 @@
16309 rc= mysql_query(mysql, buff);16310 rc= mysql_query(mysql, buff);
16310 myquery(rc);16311 myquery(rc);
1631116312
16313 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
1631216314
16313 /* Try some combinations */16315 /* Try some combinations */
16314 rc= mysql_change_user(mysql, NULL, NULL, NULL);16316 rc= mysql_change_user(conn, NULL, NULL, NULL);
16315 DIE_UNLESS(rc);16317 DIE_UNLESS(rc);
16316 if (! opt_silent)16318 if (! opt_silent)
16317 printf("Got error (as expected): %s\n", mysql_error(mysql));16319 printf("Got error (as expected): %s\n", mysql_error(conn));
1631816320
1631916321
16320 rc= mysql_change_user(mysql, "", NULL, NULL);16322 rc= mysql_change_user(conn, "", NULL, NULL);
16321 DIE_UNLESS(rc);16323 DIE_UNLESS(rc);
16322 if (! opt_silent)16324 if (! opt_silent)
16323 printf("Got error (as expected): %s\n", mysql_error(mysql));16325 printf("Got error (as expected): %s\n", mysql_error(conn));
1632416326
16325 rc= mysql_change_user(mysql, "", "", NULL);16327 rc= mysql_change_user(conn, "", "", NULL);
16326 DIE_UNLESS(rc);16328 DIE_UNLESS(rc);
16327 if (! opt_silent)16329 if (! opt_silent)
16328 printf("Got error (as expected): %s\n", mysql_error(mysql));16330 printf("Got error (as expected): %s\n", mysql_error(conn));
1632916331
16330 rc= mysql_change_user(mysql, "", "", "");16332 mysql_close(conn);
16331 DIE_UNLESS(rc);16333 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
16332 if (! opt_silent)16334
16333 printf("Got error (as expected): %s\n", mysql_error(mysql));16335 rc= mysql_change_user(conn, "", "", "");
1633416336 DIE_UNLESS(rc);
16335 rc= mysql_change_user(mysql, NULL, "", "");16337 if (! opt_silent)
16336 DIE_UNLESS(rc);16338 printf("Got error (as expected): %s\n", mysql_error(conn));
16337 if (! opt_silent)16339
16338 printf("Got error (as expected): %s\n", mysql_error(mysql));16340 rc= mysql_change_user(conn, NULL, "", "");
1633916341 DIE_UNLESS(rc);
1634016342 if (! opt_silent)
16341 rc= mysql_change_user(mysql, NULL, NULL, "");16343 printf("Got error (as expected): %s\n", mysql_error(conn));
16342 DIE_UNLESS(rc);16344
16343 if (! opt_silent)16345
16344 printf("Got error (as expected): %s\n", mysql_error(mysql));16346 rc= mysql_change_user(conn, NULL, NULL, "");
1634516347 DIE_UNLESS(rc);
16346 rc= mysql_change_user(mysql, "", NULL, "");16348 if (! opt_silent)
16347 DIE_UNLESS(rc);16349 printf("Got error (as expected): %s\n", mysql_error(conn));
16348 if (! opt_silent)16350
16349 printf("Got error (as expected): %s\n", mysql_error(mysql));16351 mysql_close(conn);
1635016352 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
16351 rc= mysql_change_user(mysql, user_pw, NULL, "");16353
16352 DIE_UNLESS(rc);16354 rc= mysql_change_user(conn, "", NULL, "");
16353 if (! opt_silent)16355 DIE_UNLESS(rc);
16354 printf("Got error (as expected): %s\n", mysql_error(mysql));16356 if (! opt_silent)
1635516357 printf("Got error (as expected): %s\n", mysql_error(conn));
16356 rc= mysql_change_user(mysql, user_pw, "", "");16358
16357 DIE_UNLESS(rc);16359 rc= mysql_change_user(conn, user_pw, NULL, "");
16358 if (! opt_silent)16360 DIE_UNLESS(rc);
16359 printf("Got error (as expected): %s\n", mysql_error(mysql));16361 if (! opt_silent)
1636016362 printf("Got error (as expected): %s\n", mysql_error(conn));
16361 rc= mysql_change_user(mysql, user_pw, "", NULL);16363
16362 DIE_UNLESS(rc);16364 rc= mysql_change_user(conn, user_pw, "", "");
16363 if (! opt_silent)16365 DIE_UNLESS(rc);
16364 printf("Got error (as expected): %s\n", mysql_error(mysql));16366 if (! opt_silent)
1636516367 printf("Got error (as expected): %s\n", mysql_error(conn));
16366 rc= mysql_change_user(mysql, user_pw, NULL, NULL);16368
16367 DIE_UNLESS(rc);16369 mysql_close(conn);
16368 if (! opt_silent)16370 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
16369 printf("Got error (as expected): %s\n", mysql_error(mysql));16371
1637016372 rc= mysql_change_user(conn, user_pw, "", NULL);
16371 rc= mysql_change_user(mysql, user_pw, "", db);16373 DIE_UNLESS(rc);
16372 DIE_UNLESS(rc);16374 if (! opt_silent)
16373 if (! opt_silent)16375 printf("Got error (as expected): %s\n", mysql_error(conn));
16374 printf("Got error (as expected): %s\n", mysql_error(mysql));16376
1637516377 rc= mysql_change_user(conn, user_pw, NULL, NULL);
16376 rc= mysql_change_user(mysql, user_pw, NULL, db);16378 DIE_UNLESS(rc);
16377 DIE_UNLESS(rc);16379 if (! opt_silent)
16378 if (! opt_silent)16380 printf("Got error (as expected): %s\n", mysql_error(conn));
16379 printf("Got error (as expected): %s\n", mysql_error(mysql));16381
1638016382 rc= mysql_change_user(conn, user_pw, "", db);
16381 rc= mysql_change_user(mysql, user_pw, pw, db);16383 DIE_UNLESS(rc);
16382 myquery(rc);16384 if (! opt_silent)
1638316385 printf("Got error (as expected): %s\n", mysql_error(conn));
16384 rc= mysql_change_user(mysql, user_pw, pw, NULL);16386
16385 myquery(rc);16387 mysql_close(conn);
1638616388 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
16387 rc= mysql_change_user(mysql, user_pw, pw, "");16389
16388 myquery(rc);16390 rc= mysql_change_user(conn, user_pw, NULL, db);
1638916391 DIE_UNLESS(rc);
16390 rc= mysql_change_user(mysql, user_no_pw, pw, db);16392 if (! opt_silent)
16391 DIE_UNLESS(rc);16393 printf("Got error (as expected): %s\n", mysql_error(conn));
16392 if (! opt_silent)16394
16393 printf("Got error (as expected): %s\n", mysql_error(mysql));16395 rc= mysql_change_user(conn, user_pw, pw, db);
1639416396 myquery(rc);
16395 rc= mysql_change_user(mysql, user_no_pw, pw, "");16397
16396 DIE_UNLESS(rc);16398 rc= mysql_change_user(conn, user_pw, pw, NULL);
16397 if (! opt_silent)16399 myquery(rc);
16398 printf("Got error (as expected): %s\n", mysql_error(mysql));16400
1639916401 rc= mysql_change_user(conn, user_pw, pw, "");
16400 rc= mysql_change_user(mysql, user_no_pw, pw, NULL);16402 myquery(rc);
16401 DIE_UNLESS(rc);16403
16402 if (! opt_silent)16404 rc= mysql_change_user(conn, user_no_pw, pw, db);
16403 printf("Got error (as expected): %s\n", mysql_error(mysql));16405 DIE_UNLESS(rc);
1640416406 if (! opt_silent)
16405 rc= mysql_change_user(mysql, user_no_pw, "", NULL);16407 printf("Got error (as expected): %s\n", mysql_error(conn));
16406 myquery(rc);16408
1640716409 rc= mysql_change_user(conn, user_no_pw, pw, "");
16408 rc= mysql_change_user(mysql, user_no_pw, "", "");16410 DIE_UNLESS(rc);
16409 myquery(rc);16411 if (! opt_silent)
1641016412 printf("Got error (as expected): %s\n", mysql_error(conn));
16411 rc= mysql_change_user(mysql, user_no_pw, "", db);16413
16412 myquery(rc);16414 mysql_close(conn);
1641316415 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
16414 rc= mysql_change_user(mysql, user_no_pw, NULL, db);16416
16415 myquery(rc);16417 rc= mysql_change_user(conn, user_no_pw, pw, NULL);
1641616418 DIE_UNLESS(rc);
16417 rc= mysql_change_user(mysql, "", pw, db);16419 if (! opt_silent)
16418 DIE_UNLESS(rc);16420 printf("Got error (as expected): %s\n", mysql_error(conn));
16419 if (! opt_silent)16421
16420 printf("Got error (as expected): %s\n", mysql_error(mysql));16422 rc= mysql_change_user(conn, user_no_pw, "", NULL);
1642116423 myquery(rc);
16422 rc= mysql_change_user(mysql, "", pw, "");16424
16423 DIE_UNLESS(rc);16425 rc= mysql_change_user(conn, user_no_pw, "", "");
16424 if (! opt_silent)16426 myquery(rc);
16425 printf("Got error (as expected): %s\n", mysql_error(mysql));16427
1642616428 rc= mysql_change_user(conn, user_no_pw, "", db);
16427 rc= mysql_change_user(mysql, "", pw, NULL);16429 myquery(rc);
16428 DIE_UNLESS(rc);16430
16429 if (! opt_silent)16431 rc= mysql_change_user(conn, user_no_pw, NULL, db);
16430 printf("Got error (as expected): %s\n", mysql_error(mysql));16432 myquery(rc);
1643116433
16432 rc= mysql_change_user(mysql, NULL, pw, NULL);16434 rc= mysql_change_user(conn, "", pw, db);
16433 DIE_UNLESS(rc);16435 DIE_UNLESS(rc);
16434 if (! opt_silent)16436 if (! opt_silent)
16435 printf("Got error (as expected): %s\n", mysql_error(mysql));16437 printf("Got error (as expected): %s\n", mysql_error(conn));
1643616438
16437 rc= mysql_change_user(mysql, NULL, NULL, db);16439 rc= mysql_change_user(conn, "", pw, "");
16438 DIE_UNLESS(rc);16440 DIE_UNLESS(rc);
16439 if (! opt_silent)16441 if (! opt_silent)
16440 printf("Got error (as expected): %s\n", mysql_error(mysql));16442 printf("Got error (as expected): %s\n", mysql_error(conn));
1644116443
16442 rc= mysql_change_user(mysql, NULL, "", db);16444 mysql_close(conn);
16443 DIE_UNLESS(rc);16445 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
16444 if (! opt_silent)16446
16445 printf("Got error (as expected): %s\n", mysql_error(mysql));16447 rc= mysql_change_user(conn, "", pw, NULL);
1644616448 DIE_UNLESS(rc);
16447 rc= mysql_change_user(mysql, "", "", db);16449 if (! opt_silent)
16448 DIE_UNLESS(rc);16450 printf("Got error (as expected): %s\n", mysql_error(conn));
16449 if (! opt_silent)16451
16450 printf("Got error (as expected): %s\n", mysql_error(mysql));16452 rc= mysql_change_user(conn, NULL, pw, NULL);
16453 DIE_UNLESS(rc);
16454 if (! opt_silent)
16455 printf("Got error (as expected): %s\n", mysql_error(conn));
16456
16457 rc= mysql_change_user(conn, NULL, NULL, db);
16458 DIE_UNLESS(rc);
16459 if (! opt_silent)
16460 printf("Got error (as expected): %s\n", mysql_error(conn));
16461
16462 mysql_close(conn);
16463 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
16464
16465 rc= mysql_change_user(conn, NULL, "", db);
16466 DIE_UNLESS(rc);
16467 if (! opt_silent)
16468 printf("Got error (as expected): %s\n", mysql_error(conn));
16469
16470 rc= mysql_change_user(conn, "", "", db);
16471 DIE_UNLESS(rc);
16472 if (! opt_silent)
16473 printf("Got error (as expected): %s\n", mysql_error(conn));
1645116474
16452 /* Cleanup the environment */16475 /* Cleanup the environment */
1645316476
16454 mysql_change_user(mysql, opt_user, opt_password, current_db);16477 mysql_change_user(conn, opt_user, opt_password, current_db);
16478
16479 mysql_close(conn);
1645516480
16456 sprintf(buff, "drop database %s", db);16481 sprintf(buff, "drop database %s", db);
16457 rc= mysql_query(mysql, buff);16482 rc= mysql_query(mysql, buff);
@@ -17114,30 +17139,36 @@
17114 static char db[NAME_CHAR_LEN+1];17139 static char db[NAME_CHAR_LEN+1];
17115 static char query[LARGE_BUFFER_SIZE*2];17140 static char query[LARGE_BUFFER_SIZE*2];
17116#endif17141#endif
17142 MYSQL* conn;
1711717143
17118 DBUG_ENTER("test_bug31669");17144 DBUG_ENTER("test_bug31669");
17119 myheader("test_bug31669");17145 myheader("test_bug31669");
1712017146
17121 rc= mysql_change_user(mysql, NULL, NULL, NULL);17147 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
17148
17149 rc= mysql_change_user(conn, NULL, NULL, NULL);
17122 DIE_UNLESS(rc);17150 DIE_UNLESS(rc);
1712317151
17124 rc= mysql_change_user(mysql, "", "", "");17152 rc= mysql_change_user(conn, "", "", "");
17125 DIE_UNLESS(rc);17153 DIE_UNLESS(rc);
1712617154
17127 memset(buff, 'a', sizeof(buff));17155 memset(buff, 'a', sizeof(buff));
17128 buff[sizeof(buff) - 1] = '\0';17156 buff[sizeof(buff) - 1] = '\0';
1712917157
17130 rc= mysql_change_user(mysql, buff, buff, buff);17158 mysql_close(conn);
17159 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
17160
17161 rc= mysql_change_user(conn, buff, buff, buff);
17131 DIE_UNLESS(rc);17162 DIE_UNLESS(rc);
1713217163
17133 rc = mysql_change_user(mysql, opt_user, opt_password, current_db);17164 rc = mysql_change_user(conn, opt_user, opt_password, current_db);
17134 DIE_UNLESS(!rc);17165 DIE_UNLESS(!rc);
1713517166
17136#ifndef EMBEDDED_LIBRARY17167#ifndef EMBEDDED_LIBRARY
17137 memset(db, 'a', sizeof(db));17168 memset(db, 'a', sizeof(db));
17138 db[NAME_CHAR_LEN]= 0;17169 db[NAME_CHAR_LEN]= 0;
17139 strxmov(query, "CREATE DATABASE IF NOT EXISTS ", db, NullS);17170 strxmov(query, "CREATE DATABASE IF NOT EXISTS ", db, NullS);
17140 rc= mysql_query(mysql, query);17171 rc= mysql_query(conn, query);
17141 myquery(rc);17172 myquery(rc);
1714217173
17143 memset(user, 'b', sizeof(user));17174 memset(user, 'b', sizeof(user));
@@ -17146,54 +17177,59 @@
17146 buff[LARGE_BUFFER_SIZE]= 0;17177 buff[LARGE_BUFFER_SIZE]= 0;
17147 strxmov(query, "GRANT ALL PRIVILEGES ON *.* TO '", user, "'@'%' IDENTIFIED BY "17178 strxmov(query, "GRANT ALL PRIVILEGES ON *.* TO '", user, "'@'%' IDENTIFIED BY "
17148 "'", buff, "' WITH GRANT OPTION", NullS);17179 "'", buff, "' WITH GRANT OPTION", NullS);
17149 rc= mysql_query(mysql, query);17180 rc= mysql_query(conn, query);
17150 myquery(rc);17181 myquery(rc);
1715117182
17152 strxmov(query, "GRANT ALL PRIVILEGES ON *.* TO '", user, "'@'localhost' IDENTIFIED BY "17183 strxmov(query, "GRANT ALL PRIVILEGES ON *.* TO '", user, "'@'localhost' IDENTIFIED BY "
17153 "'", buff, "' WITH GRANT OPTION", NullS);17184 "'", buff, "' WITH GRANT OPTION", NullS);
17154 rc= mysql_query(mysql, query);17185 rc= mysql_query(conn, query);
17155 myquery(rc);17186 myquery(rc);
1715617187
17157 rc= mysql_query(mysql, "FLUSH PRIVILEGES");17188 rc= mysql_query(conn, "FLUSH PRIVILEGES");
17158 myquery(rc);17189 myquery(rc);
1715917190
17160 rc= mysql_change_user(mysql, user, buff, db);17191 rc= mysql_change_user(conn, user, buff, db);
17161 DIE_UNLESS(!rc);17192 DIE_UNLESS(!rc);
1716217193
17163 user[USERNAME_CHAR_LENGTH-1]= 'a';17194 user[USERNAME_CHAR_LENGTH-1]= 'a';
17164 rc= mysql_change_user(mysql, user, buff, db);17195 rc= mysql_change_user(conn, user, buff, db);
17165 DIE_UNLESS(rc);17196 DIE_UNLESS(rc);
1716617197
17167 user[USERNAME_CHAR_LENGTH-1]= 'b';17198 user[USERNAME_CHAR_LENGTH-1]= 'b';
17168 buff[LARGE_BUFFER_SIZE-1]= 'd';17199 buff[LARGE_BUFFER_SIZE-1]= 'd';
17169 rc= mysql_change_user(mysql, user, buff, db);17200 rc= mysql_change_user(conn, user, buff, db);
17170 DIE_UNLESS(rc);17201 DIE_UNLESS(rc);
1717117202
17172 buff[LARGE_BUFFER_SIZE-1]= 'c';17203 buff[LARGE_BUFFER_SIZE-1]= 'c';
17173 db[NAME_CHAR_LEN-1]= 'e';17204 db[NAME_CHAR_LEN-1]= 'e';
17174 rc= mysql_change_user(mysql, user, buff, db);17205 rc= mysql_change_user(conn, user, buff, db);
17175 DIE_UNLESS(rc);17206 DIE_UNLESS(rc);
1717617207
17208 mysql_close(conn);
17209 conn= client_connect(0, MYSQL_PROTOCOL_TCP, 0);
17210
17177 db[NAME_CHAR_LEN-1]= 'a';17211 db[NAME_CHAR_LEN-1]= 'a';
17178 rc= mysql_change_user(mysql, user, buff, db);17212 rc= mysql_change_user(conn, user, buff, db);
17179 DIE_UNLESS(!rc);17213 DIE_UNLESS(!rc);
1718017214
17181 rc= mysql_change_user(mysql, user + 1, buff + 1, db + 1);17215 rc= mysql_change_user(conn, user + 1, buff + 1, db + 1);
17182 DIE_UNLESS(rc);17216 DIE_UNLESS(rc);
1718317217
17184 rc = mysql_change_user(mysql, opt_user, opt_password, current_db);17218 rc = mysql_change_user(conn, opt_user, opt_password, current_db);
17185 DIE_UNLESS(!rc);17219 DIE_UNLESS(!rc);
1718617220
17187 strxmov(query, "DROP DATABASE ", db, NullS);17221 strxmov(query, "DROP DATABASE ", db, NullS);
17188 rc= mysql_query(mysql, query);17222 rc= mysql_query(conn, query);
17189 myquery(rc);17223 myquery(rc);
1719017224
17191 strxmov(query, "DELETE FROM mysql.user WHERE User='", user, "'", NullS);17225 strxmov(query, "DELETE FROM mysql.user WHERE User='", user, "'", NullS);
17192 rc= mysql_query(mysql, query);17226 rc= mysql_query(conn, query);
17193 myquery(rc);17227 myquery(rc);
17194 DIE_UNLESS(mysql_affected_rows(mysql) == 2);17228 DIE_UNLESS(mysql_affected_rows(conn) == 2);
17195#endif17229#endif
1719617230
17231 mysql_close(conn);
17232
17197 DBUG_VOID_RETURN;17233 DBUG_VOID_RETURN;
17198}17234}
1719917235

Subscribers

People subscribed via source and target branches