Skip to content

Commit 606ef82

Browse files
Robert Golebiowskibjornmu
authored andcommitted
Bug #22520464 TDE: TEST CASES GET HANG ON FREEBSD
TDE test cases keep hanging on FreeBSD. (cherry picked from commit 090afde0c1b9356c116ccf07119da5b9d99b3511)
1 parent d46feff commit 606ef82

17 files changed

+79
-122
lines changed

plugin/keyring/CMakeLists.txt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,10 @@ MYSQL_ADD_PLUGIN(keyring_file
2020
keyring.cc
2121
keys_container.cc
2222
buffered_file_io.cc
23-
keyring_memory.cc
2423
keyring_impl.cc
2524
MODULE_ONLY
2625
MODULE_OUTPUT_NAME "keyring_file")
2726

28-
IF(NOT WIN32 AND NOT APPLE)
29-
GET_TARGET_PROPERTY(keyring_file_link_flags keyring_file LINK_FLAGS)
30-
SET_TARGET_PROPERTIES(keyring_file PROPERTIES LINK_FLAGS
31-
"-Wl,-Bsymbolic ${keyring_file_link_flags}")
32-
ENDIF()
33-
3427
IF(SSL_DEFINES)
3528
ADD_DEFINITIONS(${SSL_DEFINES})
3629
ENDIF()

plugin/keyring/buffer.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616
#ifndef MYSQL_BUFFER_H
1717
#define MYSQL_BUFFER_H
1818

19-
#include <boost/core/noncopyable.hpp>
2019
#include "keyring_memory.h"
2120

