Commit 0519126a authored by Tim Cooper's avatar Tim Cooper Committed by Brad Fitzpatrick

encoding/hex: fix potential incorrect Dumper output when Close is called multiple times

Fixes #23574

Change-Id: I69573de47daa6fd53cc99a78c0c4b867460242e3
Reviewed-on: https://go-review.googlesource.com/90275Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
parent 755b36aa
...@@ -211,6 +211,7 @@ type dumper struct { ...@@ -211,6 +211,7 @@ type dumper struct {
buf [14]byte buf [14]byte
used int // number of bytes in the current line used int // number of bytes in the current line
n uint // number of bytes, total n uint // number of bytes, total
closed bool
} }
func toChar(b byte) byte { func toChar(b byte) byte {
...@@ -221,6 +222,10 @@ func toChar(b byte) byte { ...@@ -221,6 +222,10 @@ func toChar(b byte) byte {
} }
func (h *dumper) Write(data []byte) (n int, err error) { 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: // Output lines look like:
// 00000010 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d |./0123456789:;<=| // 00000010 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d |./0123456789:;<=|
// ^ offset ^ extra space ^ ASCII of line. // ^ offset ^ extra space ^ ASCII of line.
...@@ -277,9 +282,10 @@ func (h *dumper) Write(data []byte) (n int, err error) { ...@@ -277,9 +282,10 @@ func (h *dumper) Write(data []byte) (n int, err error) {
func (h *dumper) Close() (err error) { func (h *dumper) Close() (err error) {
// See the comments in Write() for the details of this format. // See the comments in Write() for the details of this format.
if h.used == 0 { if h.used == 0 || h.closed {
return return
} }
h.closed = true
h.buf[0] = ' ' h.buf[0] = ' '
h.buf[1] = ' ' h.buf[1] = ' '
h.buf[2] = ' ' h.buf[2] = ' '
......
...@@ -188,6 +188,22 @@ func TestDumper(t *testing.T) { ...@@ -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) { func TestDump(t *testing.T) {
var in [40]byte var in [40]byte
for i := range in { for i := range in {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment