From dd1bab2d98d3435471d3d9590b3ce4f3c4960c69 Mon Sep 17 00:00:00 2001 From: Timon Wong Date: Wed, 7 Sep 2022 07:00:12 +0000 Subject: [PATCH] go/analysis/passes/printf: fix panic parsing argument index Fixes golang/go#54828 Change-Id: I516dc83230f6bc96b0ff21f3bbae702f1511e5b0 GitHub-Last-Rev: b26f46a2df820d4862b7c81200c86551b84719fa GitHub-Pull-Request: golang/tools#395 Reviewed-on: https://go-review.googlesource.com/c/tools/+/426875 Auto-Submit: Tim King TryBot-Result: Gopher Robot Reviewed-by: Michael Knyszek gopls-CI: kokoro Run-TryBot: Tim King Reviewed-by: Tim King --- go/analysis/passes/printf/printf.go | 5 +++-- go/analysis/passes/printf/testdata/src/a/a.go | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go/analysis/passes/printf/printf.go b/go/analysis/passes/printf/printf.go index f56b9b7beb7..87f171e16c8 100644 --- a/go/analysis/passes/printf/printf.go +++ b/go/analysis/passes/printf/printf.go @@ -672,12 +672,13 @@ func (s *formatState) parseIndex() bool { s.scanNum() ok := true if s.nbytes == len(s.format) || s.nbytes == start || s.format[s.nbytes] != ']' { - ok = false - s.nbytes = strings.Index(s.format, "]") + ok = false // syntax error is either missing "]" or invalid index. + s.nbytes = strings.Index(s.format[start:], "]") if s.nbytes < 0 { s.pass.ReportRangef(s.call, "%s format %s is missing closing ]", s.name, s.format) return false } + s.nbytes = s.nbytes + start } arg32, err := strconv.ParseInt(s.format[start:s.nbytes], 10, 32) if err != nil || !ok || arg32 <= 0 || arg32 > int64(len(s.call.Args)-s.firstArg) { diff --git a/go/analysis/passes/printf/testdata/src/a/a.go b/go/analysis/passes/printf/testdata/src/a/a.go index 5eca3172dec..1721ecc1406 100644 --- a/go/analysis/passes/printf/testdata/src/a/a.go +++ b/go/analysis/passes/printf/testdata/src/a/a.go @@ -217,6 +217,7 @@ func PrintfTests() { Printf("%[2]*.[1]*[3]d x", 2, "hi", 4) // want `a.Printf format %\[2]\*\.\[1\]\*\[3\]d uses non-int \x22hi\x22 as argument of \*` Printf("%[0]s x", "arg1") // want `a.Printf format has invalid argument index \[0\]` Printf("%[0]d x", 1) // want `a.Printf format has invalid argument index \[0\]` + Printf("%[3]*.[2*[1]f", 1, 2, 3) // want `a.Printf format has invalid argument index \[2\*\[1\]` // Something that satisfies the error interface. var e error fmt.Println(e.Error()) // ok