From 3ca339417067d054e73c352920f4964b7a673614 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Thu, 5 Aug 2021 16:57:57 +0300 Subject: [PATCH] [refer #395] Check WAL record CRC in waldecoder (#396) --- pageserver/src/waldecoder.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pageserver/src/waldecoder.rs b/pageserver/src/waldecoder.rs index 10e66dac63..06ec502058 100644 --- a/pageserver/src/waldecoder.rs +++ b/pageserver/src/waldecoder.rs @@ -4,6 +4,7 @@ //! use bytes::{Buf, BufMut, Bytes, BytesMut}; use log::*; +use crc32c::*; use postgres_ffi::pg_constants; use postgres_ffi::xlog_utils::*; use postgres_ffi::XLogLongPageHeaderData; @@ -166,6 +167,14 @@ impl WalStreamDecoder { // XLOG_SWITCH records are special. If we see one, we need to skip // to the next WAL segment. let xlogrec = XLogRecord::from_bytes(&mut buf); + let mut crc = crc32c_append(0, &recordbuf[XLOG_RECORD_CRC_OFFS+4..]); + crc = crc32c_append(crc, &recordbuf[0..XLOG_RECORD_CRC_OFFS]); + if crc != xlogrec.xl_crc { + return Err(WalDecodeError { + msg: "WAL record crc mismatch".into(), + lsn: self.lsn, + }); + } if xlogrec.is_xlog_switch_record() { trace!("saw xlog switch record at {}", self.lsn); self.padlen =