Commit 4d01dd79 authored by Jan Lindström's avatar Jan Lindström

MDEV-12634: Uninitialised ROW_MERGE_RESERVE_SIZE bytes written to temporary file

After review cleanup.
parent 4aeec727
...@@ -246,7 +246,7 @@ log_blocks_crypt( ...@@ -246,7 +246,7 @@ log_blocks_crypt(
ENCRYPTION_FLAG_DECRYPT ENCRYPTION_FLAG_DECRYPT
@param[in] offs offset to block @param[in] offs offset to block
@param[in] space_id tablespace id @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 static
bool bool
......
...@@ -182,7 +182,6 @@ struct row_log_t { ...@@ -182,7 +182,6 @@ struct row_log_t {
dict_table_t* table; /*!< table that is being rebuilt, dict_table_t* table; /*!< table that is being rebuilt,
or NULL when this is a secondary or NULL when this is a secondary
index that is being created online */ index that is being created online */
dict_index_t* index; /*!< index to be build */
bool same_pk;/*!< whether the definition of the PRIMARY KEY bool same_pk;/*!< whether the definition of the PRIMARY KEY
has remained the same */ has remained the same */
const dtuple_t* add_cols; const dtuple_t* add_cols;
...@@ -385,7 +384,7 @@ row_log_online_op( ...@@ -385,7 +384,7 @@ row_log_online_op(
byte_offset, byte_offset,
index->table->space)) { index->table->space)) {
log->error = DB_DECRYPTION_FAILED; log->error = DB_DECRYPTION_FAILED;
goto err_exit; goto write_failed;
} }
srv_stats.n_rowlog_blocks_encrypted.inc(); srv_stats.n_rowlog_blocks_encrypted.inc();
...@@ -479,13 +478,15 @@ static MY_ATTRIBUTE((nonnull)) ...@@ -479,13 +478,15 @@ static MY_ATTRIBUTE((nonnull))
void void
row_log_table_close_func( 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 #ifdef UNIV_DEBUG
const byte* b, /*!< in: end of log record */ const byte* b, /*!< in: end of log record */
#endif /* UNIV_DEBUG */ #endif /* UNIV_DEBUG */
ulint size, /*!< in: size of log record */ ulint size, /*!< in: size of log record */
ulint avail) /*!< in: available size for log record */ ulint avail) /*!< in: available size for log record */
{ {
row_log_t* log = index->online_log;
ut_ad(mutex_own(&log->mutex)); ut_ad(mutex_own(&log->mutex));
if (size >= avail) { if (size >= avail) {
...@@ -520,7 +521,7 @@ row_log_table_close_func( ...@@ -520,7 +521,7 @@ row_log_table_close_func(
srv_sort_buf_size, srv_sort_buf_size,
log->crypt_tail, log->crypt_tail,
byte_offset, byte_offset,
log->index->table->space)) { index->table->space)) {
log->error = DB_DECRYPTION_FAILED; log->error = DB_DECRYPTION_FAILED;
goto err_exit; goto err_exit;
} }
...@@ -559,11 +560,11 @@ row_log_table_close_func( ...@@ -559,11 +560,11 @@ row_log_table_close_func(
} }
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
# define row_log_table_close(log, b, size, avail) \ # define row_log_table_close(index, b, size, avail) \
row_log_table_close_func(log, b, size, avail) row_log_table_close_func(index, b, size, avail)
#else /* UNIV_DEBUG */ #else /* UNIV_DEBUG */
# define row_log_table_close(log, b, size, avail) \ # 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 */ #endif /* UNIV_DEBUG */
/******************************************************//** /******************************************************//**
...@@ -735,8 +736,7 @@ row_log_table_delete( ...@@ -735,8 +736,7 @@ row_log_table_delete(
b += ext_size; b += ext_size;
} }
row_log_table_close( row_log_table_close(index, b, mrec_size, avail_size);
index->online_log, b, mrec_size, avail_size);
} }
func_exit: func_exit:
...@@ -859,8 +859,7 @@ row_log_table_low_redundant( ...@@ -859,8 +859,7 @@ row_log_table_low_redundant(
b + extra_size, index, tuple->fields, tuple->n_fields); b + extra_size, index, tuple->fields, tuple->n_fields);
b += size; b += size;
row_log_table_close( row_log_table_close(index, b, mrec_size, avail_size);
index->online_log, b, mrec_size, avail_size);
} }
mem_heap_free(heap); mem_heap_free(heap);
...@@ -969,8 +968,7 @@ row_log_table_low( ...@@ -969,8 +968,7 @@ row_log_table_low(
memcpy(b, rec, rec_offs_data_size(offsets)); memcpy(b, rec, rec_offs_data_size(offsets));
b += rec_offs_data_size(offsets); b += rec_offs_data_size(offsets);
row_log_table_close( row_log_table_close(index, b, mrec_size, avail_size);
index->online_log, b, mrec_size, avail_size);
} }
} }
...@@ -2678,7 +2676,7 @@ row_log_table_apply_ops( ...@@ -2678,7 +2676,7 @@ row_log_table_apply_ops(
/* If encryption is enabled decrypt buffer after reading it /* If encryption is enabled decrypt buffer after reading it
from file system. */ from file system. */
if (log_tmp_is_encrypted()) { if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf, if (!log_tmp_block_decrypt(buf,
srv_sort_buf_size, srv_sort_buf_size,
index->online_log->crypt_head, index->online_log->crypt_head,
...@@ -2999,7 +2997,6 @@ row_log_allocate( ...@@ -2999,7 +2997,6 @@ row_log_allocate(
log->head.total = 0; log->head.total = 0;
log->path = path; log->path = path;
log->crypt_tail = log->crypt_head = NULL; log->crypt_tail = log->crypt_head = NULL;
log->index = index;
dict_index_set_online_status(index, ONLINE_INDEX_CREATION); dict_index_set_online_status(index, ONLINE_INDEX_CREATION);
index->online_log = log; index->online_log = log;
...@@ -3548,7 +3545,7 @@ row_log_apply_ops( ...@@ -3548,7 +3545,7 @@ row_log_apply_ops(
/* If encryption is enabled decrypt buffer after reading it /* If encryption is enabled decrypt buffer after reading it
from file system. */ from file system. */
if (log_tmp_is_encrypted()) { if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf, if (!log_tmp_block_decrypt(buf,
srv_sort_buf_size, srv_sort_buf_size,
index->online_log->crypt_head, index->online_log->crypt_head,
......
...@@ -880,8 +880,8 @@ row_merge_read( ...@@ -880,8 +880,8 @@ row_merge_read(
success = os_file_read_no_error_handling_int_fd(fd, buf, success = os_file_read_no_error_handling_int_fd(fd, buf,
ofs, srv_sort_buf_size); ofs, srv_sort_buf_size);
/* For encrypted tables, decrypt data after reading and copy data */ /* If encryption is enabled decrypt buffer */
if (log_tmp_is_encrypted()) { if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf, srv_sort_buf_size, if (!log_tmp_block_decrypt(buf, srv_sort_buf_size,
crypt_buf, ofs, space)) { crypt_buf, ofs, space)) {
return (FALSE); return (FALSE);
...@@ -3915,22 +3915,13 @@ row_merge_build_indexes( ...@@ -3915,22 +3915,13 @@ row_merge_build_indexes(
DBUG_RETURN(DB_OUT_OF_MEMORY); DBUG_RETURN(DB_OUT_OF_MEMORY);
} }
/* Get crypt data from tablespace if present. We should be protected /* If temporal log file is encrypted allocate memory for
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
encryption/decryption. */ encryption/decryption. */
if (log_tmp_is_encrypted()) { if (log_tmp_is_encrypted()) {
crypt_block = static_cast<row_merge_block_t*>( crypt_block = static_cast<row_merge_block_t*>(
os_mem_alloc_large(&block_size)); os_mem_alloc_large(&block_size));
if (crypt_block == NULL) { if (crypt_block == NULL) {
fil_space_release(space);
DBUG_RETURN(DB_OUT_OF_MEMORY); DBUG_RETURN(DB_OUT_OF_MEMORY);
} }
} }
...@@ -4310,9 +4301,5 @@ row_merge_build_indexes( ...@@ -4310,9 +4301,5 @@ row_merge_build_indexes(
} }
} }
if (space) {
fil_space_release(space);
}
DBUG_RETURN(error); DBUG_RETURN(error);
} }
...@@ -245,7 +245,7 @@ log_blocks_crypt( ...@@ -245,7 +245,7 @@ log_blocks_crypt(
ENCRYPTION_FLAG_DECRYPT ENCRYPTION_FLAG_DECRYPT
@param[in] offs offset to block @param[in] offs offset to block
@param[in] space_id tablespace id @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 static
bool bool
......
...@@ -182,7 +182,6 @@ struct row_log_t { ...@@ -182,7 +182,6 @@ struct row_log_t {
dict_table_t* table; /*!< table that is being rebuilt, dict_table_t* table; /*!< table that is being rebuilt,
or NULL when this is a secondary or NULL when this is a secondary
index that is being created online */ index that is being created online */
dict_index_t* index; /*!< index to be build */
bool same_pk;/*!< whether the definition of the PRIMARY KEY bool same_pk;/*!< whether the definition of the PRIMARY KEY
has remained the same */ has remained the same */
const dtuple_t* add_cols; const dtuple_t* add_cols;
...@@ -385,7 +384,7 @@ row_log_online_op( ...@@ -385,7 +384,7 @@ row_log_online_op(
byte_offset, byte_offset,
index->table->space)) { index->table->space)) {
log->error = DB_DECRYPTION_FAILED; log->error = DB_DECRYPTION_FAILED;
goto err_exit; goto write_failed;
} }
srv_stats.n_rowlog_blocks_encrypted.inc(); srv_stats.n_rowlog_blocks_encrypted.inc();
...@@ -479,13 +478,15 @@ static MY_ATTRIBUTE((nonnull)) ...@@ -479,13 +478,15 @@ static MY_ATTRIBUTE((nonnull))
void void
row_log_table_close_func( 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 #ifdef UNIV_DEBUG
const byte* b, /*!< in: end of log record */ const byte* b, /*!< in: end of log record */
#endif /* UNIV_DEBUG */ #endif /* UNIV_DEBUG */
ulint size, /*!< in: size of log record */ ulint size, /*!< in: size of log record */
ulint avail) /*!< in: available size for log record */ ulint avail) /*!< in: available size for log record */
{ {
row_log_t* log = index->online_log;
ut_ad(mutex_own(&log->mutex)); ut_ad(mutex_own(&log->mutex));
if (size >= avail) { if (size >= avail) {
...@@ -520,7 +521,7 @@ row_log_table_close_func( ...@@ -520,7 +521,7 @@ row_log_table_close_func(
srv_sort_buf_size, srv_sort_buf_size,
log->crypt_tail, log->crypt_tail,
byte_offset, byte_offset,
log->index->table->space)) { index->table->space)) {
log->error = DB_DECRYPTION_FAILED; log->error = DB_DECRYPTION_FAILED;
goto err_exit; goto err_exit;
} }
...@@ -559,11 +560,11 @@ row_log_table_close_func( ...@@ -559,11 +560,11 @@ row_log_table_close_func(
} }
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
# define row_log_table_close(log, b, size, avail) \ # define row_log_table_close(index, b, size, avail) \
row_log_table_close_func(log, b, size, avail) row_log_table_close_func(index, b, size, avail)
#else /* UNIV_DEBUG */ #else /* UNIV_DEBUG */
# define row_log_table_close(log, b, size, avail) \ # 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 */ #endif /* UNIV_DEBUG */
/******************************************************//** /******************************************************//**
...@@ -735,8 +736,7 @@ row_log_table_delete( ...@@ -735,8 +736,7 @@ row_log_table_delete(
b += ext_size; b += ext_size;
} }
row_log_table_close( row_log_table_close(index, b, mrec_size, avail_size);
index->online_log, b, mrec_size, avail_size);
} }
func_exit: func_exit:
...@@ -859,8 +859,7 @@ row_log_table_low_redundant( ...@@ -859,8 +859,7 @@ row_log_table_low_redundant(
b + extra_size, index, tuple->fields, tuple->n_fields); b + extra_size, index, tuple->fields, tuple->n_fields);
b += size; b += size;
row_log_table_close( row_log_table_close(index, b, mrec_size, avail_size);
index->online_log, b, mrec_size, avail_size);
} }
mem_heap_free(heap); mem_heap_free(heap);
...@@ -969,8 +968,7 @@ row_log_table_low( ...@@ -969,8 +968,7 @@ row_log_table_low(
memcpy(b, rec, rec_offs_data_size(offsets)); memcpy(b, rec, rec_offs_data_size(offsets));
b += rec_offs_data_size(offsets); b += rec_offs_data_size(offsets);
row_log_table_close( row_log_table_close(index, b, mrec_size, avail_size);
index->online_log, b, mrec_size, avail_size);
} }
} }
...@@ -2675,7 +2673,7 @@ row_log_table_apply_ops( ...@@ -2675,7 +2673,7 @@ row_log_table_apply_ops(
/* If encryption is enabled decrypt buffer after reading it /* If encryption is enabled decrypt buffer after reading it
from file system. */ from file system. */
if (log_tmp_is_encrypted()) { if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf, if (!log_tmp_block_decrypt(buf,
srv_sort_buf_size, srv_sort_buf_size,
index->online_log->crypt_head, index->online_log->crypt_head,
...@@ -2996,7 +2994,6 @@ row_log_allocate( ...@@ -2996,7 +2994,6 @@ row_log_allocate(
log->head.total = 0; log->head.total = 0;
log->path = path; log->path = path;
log->crypt_tail = log->crypt_head = NULL; log->crypt_tail = log->crypt_head = NULL;
log->index = index;
dict_index_set_online_status(index, ONLINE_INDEX_CREATION); dict_index_set_online_status(index, ONLINE_INDEX_CREATION);
index->online_log = log; index->online_log = log;
...@@ -3542,7 +3539,7 @@ row_log_apply_ops( ...@@ -3542,7 +3539,7 @@ row_log_apply_ops(
/* If encryption is enabled decrypt buffer after reading it /* If encryption is enabled decrypt buffer after reading it
from file system. */ from file system. */
if (log_tmp_is_encrypted()) { if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf, if (!log_tmp_block_decrypt(buf,
srv_sort_buf_size, srv_sort_buf_size,
index->online_log->crypt_head, index->online_log->crypt_head,
......
...@@ -887,8 +887,8 @@ row_merge_read( ...@@ -887,8 +887,8 @@ row_merge_read(
success = os_file_read_no_error_handling_int_fd(fd, buf, success = os_file_read_no_error_handling_int_fd(fd, buf,
ofs, srv_sort_buf_size); ofs, srv_sort_buf_size);
/* For encrypted tables, decrypt data after reading and copy data */ /* If encryption is enabled decrypt buffer */
if (log_tmp_is_encrypted()) { if (success && log_tmp_is_encrypted()) {
if (!log_tmp_block_decrypt(buf, srv_sort_buf_size, if (!log_tmp_block_decrypt(buf, srv_sort_buf_size,
crypt_buf, ofs, space)) { crypt_buf, ofs, space)) {
return (FALSE); return (FALSE);
...@@ -3918,22 +3918,13 @@ row_merge_build_indexes( ...@@ -3918,22 +3918,13 @@ row_merge_build_indexes(
DBUG_RETURN(DB_OUT_OF_MEMORY); DBUG_RETURN(DB_OUT_OF_MEMORY);
} }
/* Get crypt data from tablespace if present. We should be protected /* If temporary log file is encrypted allocate memory for
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
encryption/decryption. */ encryption/decryption. */
if (log_tmp_is_encrypted()) { if (log_tmp_is_encrypted()) {
crypt_block = static_cast<row_merge_block_t*>( crypt_block = static_cast<row_merge_block_t*>(
os_mem_alloc_large(&block_size)); os_mem_alloc_large(&block_size));
if (crypt_block == NULL) { if (crypt_block == NULL) {
fil_space_release(space);
DBUG_RETURN(DB_OUT_OF_MEMORY); DBUG_RETURN(DB_OUT_OF_MEMORY);
} }
} }
...@@ -4313,9 +4304,5 @@ row_merge_build_indexes( ...@@ -4313,9 +4304,5 @@ row_merge_build_indexes(
} }
} }
if (space) {
fil_space_release(space);
}
DBUG_RETURN(error); DBUG_RETURN(error);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment