Skip to content

Commit 0e15ae1

Browse files
committed
recv_report_corrupt_log(): Avoid buffer overflow
If recv_sys_justify_left_parsing_buf() has been invoked, it is possible that recv_previous_parsed_rec_offset is after the current offset. In this case, we must not dump any bytes before the current record.
1 parent bdf50c3 commit 0e15ae1

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

storage/innobase/log/log0recv.cc

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2308,30 +2308,30 @@ recv_report_corrupt_log(
23082308
ib::error() <<
23092309
"############### CORRUPT LOG RECORD FOUND ##################";
23102310

2311+
const ulint ptr_offset = ulint(ptr - recv_sys->buf);
2312+
23112313
ib::info() << "Log record type " << type << ", page " << space << ":"
23122314
<< page_no << ". Log parsing proceeded successfully up to "
23132315
<< recv_sys->recovered_lsn << ". Previous log record type "
23142316
<< recv_previous_parsed_rec_type << ", is multi "
23152317
<< recv_previous_parsed_rec_is_multi << " Recv offset "
2316-
<< (ptr - recv_sys->buf) << ", prev "
2318+
<< ptr_offset << ", prev "
23172319
<< recv_previous_parsed_rec_offset;
23182320

23192321
ut_ad(ptr <= recv_sys->buf + recv_sys->len);
23202322

23212323
const ulint limit = 100;
2322-
const ulint before
2323-
= std::min(recv_previous_parsed_rec_offset, limit);
2324-
const ulint after
2325-
= std::min(recv_sys->len - (ptr - recv_sys->buf), limit);
2324+
const ulint prev_offset = std::min(recv_previous_parsed_rec_offset,
2325+
ptr_offset);
2326+
const ulint before = std::min(prev_offset, limit);
2327+
const ulint after = std::min(recv_sys->len - ptr_offset, limit);
23262328

23272329
ib::info() << "Hex dump starting " << before << " bytes before and"
23282330
" ending " << after << " bytes after the corrupted record:";
23292331

2330-
ut_print_buf(stderr,
2331-
recv_sys->buf
2332-
+ recv_previous_parsed_rec_offset - before,
2333-
ptr - recv_sys->buf + before + after
2334-
- recv_previous_parsed_rec_offset);
2332+
const byte* start = recv_sys->buf + prev_offset - before;
2333+
2334+
ut_print_buf(stderr, start, ulint(ptr - start) + after);
23352335
putc('\n', stderr);
23362336

23372337
if (!srv_force_recovery) {

0 commit comments

Comments
 (0)