Browse Source

MDEV-15764 InnoDB may write uninitialized garbage to redo log

log_write_up_to(): Erase the end of the current log block.
Simplify the computation of pad_size.

log_buffer_switch(): Evaluate a condition only once.
pull/466/merge
Marko Mäkelä 8 years ago
parent
commit
3c21eccb8c
  1. 16
      storage/innobase/log/log0log.cc

16
storage/innobase/log/log0log.cc

@ -1085,17 +1085,17 @@ log_buffer_switch()
OS_FILE_LOG_BLOCK_SIZE);
if (log_sys->first_in_use) {
log_sys->first_in_use = false;
ut_ad(log_sys->buf == ut_align(log_sys->buf_ptr,
OS_FILE_LOG_BLOCK_SIZE));
log_sys->buf += log_sys->buf_size;
} else {
log_sys->first_in_use = true;
log_sys->buf -= log_sys->buf_size;
ut_ad(log_sys->buf == ut_align(log_sys->buf_ptr,
OS_FILE_LOG_BLOCK_SIZE));
}
log_sys->first_in_use = !log_sys->first_in_use;
/* Copy the last block to new buf */
ut_memcpy(log_sys->buf,
old_buf + area_end - OS_FILE_LOG_BLOCK_SIZE,
@ -1235,6 +1235,9 @@ loop:
log_group_set_fields(&log_sys->log, log_sys->write_lsn);
log_mutex_exit();
/* Erase the end of the last log block. */
memset(write_buf + end_offset, 0, ~end_offset & OS_FILE_LOG_BLOCK_SIZE);
/* Calculate pad_size if needed. */
pad_size = 0;
if (write_ahead_size > OS_FILE_LOG_BLOCK_SIZE) {
@ -1251,12 +1254,9 @@ loop:
/* The first block in the unit was initialized
after the last writing.
Needs to be written padded data once. */
pad_size = write_ahead_size - end_offset_in_unit;
if (area_end + pad_size > log_sys->buf_size) {
pad_size = log_sys->buf_size - area_end;
}
pad_size = std::min(
ulint(write_ahead_size) - end_offset_in_unit,
log_sys->buf_size - area_end);
::memset(write_buf + area_end, 0, pad_size);
}
}

Loading…
Cancel
Save