From aacc2927b9894a61c447bc2d3f007776a68fff94 Mon Sep 17 00:00:00 2001 From: Sanan Date: Thu, 10 Sep 2026 16:27:50 +0400 Subject: [PATCH] Reject malformed client version numbers --- pkg/vparser/vparser.go | 26 ++++++++++++++++++-------- pkg/vparser/vparser_test.go | 15 +++++++++++++++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/pkg/vparser/vparser.go b/pkg/vparser/vparser.go index 4447923..e95d17c 100644 --- a/pkg/vparser/vparser.go +++ b/pkg/vparser/vparser.go @@ -111,7 +111,7 @@ func parseVersion(input string) Version { vers.Date = split[split_length-1] vers.Build = split[split_length-2] vers.Tag = strings.Join(split[1:split_length-3], "") - vers.Major, vers.Minor, vers.Patch = parseVersionNumber(split[0]) + vers.Major, vers.Minor, vers.Patch, vers.Error = parseVersionNumber(split[0]) case 4: // Date vers.Date = split[3] @@ -126,7 +126,7 @@ func parseVersion(input string) Version { fallthrough case 1: // Version - vers.Major, vers.Minor, vers.Patch = parseVersionNumber(split[0]) + vers.Major, vers.Minor, vers.Patch, vers.Error = parseVersionNumber(split[0]) } if vers.Major == 0 && vers.Minor == 0 && vers.Patch == 0 { @@ -137,26 +137,36 @@ func parseVersion(input string) Version { return vers } -func parseVersionNumber(input string) (int, int, int) { +func parseVersionNumber(input string) (int, int, int, bool) { // Version trimmed := strings.TrimLeft(input, "v") vSplit := strings.Split(trimmed, ".") var major, minor, patch int + var err error switch len(vSplit) { case 4: - fallthrough + return 0, 0, 0, true case 3: - patch, _ = strconv.Atoi(vSplit[2]) + patch, err = strconv.Atoi(vSplit[2]) + if err != nil { + return 0, 0, 0, true + } fallthrough case 2: - minor, _ = strconv.Atoi(vSplit[1]) + minor, err = strconv.Atoi(vSplit[1]) + if err != nil { + return 0, 0, 0, true + } fallthrough case 1: - major, _ = strconv.Atoi(vSplit[0]) + major, err = strconv.Atoi(vSplit[0]) + if err != nil { + return 0, 0, 0, true + } } - return major, minor, patch + return major, minor, patch, false } func parseOS(input string) OSInfo { diff --git a/pkg/vparser/vparser_test.go b/pkg/vparser/vparser_test.go index 6e503ec..f0bb700 100644 --- a/pkg/vparser/vparser_test.go +++ b/pkg/vparser/vparser_test.go @@ -140,6 +140,21 @@ func TestParseVersionString(t *testing.T) { args: "Geth/enode://91a3c3d5e76b0acf05d9abddee959f1bcbc7c91537d2629288a9edd7a3df90acaa46ffba0e0e5d49a20598e0960ac458d76eb8fa92a1d64938c0a3a3d60f8be4@127.0.0.1:21000/v1.10.0-stable(quorum-v22.1.0)/linux-amd64/go1.17.2", want: nil, }, + { + name: "invalid-minor-version", + args: "Geth/v1.bad.3/linux-amd64/go1.16.3", + want: nil, + }, + { + name: "invalid-patch-version", + args: "Geth/v1.10.bad/linux-amd64/go1.16.3", + want: nil, + }, + { + name: "too-many-version-components", + args: "Geth/v1.10.3.4/linux-amd64/go1.16.3", + want: nil, + }, } for _, tt := range test_data {