]> Cypherpunks.ru repositories - gostls13.git/commitdiff
text/template: error on range over send channel
authorMeng Zhuo <mengzhuo1203@gmail.com>
Thu, 10 Dec 2020 01:52:52 +0000 (09:52 +0800)
committerJonathan Amsterdam <jba@google.com>
Tue, 15 Dec 2020 13:59:00 +0000 (13:59 +0000)
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>
src/text/template/exec.go
src/text/template/exec_test.go

index 7ac51750069ea1c209d0515a35bcde6da6dfa911..19154fc6405cc1096d5c0e8730172d7acd016cdb 100644 (file)
@@ -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()
index 1611ee054fc1ed1beba0d168ac48938028d31a16..1a129ed5afdf71b7493d4fff03607858573fe2da 100644 (file)
@@ -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)
+       }
+}