From 4e38253394d6762ca10c127634fd01762526b642 Mon Sep 17 00:00:00 2001 From: Rebecca Stambler Date: Thu, 27 Jun 2019 12:39:54 -0400 Subject: [PATCH] internal/span: catch potential panics in go/token Updates golang/go#32639 Change-Id: Ib413fc316af4308d8928647ff36a437d243a9c11 Reviewed-on: https://go-review.googlesource.com/c/tools/+/184038 Run-TryBot: Rebecca Stambler TryBot-Result: Gobot Gobot Reviewed-by: Ian Cottrell --- internal/span/token.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/internal/span/token.go b/internal/span/token.go index 406da4af..4efd0c80 100644 --- a/internal/span/token.go +++ b/internal/span/token.go @@ -99,6 +99,14 @@ func (s Span) Range(converter *TokenConverter) (Range, error) { if err != nil { return Range{}, err } + // go/token will panic if the offset is larger than the file's size, + // so check here to avoid panicking. + if s.Start().Offset() > converter.file.Size() { + return Range{}, fmt.Errorf("start offset %v is past the end of the file", s.Start()) + } + if s.End().Offset() > converter.file.Size() { + return Range{}, fmt.Errorf("end offset %v is past the end of the file", s.End()) + } return Range{ FileSet: converter.fset, Start: converter.file.Pos(s.Start().Offset()), @@ -107,7 +115,9 @@ func (s Span) Range(converter *TokenConverter) (Range, error) { } func (l *TokenConverter) ToPosition(offset int) (int, int, error) { - //TODO: check offset fits in file + if offset > l.file.Size() { + return 0, 0, fmt.Errorf("offset %v is past the end of the file", offset) + } pos := l.file.Pos(offset) p := l.fset.Position(pos) return p.Line, p.Column, nil