diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-02-18 21:42:58 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-02-18 21:42:58 +0200 |
commit | 98e185ee373310291825fe6ac87f45afe6a3ccf7 (patch) | |
tree | 8147b94ba3093e5e404978025bd3c371cd88b54c /storage/xtradb/dict | |
parent | 5b827511116feb2e3f594cb4e7df816e8704b153 (diff) | |
download | mariadb-git-98e185ee373310291825fe6ac87f45afe6a3ccf7.tar.gz |
MDEV-18630 Uninitialised value in FOREIGN KEY error message
dict_create_foreign_constraints_low(): Clean up the way in
which the error messages are initialized, and ensure that
the table name is always initialized.
Diffstat (limited to 'storage/xtradb/dict')
-rw-r--r-- | storage/xtradb/dict/dict0dict.cc | 49 |
1 files changed, 17 insertions, 32 deletions
diff --git a/storage/xtradb/dict/dict0dict.cc b/storage/xtradb/dict/dict0dict.cc index 1eb0a53e0b0..1c489d13f1a 100644 --- a/storage/xtradb/dict/dict0dict.cc +++ b/storage/xtradb/dict/dict0dict.cc @@ -4405,7 +4405,6 @@ dict_create_foreign_constraints_low( const char* create_table_name; const char* orig; char create_name[MAX_TABLE_NAME_LEN + 1]; - char operation[8]; ut_ad(!srv_read_only_mode); ut_ad(mutex_own(&(dict_sys->mutex))); @@ -4416,41 +4415,33 @@ dict_create_foreign_constraints_low( orig = ptr; ptr = dict_accept(cs, ptr, "ALTER", &success); - strcpy((char *)operation, success ? "Alter " : "Create "); + const char* const operation = success ? "Alter " : "Create "; if (!success) { orig = ptr; ptr = dict_scan_to(ptr, "CREATE"); ptr = dict_scan_to(ptr, "TABLE"); ptr = dict_accept(cs, ptr, "TABLE", &success); + create_table_name = NULL; if (success) { ptr = dict_scan_table_name(cs, ptr, &table_to_create, name, - &success, heap, &create_table_name); + &success, heap, &create_table_name); } - if (success) { - char *bufend; - bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, - create_table_name, strlen(create_table_name), - trx->mysql_thd, TRUE); - create_name[bufend-create_name]='\0'; - ptr = orig; - } else { - char *bufend; - ptr = orig; - bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, - name, strlen(name), trx->mysql_thd, TRUE); - create_name[bufend-create_name]='\0'; - } - - goto loop; + ptr = orig; + const char* n = create_table_name ? create_table_name : name; + char *bufend = innobase_convert_name(create_name, MAX_TABLE_NAME_LEN, + n, strlen(n), trx->mysql_thd, TRUE); + create_name[bufend-create_name] = '\0'; + } else { + strncpy(create_name, name, sizeof create_name); + create_name[(sizeof create_name) - 1] = '\0'; } if (table == NULL) { mutex_enter(&dict_foreign_err_mutex); dict_foreign_error_report_low(ef, create_name); - dict_foreign_error_report_low(ef, create_name); fprintf(ef, "%s table %s with foreign key constraint" " failed. Table %s not found from data dictionary." " Error close to %s.\n", @@ -4485,19 +4476,13 @@ dict_create_foreign_constraints_low( ptr = dict_scan_table_name(cs, ptr, &table_to_alter, name, &success, heap, &referenced_table_name); - if (table_to_alter) { - char *bufend; - bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, - table_to_alter->name, strlen(table_to_alter->name), - trx->mysql_thd, TRUE); - create_name[bufend-create_name]='\0'; - } else { - char *bufend; - bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, - referenced_table_name, strlen(referenced_table_name), - trx->mysql_thd, TRUE); + { + const char* n = table_to_alter + ? table_to_alter->name : referenced_table_name; + char* bufend = innobase_convert_name( + create_name, MAX_TABLE_NAME_LEN, n, strlen(n), + trx->mysql_thd, TRUE); create_name[bufend-create_name]='\0'; - } if (!success) { |