diff options
author | Meng Zhuo <mengzhuo1203@gmail.com> | 2020-12-10 09:52:52 +0800 |
---|---|---|
committer | Jonathan Amsterdam <jba@google.com> | 2020-12-15 13:59:00 +0000 |
commit | 3298300ddf45a0792b4d8ea5e05f0fbceec4c9f9 (patch) | |
tree | 586c63698e560ddc0de78a0b8a71ae6981c80a49 | |
parent | 5a25a3fd1d8248c039e34f5ae02cc9c8198fc6d6 (diff) | |
download | go-3298300ddf45a0792b4d8ea5e05f0fbceec4c9f9.tar.gz go-3298300ddf45a0792b4d8ea5e05f0fbceec4c9f9.zip |
text/template: error on range over send channel
template range require channel contains RecvDir
if recv on send only channel will raise an panic.
Fixes #43065
Change-Id: Ie0ea70ce60e074bf8c9f2378e07ef1d4c41dc38f
Reviewed-on: https://go-review.googlesource.com/c/go/+/276532
Trust: Meng Zhuo <mzh@golangcn.org>
Run-TryBot: Meng Zhuo <mzh@golangcn.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Daniel Martà <mvdan@mvdan.cc>
-rw-r--r-- | src/text/template/exec.go | 4 | ||||
-rw-r--r-- | src/text/template/exec_test.go | 13 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/text/template/exec.go b/src/text/template/exec.go index 7ac5175006..19154fc640 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -373,6 +373,10 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) { if val.IsNil() { break } + if val.Type().ChanDir() == reflect.SendDir { + s.errorf("range over send-only channel %v", val) + break + } i := 0 for ; ; i++ { elem, ok := val.Recv() diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go index 1611ee054f..1a129ed5af 100644 --- a/src/text/template/exec_test.go +++ b/src/text/template/exec_test.go @@ -1697,3 +1697,16 @@ func TestIssue31810(t *testing.T) { t.Errorf("%s got %q, expected %q", textCall, b.String(), "result") } } + +// Issue 43065, range over send only channel +func TestIssue43065(t *testing.T) { + var b bytes.Buffer + tmp := Must(New("").Parse(`{{range .}}{{end}}`)) + ch := make(chan<- int) + err := tmp.Execute(&b, ch) + if err == nil { + t.Error("expected err got nil") + } else if !strings.Contains(err.Error(), "range over send-only channel") { + t.Errorf("%s", err) + } +} |