mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Fix edge-case for xl_tot_len broken by bae868ca
.
bae868ca
removed a check that was still needed. If you had an xl_tot_len at the end of a page that was too small for a record header, but not big enough to span onto the next page, we'd immediately perform the CRC check using a bogus large length. Because of arbitrary coding differences between the CRC implementations on different platforms, nothing very bad happened on common modern systems. On systems using the _sb8.c fallback we could segfault. Restore that check, add a new assertion and supply a test for that case. Back-patch to 12, likebae868ca
. Tested-by: Tom Lane <tgl@sss.pgh.pa.us> Tested-by: Alexander Lakhin <exclusion@gmail.com> Discussion: https://postgr.es/m/CA%2BhUKGLCkTT7zYjzOxuLGahBdQ%3DMcF%3Dz5ZvrjSOnW4EDhVjT-g%40mail.gmail.com
This commit is contained in:
@ -653,6 +653,15 @@ restart:
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There may be no next page if it's too small. */
|
||||
if (total_len < SizeOfXLogRecord)
|
||||
{
|
||||
report_invalid_record(state,
|
||||
"invalid record length at %X/%X: expected at least %u, got %u",
|
||||
LSN_FORMAT_ARGS(RecPtr),
|
||||
(uint32) SizeOfXLogRecord, total_len);
|
||||
goto err;
|
||||
}
|
||||
/* We'll validate the header once we have the next page. */
|
||||
gotheader = false;
|
||||
}
|
||||
@ -1190,6 +1199,8 @@ ValidXLogRecord(XLogReaderState *state, XLogRecord *record, XLogRecPtr recptr)
|
||||
{
|
||||
pg_crc32c crc;
|
||||
|
||||
Assert(record->xl_tot_len >= SizeOfXLogRecord);
|
||||
|
||||
/* Calculate the CRC */
|
||||
INIT_CRC32C(crc);
|
||||
COMP_CRC32C(crc, ((char *) record) + SizeOfXLogRecord, record->xl_tot_len - SizeOfXLogRecord);
|
||||
|
Reference in New Issue
Block a user