From f1814605f17ed623583927c713c9965ad9f188ea Mon Sep 17 00:00:00 2001 From: samliok Date: Thu, 15 Oct 2026 15:20:07 -0400 Subject: [PATCH] add wal write check --- wal/record.go | 10 +++++++++- wal/record_test.go | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/wal/record.go b/wal/record.go index 13ca786b..617773ec 100644 --- a/wal/record.go +++ b/wal/record.go @@ -10,6 +10,7 @@ import ( "fmt" "hash/crc64" "io" + "math" ) const ( @@ -17,10 +18,17 @@ const ( recordChecksumLen = 8 ) -var ErrInvalidCRC = errors.New("invalid CRC checksum") +var ( + ErrInvalidCRC = errors.New("invalid CRC checksum") + ErrPayloadTooLarge = errors.New("payload too large for record length field") +) // writeRecord writes a length-prefixed and check-summed record to the writer. func writeRecord(w io.Writer, payload []byte) error { + if uint64(len(payload)) > math.MaxUint32 { + return fmt.Errorf("%w: %d bytes", ErrPayloadTooLarge, len(payload)) + } + checksumIndex := recordSizeLen + len(payload) buff := make([]byte, checksumIndex+recordChecksumLen) crc := crc64.New(crc64.MakeTable(crc64.ECMA)) diff --git a/wal/record_test.go b/wal/record_test.go index f9feb439..b1f73e55 100644 --- a/wal/record_test.go +++ b/wal/record_test.go @@ -29,6 +29,16 @@ func TestWriteRecord(t *testing.T) { ) } +// TestWriteRecordRejectsOversizedPayload ensures a payload whose length does not fit in the +// 32 bit length field is rejected before anything is written. +func TestWriteRecordRejectsOversizedPayload(t *testing.T) { + payload := make([]byte, math.MaxUint32+1) + + var buff bytes.Buffer + require.ErrorIs(t, writeRecord(&buff, payload), ErrPayloadTooLarge) + require.Zero(t, buff.Len()) +} + func TestReadRecord(t *testing.T) { require := require.New(t)