diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index 3b033655856278c2a2891b94070888c7b484f421..539e6aa8687ec88b6b11e6614429aa2a3abb3b90 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -2572,11 +2572,30 @@ fil_load_single_table_tablespace( fprintf(stderr, "InnoDB: Error: could not open single-table tablespace file\n" -"InnoDB: %s!\n", filepath); +"InnoDB: %s!\n" +"InnoDB: We do no continue crash recovery, because the table will become\n" +"InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.\n" +"InnoDB: To fix the problem and start mysqld:\n" +"InnoDB: 1) If there is a permission problem in the file and mysqld cannot\n" +"InnoDB: open the file, you should modify the permissions.\n" +"InnoDB: 2) If the table is not needed, or you can restore it from a backup,\n" +"InnoDB: then you can remove the .ibd file, and InnoDB will do a normal\n" +"InnoDB: crash recovery and ignore that table.\n" +"InnoDB: 3) If the file system or the disk is broken, and you cannot remove\n" +"InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf\n" +"InnoDB: and force InnoDB to continue crash recovery here.\n", filepath); ut_free(filepath); - return; + if (srv_force_recovery > 0) { + fprintf(stderr, +"InnoDB: innodb_force_recovery was set to %lu. Continuing crash recovery\n" +"InnoDB: even though we cannot access the .ibd file of this table.\n", + srv_force_recovery); + return; + } + + exit(1); } success = os_file_get_size(file, &size_low, &size_high); @@ -2587,14 +2606,36 @@ fil_load_single_table_tablespace( fprintf(stderr, "InnoDB: Error: could not measure the size of single-table tablespace file\n" -"InnoDB: %s!\n", filepath); +"InnoDB: %s!\n" +"InnoDB: We do no continue crash recovery, because the table will become\n" +"InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.\n" +"InnoDB: To fix the problem and start mysqld:\n" +"InnoDB: 1) If there is a permission problem in the file and mysqld cannot\n" +"InnoDB: access the file, you should modify the permissions.\n" +"InnoDB: 2) If the table is not needed, or you can restore it from a backup,\n" +"InnoDB: then you can remove the .ibd file, and InnoDB will do a normal\n" +"InnoDB: crash recovery and ignore that table.\n" +"InnoDB: 3) If the file system or the disk is broken, and you cannot remove\n" +"InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf\n" +"InnoDB: and force InnoDB to continue crash recovery here.\n", filepath); os_file_close(file); ut_free(filepath); - return; + if (srv_force_recovery > 0) { + fprintf(stderr, +"InnoDB: innodb_force_recovery was set to %lu. Continuing crash recovery\n" +"InnoDB: even though we cannot access the .ibd file of this table.\n", + srv_force_recovery); + return; + } + + exit(1); } + /* TODO: What to do in other cases where we cannot access an .ibd + file during a crash recovery? */ + /* Every .ibd file is created >= 4 pages in size. Smaller files cannot be ok. */ diff --git a/sql/password.c b/sql/password.c index 49f149969c99c4fcf982863116476bf1e529dc45..0ac91346a55dd12eba7dfe20b45e27aca8f46df3 100644 --- a/sql/password.c +++ b/sql/password.c @@ -218,6 +218,8 @@ check_scramble_323(const char *scrambled, const char *message, to=buff; for (pos=scrambled ; *pos ; pos++) *to++=(char) (floor(my_rnd(&rand_st)*31)+64); + if (pos-scrambled != SCRAMBLE_LENGTH_323) + return 1; extra=(char) (floor(my_rnd(&rand_st)*31)); to=buff; while (*scrambled) diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index d5becf81771a36adb991ef9fa124aed15e1b8b97..9d1eb7bc54d4e94a600d213a224116cd2489a915 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -629,10 +629,10 @@ int acl_getroot(THD *thd, USER_RESOURCES *mqh, if (passwd_len == acl_user_tmp->salt_len) { if (acl_user_tmp->salt_len == 0 || - acl_user_tmp->salt_len == SCRAMBLE_LENGTH && - check_scramble(passwd, thd->scramble, acl_user_tmp->salt) == 0 || + (acl_user_tmp->salt_len == SCRAMBLE_LENGTH ? + check_scramble(passwd, thd->scramble, acl_user_tmp->salt) : check_scramble_323(passwd, thd->scramble, - (ulong *) acl_user_tmp->salt) == 0) + (ulong *) acl_user_tmp->salt)) == 0) { acl_user= acl_user_tmp; res= 0;