1
0
mirror of https://github.com/golang/go synced 2024-09-24 05:10:13 -06:00

encoding/gob: ensure "duplicate type received" decoder errors surface up

Previously re-using a decoder with a new stream resulted in a confusing
"extra data in buffer" error message.

Change-Id: Ia4c4c3a2d4b63c59e37e53faa61a500d5ff6e5f1
Reviewed-on: https://go-review.googlesource.com/c/go/+/297949
Reviewed-by: Rob Pike <r@golang.org>
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Emmanuel Odeke <emmanuel@orijtech.com>
This commit is contained in:
Aman Karmani 2021-03-02 11:52:34 -08:00 committed by Emmanuel Odeke
parent 83e79c7b14
commit b3235b75d1
2 changed files with 28 additions and 0 deletions

View File

@ -152,6 +152,9 @@ func (dec *Decoder) decodeTypeSequence(isInterface bool) typeId {
}
// Type definition for (-id) follows.
dec.recvType(-id)
if dec.err != nil {
break
}
// When decoding an interface, after a type there may be a
// DelimitedValue still in the buffer. Skip its count.
// (Alternatively, the buffer is empty and the byte count

View File

@ -1127,3 +1127,28 @@ func TestBadData(t *testing.T) {
}
}
}
func TestDecodeErrorMultipleTypes(t *testing.T) {
type Test struct {
A string
B int
}
var b bytes.Buffer
NewEncoder(&b).Encode(Test{"one", 1})
var result, result2 Test
dec := NewDecoder(&b)
err := dec.Decode(&result)
if err != nil {
t.Errorf("decode: unexpected error %v", err)
}
b.Reset()
NewEncoder(&b).Encode(Test{"two", 2})
err = dec.Decode(&result2)
if err == nil {
t.Errorf("decode: expected duplicate type error, got nil")
} else if !strings.Contains(err.Error(), "duplicate type") {
t.Errorf("decode: expected duplicate type error, got %s", err.Error())
}
}