22-
struct Buffer : public boost::noncopyable
21+
struct Buffer
2322
{
2423
Buffer() : data(NULL)
2524
{
@@ -50,6 +49,9 @@ struct Buffer : public boost::noncopyable
5049
size_t size;
5150
size_t position;
5251
private:
52+
Buffer(const Buffer&);
53+
Buffer& operator=(const Buffer&);
54+
5355
inline void mark_as_empty()
5456
{
5557
size= position= 0;

plugin/keyring/buffered_file_io.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ my_bool Buffered_file_io::is_file_tag_correct(File file)
7676

7777
my_bool Buffered_file_io::is_file_version_correct(File file)
7878
{
79-
unique_ptr<uchar[]> version(new uchar[file_version.length()+1]);
79+
boost::movelib::unique_ptr<uchar[]> version(new uchar[file_version.length()+1]);
8080
version.get()[file_version.length()]= '\0';
8181
mysql_file_seek(file, 0, MY_SEEK_SET, MYF(0));
8282
if (unlikely(mysql_file_read(file, version.get(), file_version.length(), MYF(0)) !=

plugin/keyring/buffered_file_io.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
#include <my_global.h>
2020
#include <mysql/plugin.h>
21-
#include <boost/core/noncopyable.hpp>
2221
#include "i_keyring_io.h"
2322
#include "logger.h"
2423
#include "keyring_memory.h"

plugin/keyring/i_keyring_io.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
namespace keyring {
2323

24-
class IKeyring_io
24+
class IKeyring_io : public Keyring_alloc
2525
{
2626
public:
2727
virtual my_bool init(std::string *keyring_storage_url)= 0;

plugin/keyring/i_keyring_key.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,19 @@
1717
#define MYSQL_I_KEY_H
1818

1919
#include <string>
20+
#include "keyring_memory.h"
2021

2122
namespace keyring {
2223

23-
struct IKey
24+
struct IKey : public Keyring_alloc
2425
{
2526
//key_signature:= key_id || user_id
2627
virtual std::string* get_key_signature() const= 0;
2728
virtual std::string* get_key_type()= 0;
2829
virtual uchar* get_key_data() = 0;
2930
virtual size_t get_key_data_size()= 0;
3031
virtual size_t get_key_pod_size() const = 0;
31-
virtual void release_key_data()= 0;
32+
virtual uchar* release_key_data()= 0;
3233
virtual void xor_data()= 0;
3334
virtual void set_key_data(uchar *key_data, size_t key_data_size)= 0;
3435
virtual void set_key_type(const std::string *key_type)= 0;

plugin/keyring/i_keys_container.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
namespace keyring {
2323

24-
class IKeys_container
24+
class IKeys_container : public Keyring_alloc
2525
{
2626
public:
2727
virtual my_bool init(IKeyring_io* keyring_io, std::string keyring_storage_url)= 0;

plugin/keyring/keyring.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ static int check_keyring_file_data(MYSQL_THD thd __attribute__((unused)),
2828
void *save, st_mysql_value *value)
2929
{
3030
Buffered_file_io keyring_io(logger.get());
31-
unique_ptr<IKeys_container> new_keys(new Keys_container(logger.get()));
32-
return check_keyring_file_data(&keyring_io, move(new_keys), thd, var, save, value);
31+
32+
boost::movelib::unique_ptr<IKeys_container> new_keys(new Keys_container(logger.get()));
33+
return check_keyring_file_data(&keyring_io, ::boost::move(new_keys), thd, var, save, value);
3334
}
3435

3536
static char *keyring_file_data_value= NULL;

plugin/keyring/keyring.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ namespace keyring
3232
}
3333

3434
extern mysql_rwlock_t LOCK_keyring;
35-
extern unique_ptr<IKeys_container> keys;
35+
36+
extern boost::movelib::unique_ptr<IKeys_container> keys;
3637
extern my_bool is_keys_container_initialized;
37-
extern unique_ptr<ILogger> logger;
38-
extern unique_ptr<char[]> keyring_file_data;
38+
extern boost::movelib::unique_ptr<ILogger> logger;
39+
extern boost::movelib::unique_ptr<char[]> keyring_file_data;
3940

4041
#ifdef HAVE_PSI_INTERFACE
4142
void keyring_init_psi_keys(void);
@@ -45,7 +46,7 @@ my_bool init_keyring_locks();
4546

4647
my_bool create_keyring_dir_if_does_not_exist(const char *keyring_file_path);
4748

48-
int check_keyring_file_data(IKeyring_io* keyring_io, unique_ptr<IKeys_container> new_keys,
49+
int check_keyring_file_data(IKeyring_io* keyring_io, boost::movelib::unique_ptr<IKeys_container> new_keys,
4950
MYSQL_THD thd __attribute__((unused)),
5051
struct st_mysql_sys_var *var __attribute__((unused)),
5152
void *save, st_mysql_value *value);
@@ -64,7 +65,7 @@ my_bool mysql_key_remove(IKeyring_io *keyring_io, const char *key_id,
6465
const char *user_id);
6566

6667
my_bool mysql_key_fetch(const char *key_id, char **key_type, const char *user_id,
67-
void **key, size_t *key_len);
68+
void **key, size_t *key_len);
6869

6970
my_bool mysql_key_generate(IKeyring_io* keyring_io, const char *key_id,
7071
const char *key_type, const char *user_id,

plugin/keyring/keyring_impl.cc

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ namespace keyring
2424
}
2525

2626
mysql_rwlock_t LOCK_keyring;
27-
unique_ptr<IKeys_container> keys;
27+
28+
29+
boost::movelib::unique_ptr<IKeys_container> keys(NULL);
2830
my_bool is_keys_container_initialized= FALSE;
29-
unique_ptr<ILogger> logger;
30-
unique_ptr<char[]> keyring_file_data;
31+
boost::movelib::unique_ptr<ILogger> logger(NULL);
32+
boost::movelib::unique_ptr<char[]> keyring_file_data(NULL);
3133

3234
#ifdef HAVE_PSI_INTERFACE
3335
static PSI_rwlock_info all_keyring_rwlocks[]=
@@ -86,7 +88,7 @@ my_bool create_keyring_dir_if_does_not_exist(const char *keyring_file_path)
8688
return FALSE;
8789
}
8890

89-
int check_keyring_file_data(IKeyring_io* keyring_io, unique_ptr<IKeys_container> new_keys,
91+
int check_keyring_file_data(IKeyring_io* keyring_io, boost::movelib::unique_ptr<IKeys_container> new_keys,
9092
MYSQL_THD thd __attribute__((unused)),
9193
struct st_mysql_sys_var *var __attribute__((unused)),
9294
void *save, st_mysql_value *value)
@@ -146,7 +148,8 @@ my_bool mysql_key_store(IKeyring_io *keyring_io, const char *key_id,
146148
{
147149
if (is_keys_container_initialized == FALSE)
148150
return TRUE;
149-
unique_ptr<Key> key_to_store(new Key(key_id, key_type, user_id, key, key_len));
151+
152+
boost::movelib::unique_ptr<Key> key_to_store(new Key(key_id, key_type, user_id, key, key_len));
150153
if (key_to_store->is_key_type_valid() == FALSE)
151154
{
152155
logger->log(MY_ERROR_LEVEL, "Error while storing key: invalid key_type");
@@ -211,8 +214,7 @@ my_bool mysql_key_fetch(const char *key_id, char **key_type, const char *user_id
211214
{
212215
*key_len = fetched_key->get_key_data_size();
213216
fetched_key->xor_data();
214-
*reinterpret_cast<uchar **>(key)= fetched_key->get_key_data();
215-
fetched_key->release_key_data();
217+
*reinterpret_cast<uchar **>(key)=fetched_key->release_key_data();
216218
*key_type = my_strdup(key_memory_KEYRING,
217219
fetched_key->get_key_type()->c_str(),
218220
MYF(MY_WME));
@@ -241,7 +243,8 @@ my_bool mysql_key_generate(IKeyring_io* keyring_io, const char *key_id,
241243
"Error while generating key: invalid key_type");
242244
return TRUE;
243245
}
244-
unique_ptr<uchar[]> key(new uchar[key_len]);
246+
247+
boost::movelib::unique_ptr<uchar[]> key(new uchar[key_len]);
245248
if (my_rand_buffer(key.get(), key_len) == TRUE ||
246249
mysql_key_store(keyring_io, key_id, key_type, user_id, key.get(), key_len) == TRUE)
247250
return TRUE;

plugin/keyring/keyring_key.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ my_bool Key::is_key_valid()
189189
return is_key_id_valid() || is_key_type_valid();
190190
}
191191

192-
void Key::release_key_data()
192+
uchar* Key::release_key_data()
193193
{
194-
key.release();
194+
return key.release();
195195
}
196196

197197
uchar* Key::get_key_data()

plugin/keyring/keyring_key.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <my_global.h>
2020
#include "i_keyring_key.h"
2121
#include "keyring_memory.h"
22+
#include <boost/move/unique_ptr.hpp>
2223

2324
namespace keyring {
2425

@@ -38,7 +39,7 @@ struct Key : IKey
3839
uchar* get_key_data();
3940
size_t get_key_data_size();
4041
size_t get_key_pod_size() const;
41-
void release_key_data();
42+
uchar* release_key_data();
4243
void xor_data();
4344
void set_key_data(uchar *key_data, size_t key_data_size);
4445
void set_key_type(const std::string *key_type);
@@ -63,7 +64,7 @@ struct Key : IKey
6364
std::string key_id;
6465
std::string key_type;
6566
std::string user_id;
66-
unique_ptr<uchar[]> key;
67+
boost::movelib::unique_ptr<uchar[]> key;
6768
size_t key_len;
6869
mutable std::string key_signature;
6970
};

plugin/keyring/keyring_memory.cc

Lines changed: 0 additions & 57 deletions
This file was deleted.

plugin/keyring/keyring_memory.h

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@
2020
#include <mysql/plugin_keyring.h>
2121
#include <limits>
2222
#include <memory>
23-
#include <boost/move/utility_core.hpp>
24-
#include <boost/move/unique_ptr.hpp>
2523

26-
using boost::movelib::unique_ptr;
27-
using ::boost::move;
2824
namespace keyring {
2925

3026
extern PSI_memory_key key_memory_KEYRING;
@@ -35,18 +31,27 @@ namespace keyring {
3531
void *allocated_memory= my_malloc(key_memory_KEYRING, size, MYF(MY_WME));
3632
return allocated_memory ? reinterpret_cast<T>(allocated_memory) : NULL;
3733
}
38-
} //namespace keyring
3934

40-
#ifdef _WIN32
41-
void* operator new(size_t size);
42-
void operator delete(void* ptr);
43-
void* operator new[] (size_t size);
44-
void operator delete[] (void* ptr);
45-
#else
46-
void* operator new(size_t size) throw(std::bad_alloc);
47-
void operator delete(void* ptr) throw();
48-
void* operator new[] (size_t size) throw(std::bad_alloc);
49-
void operator delete[] (void* ptr) throw();
50-
#endif
35+
class Keyring_alloc
36+
{
37+
public:
38+
static void *operator new(size_t size) throw ()
39+
{
40+
return keyring_malloc<void*>(size);
41+
}
42+
static void *operator new[](size_t size) throw ()
43+
{
44+
return keyring_malloc<void*>(size);
45+
}
46+
static void operator delete(void* ptr, std::size_t sz)
47+
{
48+
my_free(ptr);
49+
}
50+
static void operator delete[](void* ptr, std::size_t sz)
51+
{
52+
my_free(ptr);
53+
}
54+
};
55+
} //namespace keyring
5156

5257
#endif //MYSQL_KEYRING_MEMORY_H

unittest/gunit/keyring/CMakeLists.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ IF (MERGE_UNITTESTS)
5151
LIST(APPEND SRC_FILES
5252
${CMAKE_SOURCE_DIR}/plugin/keyring/keyring_key.cc
5353
${CMAKE_SOURCE_DIR}/plugin/keyring/buffered_file_io.cc
54-
${CMAKE_SOURCE_DIR}/plugin/keyring/keys_container.cc
55-
${CMAKE_SOURCE_DIR}/plugin/keyring/keyring_memory.cc)
54+
${CMAKE_SOURCE_DIR}/plugin/keyring/keys_container.cc)
5655

5756
IF(WIN32)
5857
LIST(APPEND SRC_FILES ../../../sql/nt_servc.cc)
@@ -78,7 +77,6 @@ ELSE()
7877
${CMAKE_SOURCE_DIR}/plugin/keyring/keyring_key.cc
7978
${CMAKE_SOURCE_DIR}/plugin/keyring/buffered_file_io.cc
8079
${CMAKE_SOURCE_DIR}/plugin/keyring/keys_container.cc
81-
${CMAKE_SOURCE_DIR}/plugin/keyring/keyring_memory.cc
8280
)
8381
IF(WIN32)
8482
LIST(APPEND SRC_FILES ../../../sql/nt_servc.cc)

unittest/gunit/keyring/keyring-api-t.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ namespace keyring__api_unittest
116116

117117
Key key_id("Robert_key", NULL, "Robert",NULL,0);
118118
IKey* fetched_key= keys->fetch_key(&key_id);
119-
120119
ASSERT_TRUE(fetched_key != NULL);
121120
std::string expected_key_signature= "Robert_keyRobert";
122121
EXPECT_STREQ(fetched_key->get_key_signature()->c_str(), expected_key_signature.c_str());
@@ -134,6 +133,7 @@ namespace keyring__api_unittest
134133
fetched_key->xor_data();
135134
EXPECT_STREQ(sample_key_data.c_str(), reinterpret_cast<const char*>(key_data_fetched));
136135
ASSERT_TRUE(sample_key_data.length()+1 == key_data_fetched_size);
136+
my_free(fetched_key->release_key_data());
137137
}
138138

139139
TEST_F(Keyring_api_test, FetchNotExisting)

0 commit comments

Comments
 (0)