From ea085414ef3bee6f9a7d5f4daed5d24a744c1ab9 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 23 Jul 2015 11:41:35 -0400 Subject: [PATCH] cmd/go: do not panic on template I/O error Fixes #11839. Change-Id: Ie092a3a512a2d35967364b41081a066ab3a6aab4 Reviewed-on: https://go-review.googlesource.com/12571 Reviewed-by: Ian Lance Taylor --- src/cmd/go/main.go | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index e07651bb02..88a94417d7 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -235,12 +235,35 @@ var documentationTemplate = `// Copyright 2011 The Go Authors. All rights reser package main ` +// An errWriter wraps a writer, recording whether a write error occurred. +type errWriter struct { + w io.Writer + err error +} + +func (w *errWriter) Write(b []byte) (int, error) { + n, err := w.w.Write(b) + if err != nil { + w.err = err + } + return n, err +} + // tmpl executes the given template text on data, writing the result to w. func tmpl(w io.Writer, text string, data interface{}) { t := template.New("top") t.Funcs(template.FuncMap{"trim": strings.TrimSpace, "capitalize": capitalize}) template.Must(t.Parse(text)) - if err := t.Execute(w, data); err != nil { + ew := &errWriter{w: w} + err := t.Execute(ew, data) + if ew.err != nil { + // I/O error writing. Ignore write on closed pipe. + if strings.Contains(ew.err.Error(), "pipe") { + os.Exit(1) + } + fatalf("writing output: %v", ew.err) + } + if err != nil { panic(err) } } -- 2.50.0