mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
MDEV-12632: Source and destination overlap in memcpy, encryption.innodb-discard-import-change fails in buildbot with valgrind
Problem was that if tablespace was encrypted we try to copy also page 0 from read buffer to write buffer that are in that case the same memory area. fil_iterate When tablespace is encrypted or compressed its first page (i.e. page 0) is not encrypted or compressed and there is no need to copy buffer.
This commit is contained in:
parent
9518ddd1fb
commit
0ae13b51d7
2 changed files with 20 additions and 8 deletions
|
@ -3434,13 +3434,13 @@ fil_iterate(
|
|||
bool updated = false;
|
||||
os_offset_t page_off = offset;
|
||||
ulint n_pages_read = (ulint) n_bytes / iter.page_size;
|
||||
bool decrypted = false;
|
||||
const ulint size = iter.page_size;
|
||||
block->page.offset = page_off / size;
|
||||
|
||||
for (ulint i = 0; i < n_pages_read;
|
||||
++i, page_off += size, block->frame += size,
|
||||
block->page.offset++) {
|
||||
bool decrypted = false;
|
||||
dberr_t err = DB_SUCCESS;
|
||||
byte* src = readptr + (i * size);
|
||||
byte* dst = io_buffer + (i * size);
|
||||
|
@ -3487,6 +3487,7 @@ fil_iterate(
|
|||
block->frame = src;
|
||||
frame_changed = true;
|
||||
} else {
|
||||
ut_ad(dst != src);
|
||||
memcpy(dst, src, size);
|
||||
}
|
||||
}
|
||||
|
@ -3547,9 +3548,13 @@ page_corrupted:
|
|||
ut_ad(encrypted ?
|
||||
src != dst && dst != writeptr + (i * size):1);
|
||||
|
||||
if (encrypted) {
|
||||
memcpy(writeptr + (i * size),
|
||||
callback.get_frame(block), size);
|
||||
/* When tablespace is encrypted or compressed its
|
||||
first page (i.e. page 0) is not encrypted or
|
||||
compressed and there is no need to copy frame. */
|
||||
if (encrypted && i != 0) {
|
||||
byte *local_frame = callback.get_frame(block);
|
||||
ut_ad((writeptr + (i * size)) != local_frame);
|
||||
memcpy((writeptr + (i * size)), local_frame, size);
|
||||
}
|
||||
|
||||
if (frame_changed) {
|
||||
|
@ -3597,6 +3602,7 @@ page_corrupted:
|
|||
|
||||
if (tmp == src) {
|
||||
/* TODO: remove unnecessary memcpy's */
|
||||
ut_ad(dest != src);
|
||||
memcpy(dest, src, size);
|
||||
}
|
||||
|
||||
|
|
|
@ -3434,13 +3434,13 @@ fil_iterate(
|
|||
bool updated = false;
|
||||
os_offset_t page_off = offset;
|
||||
ulint n_pages_read = (ulint) n_bytes / iter.page_size;
|
||||
bool decrypted = false;
|
||||
const ulint size = iter.page_size;
|
||||
block->page.offset = page_off / size;
|
||||
|
||||
for (ulint i = 0; i < n_pages_read;
|
||||
++i, page_off += size, block->frame += size,
|
||||
block->page.offset++) {
|
||||
bool decrypted = false;
|
||||
dberr_t err = DB_SUCCESS;
|
||||
byte* src = readptr + (i * size);
|
||||
byte* dst = io_buffer + (i * size);
|
||||
|
@ -3487,6 +3487,7 @@ fil_iterate(
|
|||
block->frame = src;
|
||||
frame_changed = true;
|
||||
} else {
|
||||
ut_ad(dst != src);
|
||||
memcpy(dst, src, size);
|
||||
}
|
||||
}
|
||||
|
@ -3547,9 +3548,13 @@ page_corrupted:
|
|||
ut_ad(encrypted ?
|
||||
src != dst && dst != writeptr + (i * size):1);
|
||||
|
||||
if (encrypted) {
|
||||
memcpy(writeptr + (i * size),
|
||||
callback.get_frame(block), size);
|
||||
/* When tablespace is encrypted or compressed its
|
||||
first page (i.e. page 0) is not encrypted or
|
||||
compressed and there is no need to copy frame. */
|
||||
if (encrypted && i != 0) {
|
||||
byte *local_frame = callback.get_frame(block);
|
||||
ut_ad((writeptr + (i * size)) != local_frame);
|
||||
memcpy((writeptr + (i * size)), local_frame, size);
|
||||
}
|
||||
|
||||
if (frame_changed) {
|
||||
|
@ -3597,6 +3602,7 @@ page_corrupted:
|
|||
|
||||
if (tmp == src) {
|
||||
/* TODO: remove unnecessary memcpy's */
|
||||
ut_ad(dest != src);
|
||||
memcpy(dest, src, size);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue