Skip to content

Commit 9901e6d

Browse files
committed
Bug #21034322: RENAME LOCKING UDFS IN THE VERSION_TOKEN PLUGIN
Renamed the locking UDFs as follows: vtoken_get_read_locks -> version_tokens_lock_shared vtoken_get_write_locks -> version_tokens_lock_exclusive vtoken_release_locks -> version_tokens_unlock Fixed a conversion warning and added range checks for the timeout argument to version_tokens_lock_*. Tests added to cover the range check. Bumped plugin version to 1.01.
1 parent 099caf8 commit 9901e6d

File tree

3 files changed

+98
-58
lines changed

3 files changed

+98
-58
lines changed

mysql-test/r/version_token.result

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ create function version_tokens_set returns string soname 'version_token.so';
33
create function version_tokens_show returns string soname 'version_token.so';
44
create function version_tokens_edit returns string soname 'version_token.so';
55
create function version_tokens_delete returns string soname 'version_token.so';
6-
create function vtoken_get_read_locks returns int soname 'version_token.so';
7-
create function vtoken_get_write_locks returns int soname 'version_token.so';
8-
create function vtoken_release_locks returns int soname 'version_token.so';
6+
create function version_tokens_lock_shared returns int soname 'version_token.so';
7+
create function version_tokens_lock_exclusive returns int soname 'version_token.so';
8+
create function version_tokens_unlock returns int soname 'version_token.so';
99

1010
# Error checks for UDFs
1111
select version_tokens_set("token1 = abc;token2= def",123);
@@ -22,16 +22,26 @@ select version_tokens_edit(123);
2222
ERROR HY000: Can't initialize function 'version_tokens_edit'; Wrong arguments provided for the function.
2323
select version_tokens_delete(123);
2424
ERROR HY000: Can't initialize function 'version_tokens_delete'; Wrong arguments provided for the function.
25-
select vtoken_get_read_locks("Less arguments");
26-
ERROR HY000: Can't initialize function 'vtoken_get_read_locks'; Requires at least two arguments: (lock(...),timeout).
27-
select vtoken_get_read_locks(1,"Wrong argument type");
28-
ERROR HY000: Can't initialize function 'vtoken_get_read_locks'; Wrong argument type - expected integer.
29-
select vtoken_get_write_locks("Less arguments");
30-
ERROR HY000: Can't initialize function 'vtoken_get_write_locks'; Requires at least two arguments: (lock(...),timeout).
31-
select vtoken_get_write_locks(1,"Wrong argument type");
32-
ERROR HY000: Can't initialize function 'vtoken_get_write_locks'; Wrong argument type - expected integer.
33-
select vtoken_release_locks("Takes no arguments");
34-
ERROR HY000: Can't initialize function 'vtoken_release_locks'; Requires no arguments.
25+
select version_tokens_lock_shared("Less arguments");
26+
ERROR HY000: Can't initialize function 'version_tokens_lock_shared'; Requires at least two arguments: (lock(...),timeout).
27+
select version_tokens_lock_shared(1,"Wrong argument type");
28+
ERROR HY000: Can't initialize function 'version_tokens_lock_shared'; Wrong argument type - expected integer.
29+
select version_tokens_lock_exclusive("Less arguments");
30+
ERROR HY000: Can't initialize function 'version_tokens_lock_exclusive'; Requires at least two arguments: (lock(...),timeout).
31+
select version_tokens_lock_exclusive(1,"Wrong argument type");
32+
ERROR HY000: Can't initialize function 'version_tokens_lock_exclusive'; Wrong argument type - expected integer.
33+
select version_tokens_unlock("Takes no arguments");
34+
ERROR HY000: Can't initialize function 'version_tokens_unlock'; Requires no arguments.
35+
select version_tokens_lock_shared("gizmo", -1);
36+
ERROR 22003: timeout value is out of range in 'version_tokens_lock_shared'
37+
# 0xffffffff = 4294967295 = ULONG_MAX
38+
select version_tokens_lock_shared("gizmo", 4294967295 + 1);
39+
ERROR 22003: timeout value is out of range in 'version_tokens_lock_shared'
40+
select version_tokens_lock_exclusive("gizmo", -1);
41+
ERROR 22003: timeout value is out of range in 'version_tokens_lock_exclusive'
42+
# 0xffffffff = 4294967295 = ULONG_MAX
43+
select version_tokens_lock_exclusive("gizmo", 4294967295 + 1);
44+
ERROR 22003: timeout value is out of range in 'version_tokens_lock_exclusive'
3545

