From a04770587e9f879caf742e01653908136b516dd1 Mon Sep 17 00:00:00 2001 From: Meo597 <197331664+Meo597@users.noreply.github.com> Date: Wed, 14 Oct 2026 22:04:54 +0800 Subject: [PATCH] geodata: validate entry and code tags before matching --- common/geodata/geodat_loader.go | 6 ++++-- common/geodata/geodat_loader_test.go | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/common/geodata/geodat_loader.go b/common/geodata/geodat_loader.go index 658b7481d..7c41f191d 100644 --- a/common/geodata/geodat_loader.go +++ b/common/geodata/geodat_loader.go @@ -148,7 +148,8 @@ func seek(br *bufio.Reader, code []byte, size int64) (int, error) { need := 2 + codeL // TODO: if code too long for { - if _, err := br.ReadByte(); err != nil { + tag, err := br.ReadByte() + if err != nil { return 0, err } @@ -170,7 +171,8 @@ func seek(br *bufio.Reader, code []byte, size int64) (int, error) { } return 0, err } - if bodyL >= need && len(prefix) >= need && int(prefix[1]) == codeL && bytes.Equal(prefix[2:], code) { + if tag == 0x0a && bodyL >= need && len(prefix) >= need && + prefix[0] == 0x0a && int(prefix[1]) == codeL && bytes.Equal(prefix[2:], code) { return bodyL, nil } if _, err := br.Discard(bodyL); err != nil { diff --git a/common/geodata/geodat_loader_test.go b/common/geodata/geodat_loader_test.go index 10281ae79..3d1a3a192 100644 --- a/common/geodata/geodat_loader_test.go +++ b/common/geodata/geodat_loader_test.go @@ -1,6 +1,7 @@ package geodata import ( + "bytes" "fmt" "os" "path/filepath" @@ -12,6 +13,19 @@ import ( "google.golang.org/protobuf/proto" ) +func TestFindChecksEntryAndCodeTags(t *testing.T) { + for _, payload := range [][]byte{ + {0x12, 6, 0x0a, 4, 'T', 'E', 'S', 'T'}, // Unknown field posing as entry. + {0x08, 6, 0x0a, 4, 'T', 'E', 'S', 'T'}, // Wrong entry wire type. + {0x0a, 6, 0x1a, 4, 'T', 'E', 'S', 'T'}, // Unknown field posing as code. + {0x0a, 6, 0x08, 4, 'T', 'E', 'S', 'T'}, // Wrong code wire type. + } { + if _, err := find(bytes.NewReader(payload), []byte("TEST"), true, int64(len(payload))); err == nil { + t.Fatalf("matched incorrect entry/code tags in %x", payload) + } + } +} + func TestLoadFileRejectsVarintOverflow(t *testing.T) { payload := []byte{ 0x0a,