summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2017-09-28 12:38:51 +0300
committerJan Lindström <jan.lindstrom@mariadb.com>2017-09-28 12:38:51 +0300
commit4d01dd79a102599d2e996e5acf77ea9c54f8c644 (patch)
tree0569d8e02c72f792bbad2e6b1ce1f5c39b8263c5 /storage
parent4aeec7275f8bb72d716a76ece5c5edbcf8c0966b (diff)
downloadmariadb-git-4d01dd79a102599d2e996e5acf77ea9c54f8c644.tar.gz
MDEV-12634: Uninitialised ROW_MERGE_RESERVE_SIZE bytes written to temporary file
After review cleanup.
Diffstat (limited to 'storage')
-rw-r--r--storage/innobase/log/log0crypt.cc2
-rw-r--r--storage/innobase/row/row0log.cc29
-rw-r--r--storage/innobase/row/row0merge.cc19
-rw-r--r--storage/xtradb/log/log0crypt.cc2
-rw-r--r--storage/xtradb/row/row0log.cc29
-rw-r--r--storage/xtradb/row/row0merge.cc19
6 files changed, 34 insertions, 66 deletions
diff --git a/storage/innobase/log/log0crypt.cc b/storage/innobase/log/log0crypt.cc
index fe1b41202ea..13d69118779 100644
--- a/storage/innobase/log/log0crypt.cc
+++ b/storage/innobase/log/log0crypt.cc
@@ -246,7 +246,7 @@ next:
ENCRYPTION_FLAG_DECRYPT
@param[in] offs offset to block
@param[in] space_id tablespace id
-@return true if successfull, false in case of failure
+@return true if successful, false in case of failure
*/
static
bool
diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc
index ec6b4a60680..9107ad6236c 100644
--- a/storage/innobase/row/row0log.cc
+++ b/storage/innobase/row/row0log.cc
@@ -182,7 +182,6 @@ struct row_log_t {
dict_table_t* table; /*!< table that is being rebuilt,
or NULL when this is a secondary
index that is being created online */
- dict_index_t* index; /*!< index to be build */
bool same_pk;/*!< whether the definition of the PRIMARY KEY
has remained the same */
const dtuple_t* add_cols;
@@ -385,7 +384,7 @@ row_log_online_op(
byte_offset,
index->table->space)) {
log->error = DB_DECRYPTION_FAILED;
- goto err_exit;
+ goto write_failed;
}
srv_stats.n_rowlog_blocks_encrypted.inc();
@@ -479,13 +478,15 @@ static MY_ATTRIBUTE((nonnull))
void
row_log_table_close_func(
/*=====================*/
- row_log_t* log, /*!< in/out: online rebuild log */
+ dict_index_t* index, /*!< in/out: online rebuilt index */
#ifdef UNIV_DEBUG
const byte* b, /*!< in: end of log record */
#endif /* UNIV_DEBUG */
ulint size, /*!< in: size of log record */
ulint avail) /*!< in: available size for log record */
{
+ row_log_t* log = index->online_log;
+
ut_ad(mutex_own(&log->mutex));
if (size >= avail) {
@@ -520,7 +521,7 @@ row_log_table_close_func(
srv_sort_buf_size,
log->crypt_tail,
byte_offset,
- log->index->table->space)) {
+ index->table->space)) {
log->error = DB_DECRYPTION_FAILED;
goto err_exit;
}
@@ -559,11 +560,11 @@ err_exit:
}
#ifdef UNIV_DEBUG
-# define row_log_table_close(log, b, size, avail) \
- row_log_table_close_func(log, b, size, avail)
+# define row_log_table_close(index, b, size, avail) \
+ row_log_table_close_func(index, b, size, avail)
#else /* UNIV_DEBUG */
# define row_log_table_close(log, b, size, avail) \
- row_log_table_close_func(log, size, avail)
+ row_log_table_close_func(index, size, avail)
#endif /* UNIV_DEBUG */
/******************************************************//**
@@ -735,8 +736,7 @@ row_log_table_delete(
b += ext_size;
}
- row_log_table_close(
- index->online_log, b, mrec_size, avail_size);
+ row_log_table_close(index, b, mrec_size, avail_size);
}
func_exit:
@@ -859,8 +859,7 @@ row_log_table_low_redundant(
b + extra_size, index, tuple->fields, tuple->n_fields);
b += size;
- row_log_table_close(
- index->online_log, b, mrec_size, avail_size);
+ row_log_table_close(index, b, mrec_size, avail_size);
}
mem_heap_free(heap);
@@ -969,8 +968,7 @@ row_log_table_low(
memcpy(b, rec, rec_offs_data_size(offsets));
b += rec_offs_data_size(offsets);
- row_log_table_close(
- index->online_log, b, mrec_size, avail_size);
+ row_log_table_close(index, b, mrec_size, avail_size);
}
}
@@ -2678,7 +2676,7 @@ all_done:
/* If encryption is enabled decrypt buffer after reading it
from file system. */
- if (log_tmp_is_encrypted()) {
+ if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf,
srv_sort_buf_size,
index->online_log->crypt_head,
@@ -2999,7 +2997,6 @@ row_log_allocate(
log->head.total = 0;
log->path = path;
log->crypt_tail = log->crypt_head = NULL;
- log->index = index;
dict_index_set_online_status(index, ONLINE_INDEX_CREATION);
index->online_log = log;
@@ -3548,7 +3545,7 @@ all_done:
/* If encryption is enabled decrypt buffer after reading it
from file system. */
- if (log_tmp_is_encrypted()) {
+ if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf,
srv_sort_buf_size,
index->online_log->crypt_head,
diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc
index 62dc98a3e30..27fc5c6ff63 100644
--- a/storage/innobase/row/row0merge.cc
+++ b/storage/innobase/row/row0merge.cc
@@ -880,8 +880,8 @@ row_merge_read(
success = os_file_read_no_error_handling_int_fd(fd, buf,
ofs, srv_sort_buf_size);
- /* For encrypted tables, decrypt data after reading and copy data */
- if (log_tmp_is_encrypted()) {
+ /* If encryption is enabled decrypt buffer */
+ if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf, srv_sort_buf_size,
crypt_buf, ofs, space)) {
return (FALSE);
@@ -3915,22 +3915,13 @@ row_merge_build_indexes(
DBUG_RETURN(DB_OUT_OF_MEMORY);
}
- /* Get crypt data from tablespace if present. We should be protected
- from concurrent DDL (e.g. drop table) by MDL-locks. */
- fil_space_t* space = fil_space_acquire(new_table->space);
-
- if (!space) {
- DBUG_RETURN(DB_TABLESPACE_NOT_FOUND);
- }
-
- /* If tablespace is encrypted, allocate additional buffer for
+ /* If temporal log file is encrypted allocate memory for
encryption/decryption. */
if (log_tmp_is_encrypted()) {
crypt_block = static_cast<row_merge_block_t*>(
os_mem_alloc_large(&block_size));
if (crypt_block == NULL) {
- fil_space_release(space);
DBUG_RETURN(DB_OUT_OF_MEMORY);
}
}
@@ -4310,9 +4301,5 @@ func_exit:
}
}
- if (space) {
- fil_space_release(space);
- }
-
DBUG_RETURN(error);
}
diff --git a/storage/xtradb/log/log0crypt.cc b/storage/xtradb/log/log0crypt.cc
index 9509797dde3..a5fbbab17ef 100644
--- a/storage/xtradb/log/log0crypt.cc
+++ b/storage/xtradb/log/log0crypt.cc
@@ -245,7 +245,7 @@ next:
ENCRYPTION_FLAG_DECRYPT
@param[in] offs offset to block
@param[in] space_id tablespace id
-@return true if successfull, false in case of failure
+@return true if successful, false in case of failure
*/
static
bool
diff --git a/storage/xtradb/row/row0log.cc b/storage/xtradb/row/row0log.cc
index f49ff2f1530..e15a4f4f5d8 100644
--- a/storage/xtradb/row/row0log.cc
+++ b/storage/xtradb/row/row0log.cc
@@ -182,7 +182,6 @@ struct row_log_t {
dict_table_t* table; /*!< table that is being rebuilt,
or NULL when this is a secondary
index that is being created online */
- dict_index_t* index; /*!< index to be build */
bool same_pk;/*!< whether the definition of the PRIMARY KEY
has remained the same */
const dtuple_t* add_cols;
@@ -385,7 +384,7 @@ row_log_online_op(
byte_offset,
index->table->space)) {
log->error = DB_DECRYPTION_FAILED;
- goto err_exit;
+ goto write_failed;
}
srv_stats.n_rowlog_blocks_encrypted.inc();
@@ -479,13 +478,15 @@ static MY_ATTRIBUTE((nonnull))
void
row_log_table_close_func(
/*=====================*/
- row_log_t* log, /*!< in/out: online rebuild log */
+ dict_index_t* index, /*!< in/out: online rebuilt index */
#ifdef UNIV_DEBUG
const byte* b, /*!< in: end of log record */
#endif /* UNIV_DEBUG */
ulint size, /*!< in: size of log record */
ulint avail) /*!< in: available size for log record */
{
+ row_log_t* log = index->online_log;
+
ut_ad(mutex_own(&log->mutex));
if (size >= avail) {
@@ -520,7 +521,7 @@ row_log_table_close_func(
srv_sort_buf_size,
log->crypt_tail,
byte_offset,
- log->index->table->space)) {
+ index->table->space)) {
log->error = DB_DECRYPTION_FAILED;
goto err_exit;
}
@@ -559,11 +560,11 @@ err_exit:
}
#ifdef UNIV_DEBUG
-# define row_log_table_close(log, b, size, avail) \
- row_log_table_close_func(log, b, size, avail)
+# define row_log_table_close(index, b, size, avail) \
+ row_log_table_close_func(index, b, size, avail)
#else /* UNIV_DEBUG */
# define row_log_table_close(log, b, size, avail) \
- row_log_table_close_func(log, size, avail)
+ row_log_table_close_func(index, size, avail)
#endif /* UNIV_DEBUG */
/******************************************************//**
@@ -735,8 +736,7 @@ row_log_table_delete(
b += ext_size;
}
- row_log_table_close(
- index->online_log, b, mrec_size, avail_size);
+ row_log_table_close(index, b, mrec_size, avail_size);
}
func_exit:
@@ -859,8 +859,7 @@ row_log_table_low_redundant(
b + extra_size, index, tuple->fields, tuple->n_fields);
b += size;
- row_log_table_close(
- index->online_log, b, mrec_size, avail_size);
+ row_log_table_close(index, b, mrec_size, avail_size);
}
mem_heap_free(heap);
@@ -969,8 +968,7 @@ row_log_table_low(
memcpy(b, rec, rec_offs_data_size(offsets));
b += rec_offs_data_size(offsets);
- row_log_table_close(
- index->online_log, b, mrec_size, avail_size);
+ row_log_table_close(index, b, mrec_size, avail_size);
}
}
@@ -2675,7 +2673,7 @@ all_done:
/* If encryption is enabled decrypt buffer after reading it
from file system. */
- if (log_tmp_is_encrypted()) {
+ if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf,
srv_sort_buf_size,
index->online_log->crypt_head,
@@ -2996,7 +2994,6 @@ row_log_allocate(
log->head.total = 0;
log->path = path;
log->crypt_tail = log->crypt_head = NULL;
- log->index = index;
dict_index_set_online_status(index, ONLINE_INDEX_CREATION);
index->online_log = log;
@@ -3542,7 +3539,7 @@ all_done:
/* If encryption is enabled decrypt buffer after reading it
from file system. */
- if (log_tmp_is_encrypted()) {
+ if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf,
srv_sort_buf_size,
index->online_log->crypt_head,
diff --git a/storage/xtradb/row/row0merge.cc b/storage/xtradb/row/row0merge.cc
index 5db2ab6c2b7..6e48f21c2dd 100644
--- a/storage/xtradb/row/row0merge.cc
+++ b/storage/xtradb/row/row0merge.cc
@@ -887,8 +887,8 @@ row_merge_read(
success = os_file_read_no_error_handling_int_fd(fd, buf,
ofs, srv_sort_buf_size);
- /* For encrypted tables, decrypt data after reading and copy data */
- if (log_tmp_is_encrypted()) {
+ /* If encryption is enabled decrypt buffer */
+ if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf, srv_sort_buf_size,
crypt_buf, ofs, space)) {
return (FALSE);
@@ -3918,22 +3918,13 @@ row_merge_build_indexes(
DBUG_RETURN(DB_OUT_OF_MEMORY);
}
- /* Get crypt data from tablespace if present. We should be protected
- from concurrent DDL (e.g. drop table) by MDL-locks. */
- fil_space_t* space = fil_space_acquire(new_table->space);
-
- if (!space) {
- DBUG_RETURN(DB_TABLESPACE_NOT_FOUND);
- }
-
- /* If temporal log file is encrypted allocate memory for
+ /* If temporary log file is encrypted allocate memory for
encryption/decryption. */
if (log_tmp_is_encrypted()) {
crypt_block = static_cast<row_merge_block_t*>(
os_mem_alloc_large(&block_size));
if (crypt_block == NULL) {
- fil_space_release(space);
DBUG_RETURN(DB_OUT_OF_MEMORY);
}
}
@@ -4313,9 +4304,5 @@ func_exit:
}
}
- if (space) {
- fil_space_release(space);
- }
-
DBUG_RETURN(error);
}