From 919673c9aad99e951cbfd4cd8d93773ec4d1d485 Mon Sep 17 00:00:00 2001 From: Qiang Zhao Date: Tue, 12 Nov 2024 09:09:29 +0800 Subject: [PATCH] fix(wal): fix wrong overflow validation calculation (#566) ### Motivation The calculation of the actual buf remain size should not include a header. ``` actualBufSize := bufSize - startFileOffset ``` --- server/wal/codec/v2.go | 2 +- server/wal/codec/v2_test.go | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/server/wal/codec/v2.go b/server/wal/codec/v2.go index 0d94b18e..3cd9e911 100644 --- a/server/wal/codec/v2.go +++ b/server/wal/codec/v2.go @@ -116,7 +116,7 @@ func (v *V2) ReadHeaderWithValidation(buf []byte, startFileOffset uint32) (paylo expectSize := payloadSize + v.HeaderSize // overflow checking - actualBufSize := bufSize - (startFileOffset + headerOffset) + actualBufSize := bufSize - startFileOffset if expectSize > actualBufSize { return payloadSize, previousCrc, payloadCrc, errors.Wrapf(ErrOffsetOutOfBounds, "expected payload size: %d. actual buf size: %d ", expectSize, bufSize) diff --git a/server/wal/codec/v2_test.go b/server/wal/codec/v2_test.go index a1fa0d78..3e06eec4 100644 --- a/server/wal/codec/v2_test.go +++ b/server/wal/codec/v2_test.go @@ -15,6 +15,7 @@ package codec import ( + "bytes" "encoding/binary" "github.com/google/uuid" "os" @@ -308,3 +309,13 @@ func TestV2_IndexBroken(t *testing.T) { _, err = v2.ReadIndex(p) assert.ErrorIs(t, err, ErrDataCorrupted) } + +func TestV2_ReadWithValidation(t *testing.T) { + buf := make([]byte, 15) + payloadSize := uint32(len(buf)) - v2.HeaderSize + payload := bytes.Repeat([]byte("A"), int(payloadSize)) + _, wPayloadCrc := v2.WriteRecord(buf, 0, 0, payload) + _, _, rPayloadCrc, err := v2.ReadHeaderWithValidation(buf, 0) + assert.NoError(t, err) + assert.EqualValues(t, wPayloadCrc, rPayloadCrc) +}