cmd/release: double-check gzip files are single streams

Updates golang/go#19052

Change-Id: I453dd1cc6016bf137f25f4e5b7a772b2c1888279
Reviewed-on: https://go-review.googlesource.com/36913
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/cmd/release/release.go b/cmd/release/release.go
index db34d8c..45498e3 100644
--- a/cmd/release/release.go
+++ b/cmd/release/release.go
@@ -10,6 +10,7 @@
 import (
 	"archive/tar"
 	"archive/zip"
+	"bufio"
 	"bytes"
 	"compress/gzip"
 	"context"
@@ -601,10 +602,39 @@
 	if err := f.Close(); err != nil {
 		return err
 	}
+	if strings.HasSuffix(name, ".gz") {
+		if err := verifyGzipSingleStream(name); err != nil {
+			return fmt.Errorf("error verifying that %s is a single-stream gzip: %v", name, err)
+		}
+	}
 	b.logf("Wrote %q.", name)
 	return nil
 }
 
+// verifyGzipSingleStream verifies that the named gzip file is not
+// a multi-stream file. See golang.org/issue/19052
+func verifyGzipSingleStream(name string) error {
+	f, err := os.Open(name)
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+	br := bufio.NewReader(f)
+	zr, err := gzip.NewReader(br)
+	if err != nil {
+		return err
+	}
+	zr.Multistream(false)
+	if _, err := io.Copy(ioutil.Discard, zr); err != nil {
+		return fmt.Errorf("reading first stream: %v", err)
+	}
+	peek, err := br.Peek(1)
+	if len(peek) > 0 || err != io.EOF {
+		return fmt.Errorf("unexpected peek of %d, %v after first gzip stream", len(peek), err)
+	}
+	return nil
+}
+
 func addPrefix(prefix string, in []string) []string {
 	var out []string
 	for _, s := range in {