3646
CREATE USER vbhagi@localhost;
3747

@@ -211,7 +221,7 @@ drop function version_tokens_set;
211221
drop function version_tokens_show;
212222
drop function version_tokens_edit;
213223
drop function version_tokens_delete;
214-
drop function vtoken_get_read_locks;
215-
drop function vtoken_get_write_locks;
216-
drop function vtoken_release_locks;
224+
drop function version_tokens_lock_shared;
225+
drop function version_tokens_lock_exclusive;
226+
drop function version_tokens_unlock;
217227
drop user vbhagi@localhost;

mysql-test/t/version_token.test

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ eval create function version_tokens_edit returns string soname '$VERSION_TOKEN';
1818
--replace_regex /\.dll/.so/
1919
eval create function version_tokens_delete returns string soname '$VERSION_TOKEN';
2020
--replace_regex /\.dll/.so/
21-
eval create function vtoken_get_read_locks returns int soname '$VERSION_TOKEN';
21+
eval create function version_tokens_lock_shared returns int soname '$VERSION_TOKEN';
2222
--replace_regex /\.dll/.so/
23-
eval create function vtoken_get_write_locks returns int soname '$VERSION_TOKEN';
23+
eval create function version_tokens_lock_exclusive returns int soname '$VERSION_TOKEN';
2424
--replace_regex /\.dll/.so/
25-
eval create function vtoken_release_locks returns int soname '$VERSION_TOKEN';
25+
eval create function version_tokens_unlock returns int soname '$VERSION_TOKEN';
2626

2727

2828
-- echo
@@ -42,15 +42,27 @@ select version_tokens_edit(123);
4242
--error ER_CANT_INITIALIZE_UDF
4343
select version_tokens_delete(123);
4444
--error ER_CANT_INITIALIZE_UDF
45-
select vtoken_get_read_locks("Less arguments");
45+
select version_tokens_lock_shared("Less arguments");
4646
--error ER_CANT_INITIALIZE_UDF
47-
select vtoken_get_read_locks(1,"Wrong argument type");
47+
select version_tokens_lock_shared(1,"Wrong argument type");
4848
--error ER_CANT_INITIALIZE_UDF
49-
select vtoken_get_write_locks("Less arguments");
49+
select version_tokens_lock_exclusive("Less arguments");
5050
--error ER_CANT_INITIALIZE_UDF
51-
select vtoken_get_write_locks(1,"Wrong argument type");
51+
select version_tokens_lock_exclusive(1,"Wrong argument type");
5252
--error ER_CANT_INITIALIZE_UDF
53-
select vtoken_release_locks("Takes no arguments");
53+
select version_tokens_unlock("Takes no arguments");
54+
55+
--error ER_DATA_OUT_OF_RANGE
56+
select version_tokens_lock_shared("gizmo", -1);
57+
--echo # 0xffffffff = 4294967295 = ULONG_MAX
58+
--error ER_DATA_OUT_OF_RANGE
59+
select version_tokens_lock_shared("gizmo", 4294967295 + 1);
60+
61+
--error ER_DATA_OUT_OF_RANGE
62+
select version_tokens_lock_exclusive("gizmo", -1);
63+
--echo # 0xffffffff = 4294967295 = ULONG_MAX
64+
--error ER_DATA_OUT_OF_RANGE
65+
select version_tokens_lock_exclusive("gizmo", 4294967295 + 1);
5466

5567
-- echo
5668
CREATE USER vbhagi@localhost;
@@ -228,7 +240,7 @@ drop function version_tokens_set;
228240
drop function version_tokens_show;
229241
drop function version_tokens_edit;
230242
drop function version_tokens_delete;
231-
drop function vtoken_get_read_locks;
232-
drop function vtoken_get_write_locks;
233-
drop function vtoken_release_locks;
243+
drop function version_tokens_lock_shared;
244+
drop function version_tokens_lock_exclusive;
245+
drop function version_tokens_unlock;
234246
drop user vbhagi@localhost;

