]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/hex: fix potential incorrect Dumper output when Close is called multiple...
authorTim Cooper <tim.cooper@layeh.com>
Fri, 26 Jan 2018 20:36:15 +0000 (16:36 -0400)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 14 Feb 2018 03:25:25 +0000 (03:25 +0000)
Fixes #23574

Change-Id: I69573de47daa6fd53cc99a78c0c4b867460242e3
Reviewed-on: https://go-review.googlesource.com/90275
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>

src/encoding/hex/hex.go
src/encoding/hex/hex_test.go

index e4df6cbd4d11ce10503fea96272d3affb057c31d..edc53954a1c81545edf5399e8646d10c7190a5ad 100644 (file)
@@ -211,6 +211,7 @@ type dumper struct {
        buf        [14]byte
        used       int  // number of bytes in the current line
        n          uint // number of bytes, total
+       closed     bool
 }
 
 func toChar(b byte) byte {
@@ -221,6 +222,10 @@ func toChar(b byte) byte {
 }
 
 func (h *dumper) Write(data []byte) (n int, err error) {
+       if h.closed {
+               return 0, errors.New("encoding/hex: dumper closed")
+       }
+
        // Output lines look like:
        // 00000010  2e 2f 30 31 32 33 34 35  36 37 38 39 3a 3b 3c 3d  |./0123456789:;<=|
        // ^ offset                          ^ extra space              ^ ASCII of line.
@@ -277,9 +282,10 @@ func (h *dumper) Write(data []byte) (n int, err error) {
 
 func (h *dumper) Close() (err error) {
        // See the comments in Write() for the details of this format.
-       if h.used == 0 {
+       if h.used == 0 || h.closed {
                return
        }
+       h.closed = true
        h.buf[0] = ' '
        h.buf[1] = ' '
        h.buf[2] = ' '
index b6bab21c4801d87c75a67b7e9a1518bdc7ce02ec..f2223166495377b02c90257f430206f39ac0d680 100644 (file)
@@ -188,6 +188,22 @@ func TestDumper(t *testing.T) {
        }
 }
 
+func TestDumper_doubleclose(t *testing.T) {
+       var out bytes.Buffer
+       dumper := Dumper(&out)
+
+       dumper.Write([]byte(`gopher`))
+       dumper.Close()
+       dumper.Close()
+       dumper.Write([]byte(`gopher`))
+       dumper.Close()
+
+       expected := "00000000  67 6f 70 68 65 72                                 |gopher|\n"
+       if out.String() != expected {
+               t.Fatalf("got:\n%#v\nwant:\n%#v", out.String(), expected)
+       }
+}
+
 func TestDump(t *testing.T) {
        var in [40]byte
        for i := range in {