Skip to content

Commit de9909f

Browse files
author
jimw@mysql.com
committed
Fix crash caused by calling DES_ENCRYPT() without the --des-key-file
option having been passed to the server. (Bug #11643)
1 parent fe21793 commit de9909f

6 files changed

Lines changed: 37 additions & 7 deletions

File tree

BitKeeper/etc/config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ description: MySQL - fast and reliable SQL database
2424
# repository is commercial it can be an internal email address or "none"
2525
# to disable logging.
2626
#
27-
logging: logging@openlogging.org
27+
logging: none
2828
#
2929
# If this field is set, all checkins will appear to be made by this user,
3030
# in effect making this a single user package. Single user packages are
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
select des_encrypt('hello');
2+
des_encrypt('hello')
3+
��2nV��}

mysql-test/t/func_des_encrypt.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-- source include/have_openssl.inc
2+
3+
# This test can't be in func_encrypt.test, because it requires
4+
# --des-key-file to not be set.
5+
6+
#
7+
# Bug #11643: des_encrypt() causes server to die
8+
#
9+
select des_encrypt('hello');

sql/des_key_file.cc

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,17 @@
2222
struct st_des_keyschedule des_keyschedule[10];
2323
uint des_default_key;
2424
pthread_mutex_t LOCK_des_key_file;
25-
static int initialized;
25+
static int initialized= 0;
26+
27+
void
28+
init_des_key_file()
29+
{
30+
if (!initialized)
31+
{
32+
initialized=1;
33+
pthread_mutex_init(&LOCK_des_key_file,MY_MUTEX_INIT_FAST);
34+
}
35+
}
2636

2737
/*
2838
Function which loads DES keys from plaintext file into memory on MySQL
@@ -45,11 +55,7 @@ load_des_key_file(const char *file_name)
4555
DBUG_ENTER("load_des_key_file");
4656
DBUG_PRINT("enter",("name: %s",file_name));
4757

48-
if (!initialized)
49-
{
50-
initialized=1;
51-
pthread_mutex_init(&LOCK_des_key_file,MY_MUTEX_INIT_FAST);
52-
}
58+
init_des_key_file();
5359

5460
VOID(pthread_mutex_lock(&LOCK_des_key_file));
5561
if ((file=my_open(file_name,O_RDONLY | O_BINARY ,MYF(MY_WME))) < 0 ||

sql/item_strfunc.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,9 @@ String *Item_func_des_encrypt::val_str(String *str)
388388

389389
if (arg_count == 1)
390390
{
391+
/* Make sure LOCK_des_key_file was initialized. */
392+
init_des_key_file();
393+
391394
/* Protect against someone doing FLUSH DES_KEY_FILE */
392395
VOID(pthread_mutex_lock(&LOCK_des_key_file));
393396
keyschedule= des_keyschedule[key_number=des_default_key];
@@ -398,6 +401,10 @@ String *Item_func_des_encrypt::val_str(String *str)
398401
key_number= (uint) args[1]->val_int();
399402
if (key_number > 9)
400403
goto error;
404+
405+
/* Make sure LOCK_des_key_file was initialized. */
406+
init_des_key_file();
407+
401408
VOID(pthread_mutex_lock(&LOCK_des_key_file));
402409
keyschedule= des_keyschedule[key_number];
403410
VOID(pthread_mutex_unlock(&LOCK_des_key_file));
@@ -485,6 +492,10 @@ String *Item_func_des_decrypt::val_str(String *str)
485492
// Check if automatic key and that we have privilege to uncompress using it
486493
if (!(current_thd->master_access & SUPER_ACL) || key_number > 9)
487494
goto error;
495+
496+
/* Make sure LOCK_des_key_file was initialized. */
497+
init_des_key_file();
498+
488499
VOID(pthread_mutex_lock(&LOCK_des_key_file));
489500
keyschedule= des_keyschedule[key_number];
490501
VOID(pthread_mutex_unlock(&LOCK_des_key_file));

sql/mysql_priv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,7 @@ extern char *des_key_file;
624624
extern struct st_des_keyschedule des_keyschedule[10];
625625
extern uint des_default_key;
626626
extern pthread_mutex_t LOCK_des_key_file;
627+
void init_des_key_file();
627628
bool load_des_key_file(const char *file_name);
628629
void free_des_key_file();
629630
#endif /* HAVE_OPENSSL */

0 commit comments

Comments
 (0)