Skip to content

Commit 4877ce1

Browse files
Robert GolebiowskiHery Ramilison
authored andcommitted
Bug#23149683: ROTATE INNODB MASTER KEY WITH KEYRING_OKV_CONF_DIR MISSING: SIGSEGV; SIGNAL 11
--This is actual fix for Bug#23149683. The previous commit (dacd4edac18da1b7c114a3ce9ccfda8d49bed558 5.7 tree) which message indicates it is fix for Bug#23149683 is actually a fix for this bug: Bug#23227113: SERVER CRASH ON KEYRING_KEY_GENERATE (cherry picked from commit 608b265d4fc51adc5b8307df969841d48b2a2cc5)
1 parent 755ab64 commit 4877ce1

File tree

3 files changed

+23
-7
lines changed

3 files changed

+23
-7
lines changed

plugin/keyring/keys_container.cc

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ my_bool Keys_container::store_key_in_hash(IKey *key)
7777

7878
my_bool Keys_container::store_key(IKeyring_io* keyring_io, IKey* key)
7979
{
80-
keyring_io->open(&keyring_storage_url);
81-
if (flush_to_backup(keyring_io) || store_key_in_hash(key))
80+
if (keyring_io->open(&keyring_storage_url) || flush_to_backup(keyring_io) ||
81+
store_key_in_hash(key))
8282
return TRUE;//keyring_io destructor will take care of removing the backup(if exists)
8383
if (flush_to_keyring(keyring_io, key, STORE_KEY) || keyring_io->close())
8484
{
@@ -127,9 +127,8 @@ my_bool Keys_container::remove_key_from_hash(IKey *key)
127127

128128
my_bool Keys_container::remove_key(IKeyring_io *keyring_io, IKey *key)
129129
{
130-
keyring_io->open(&keyring_storage_url);
131130
IKey* fetched_key_to_delete= get_key_from_hash(key);
132-
if(fetched_key_to_delete == NULL)
131+
if(fetched_key_to_delete == NULL || keyring_io->open(&keyring_storage_url))
133132
return TRUE;
134133
if (flush_to_backup(keyring_io) || remove_key_from_hash(fetched_key_to_delete))
135134
return TRUE;//keyring_io destructor will take care of removing the backup(if exists)

storage/innobase/os/os0file.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8683,14 +8683,14 @@ Encryption::create_master_key(byte** master_key)
86838683
reinterpret_cast<void**>(master_key),
86848684
&key_len);
86858685

8686-
if (ret) {
8686+
if (ret || *master_key == NULL) {
86878687
ib::error() << "Encryption can't find master key, please check"
86888688
" the keyring plugin is loaded.";
86898689
*master_key = NULL;
8690+
} else {
8691+
master_key_id++;
86908692
}
86918693

8692-
master_key_id++;
8693-
86948694
if (key_type) {
86958695
my_free(key_type);
86968696
}

unittest/gunit/keyring/keys_container-t.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,23 @@ namespace keyring__keys_container_unittest
894894
delete sample_key;
895895
}
896896

897+
TEST_F(Keys_container_with_mocked_io_test, ErrorFromIOFlushWhileOpenningIOForKeyStore)
898+
{
899+
keyring_io= new Mock_keyring_io();
900+
ILogger *logger= new Mock_logger();
901+
keys_container= new Keys_container(logger);
902+
expect_calls_on_init();
903+
EXPECT_EQ(keys_container->init(keyring_io, file_name), 0);
904+
905+
EXPECT_CALL(*keyring_io, open(Pointee(StrEq(file_name)))).WillOnce(Return(1));
906+
907+
EXPECT_EQ(keys_container->store_key(keyring_io, sample_key), 1);
908+
ASSERT_TRUE(keys_container->get_number_of_keys() == 0);
909+
delete logger;
910+
delete keyring_io;
911+
delete sample_key;
912+
}
913+
897914
int main(int argc, char **argv) {
898915
if (mysql_rwlock_init(key_LOCK_keyring, &LOCK_keyring))
899916
return TRUE;

0 commit comments

Comments
 (0)