plugin/version_token/version_token.cc

Lines changed: 49 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ struct version_token_st {
4444
};
4545

4646

47+
#define VTOKEN_LOCKS_NAMESPACE "version_token_locks"
48+
4749
static HASH version_tokens_hash;
4850

4951
static MYSQL_THDVAR_ULONG(session_number,
@@ -169,18 +171,18 @@ PLUGIN_EXPORT my_bool version_tokens_delete_init(UDF_INIT *initid,
169171
PLUGIN_EXPORT char *version_tokens_delete(UDF_INIT *initid, UDF_ARGS *args,
170172
char *result, unsigned long *length,
171173
char *null_value, char *error);
172-
PLUGIN_EXPORT my_bool vtoken_get_read_locks_init(UDF_INIT *initid, UDF_ARGS *args,
173-
char *message);
174-
PLUGIN_EXPORT long long vtoken_get_read_locks(UDF_INIT *initid, UDF_ARGS *args,
175-
char *is_null, char *error);
176-
PLUGIN_EXPORT my_bool vtoken_get_write_locks_init(UDF_INIT *initid, UDF_ARGS *args,
177-
char *message);
178-
PLUGIN_EXPORT long long vtoken_get_write_locks(UDF_INIT *initid, UDF_ARGS *args,
179-
char *is_null, char *error);
180-
PLUGIN_EXPORT my_bool vtoken_release_locks_init(UDF_INIT *initid, UDF_ARGS *args,
181-
char *message);
182-
PLUGIN_EXPORT long long vtoken_release_locks(UDF_INIT *initid, UDF_ARGS *args,
183-
char *is_null, char *error);
174+
PLUGIN_EXPORT my_bool version_tokens_lock_shared_init(
175+
UDF_INIT *initid, UDF_ARGS *args, char *message);
176+
PLUGIN_EXPORT long long version_tokens_lock_shared(
177+
UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
178+
PLUGIN_EXPORT my_bool version_tokens_lock_exclusive_init(
179+
UDF_INIT *initid, UDF_ARGS *args, char *message);
180+
PLUGIN_EXPORT long long version_tokens_lock_exclusive(
181+
UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
182+
PLUGIN_EXPORT my_bool version_tokens_unlock_init(
183+
UDF_INIT *initid, UDF_ARGS *args, char *message);
184+
PLUGIN_EXPORT long long version_tokens_unlock(
185+
UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
184186

185187
enum command {
186188
SET_VTOKEN= 0,
@@ -335,7 +337,7 @@ static int parse_vtokens(char *input, enum command type)
335337
{
336338
version_token_st *token_obj;
337339
char error_str[MYSQL_ERRMSG_SIZE];
338-
if (!mysql_acquire_locking_service_locks(NULL, "version_token_locks",
340+
if (!mysql_acquire_locking_service_locks(NULL, VTOKEN_LOCKS_NAMESPACE,
339341
(const char **) &(token_name.str), 1,
340342
LOCKING_SERVICE_READ, 1) && !vtokens_unchanged)
341343
{
@@ -443,7 +445,7 @@ static void version_token_check(MYSQL_THD thd,
443445
}
444446
case MYSQL_AUDIT_GENERAL_STATUS:
445447
{
446-
mysql_release_locking_service_locks(NULL, "version_token_locks");
448+
mysql_release_locking_service_locks(NULL, VTOKEN_LOCKS_NAMESPACE);
447449
break;
448450
}
449451
default:
@@ -517,7 +519,7 @@ mysql_declare_plugin(version_tokens)
517519
PLUGIN_LICENSE_GPL,
518520
version_tokens_init, /* init function (when loaded) */
519521
version_tokens_deinit, /* deinit function (when unloaded) */
520-
0x0100, /* version */
522+
0x0101, /* version */
521523
NULL, /* status variables */
522524
system_variables, /* system variables */
523525
NULL,
@@ -943,45 +945,61 @@ static inline my_bool init_acquire(UDF_INIT *initid, UDF_ARGS *args, char *messa
943945
return FALSE;
944946
}
945947

946-
PLUGIN_EXPORT my_bool vtoken_get_read_locks_init(UDF_INIT *initid, UDF_ARGS *args,
947-
char *message)
948+
PLUGIN_EXPORT my_bool version_tokens_lock_shared_init(
949+
UDF_INIT *initid, UDF_ARGS *args, char *message)
948950
{
949951
return init_acquire(initid, args, message);
950952
}
951953

952954

953-
PLUGIN_EXPORT long long vtoken_get_read_locks(UDF_INIT *initid, UDF_ARGS *args,
954-
char *is_null, char *error)
955+
PLUGIN_EXPORT long long version_tokens_lock_shared(
956+
UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
955957
{
956958
long long timeout= *((long long*)args->args[args->arg_count - 1]);
959+
960+
if (timeout < 0 || timeout > ULONG_MAX)
961+
{
962+
my_error(ER_DATA_OUT_OF_RANGE, MYF(0), "timeout",
963+
"version_tokens_lock_shared");
964+
*error= 1;
965+
}
966+
957967
// For the UDF 1 == success, 0 == failure.
958-
return !acquire_locking_service_locks(NULL, "version_token_locks",
968+
return !acquire_locking_service_locks(NULL, VTOKEN_LOCKS_NAMESPACE,
959969
const_cast<const char**>(&args->args[0]),
960970
args->arg_count - 1,
961-
LOCKING_SERVICE_READ, timeout);
971+
LOCKING_SERVICE_READ, (unsigned long) timeout);
962972
}
963973

964974

965-
PLUGIN_EXPORT my_bool vtoken_get_write_locks_init(UDF_INIT *initid, UDF_ARGS *args,
966-
char *message)
975+
PLUGIN_EXPORT my_bool version_tokens_lock_exclusive_init(
976+
UDF_INIT *initid, UDF_ARGS *args, char *message)
967977
{
968978
return init_acquire(initid, args, message);
969979
}
970980

971981

972-
PLUGIN_EXPORT long long vtoken_get_write_locks(UDF_INIT *initid, UDF_ARGS *args,
973-
char *is_null, char *error)
982+
PLUGIN_EXPORT long long version_tokens_lock_exclusive(
983+
UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
974984
{
975985
long long timeout= *((long long*)args->args[args->arg_count - 1]);
986+
987+
if (timeout < 0 || timeout > ULONG_MAX)
988+
{
989+
my_error(ER_DATA_OUT_OF_RANGE, MYF(0), "timeout",
990+
"version_tokens_lock_exclusive");
991+
*error= 1;
992+
}
993+
976994
// For the UDF 1 == success, 0 == failure.
977-
return !acquire_locking_service_locks(NULL, "version_token_locks",
995+
return !acquire_locking_service_locks(NULL, VTOKEN_LOCKS_NAMESPACE,
978996
const_cast<const char**>(&args->args[0]),
979997
args->arg_count - 1,
980-
LOCKING_SERVICE_WRITE, timeout);
998+
LOCKING_SERVICE_WRITE, (unsigned long) timeout);
981999
}
9821000

983-
PLUGIN_EXPORT my_bool vtoken_release_locks_init(UDF_INIT *initid, UDF_ARGS *args,
984-
char *message)
1001+
PLUGIN_EXPORT my_bool version_tokens_unlock_init(
1002+
UDF_INIT *initid, UDF_ARGS *args, char *message)
9851003
{
9861004
THD *thd= current_thd;
9871005

@@ -1001,11 +1019,11 @@ PLUGIN_EXPORT my_bool vtoken_release_locks_init(UDF_INIT *initid, UDF_ARGS *args
10011019
}
10021020

10031021

1004-
long long vtoken_release_locks(UDF_INIT *initid, UDF_ARGS *args,
1022+
long long version_tokens_unlock(UDF_INIT *initid, UDF_ARGS *args,
10051023
char *is_null, char *error)
10061024
{
10071025
// For the UDF 1 == success, 0 == failure.
1008-
return !release_locking_service_locks(NULL, "version_token_locks");
1026+
return !release_locking_service_locks(NULL, VTOKEN_LOCKS_NAMESPACE);
10091027
}
10101028

10111029

0 commit comments

Comments
 (0)