]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/gob: ensure "duplicate type received" decoder errors surface up
authorAman Karmani <aman@tmm1.net>
Tue, 2 Mar 2021 19:52:34 +0000 (11:52 -0800)
committerEmmanuel Odeke <emmanuel@orijtech.com>
Sat, 13 Mar 2021 11:52:17 +0000 (11:52 +0000)
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>

src/encoding/gob/decoder.go
src/encoding/gob/encoder_test.go

index b52aabe54b532df5d233a7f7151514a0f94a7a3f..7eb3093391f6d5d7616dab98b377745746fafa15 100644 (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
index fe2774948a7e9a30624f036d28edaf934a2875e3..6183646f60c8d39ddbf15896911e3d036848c474 100644 (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())
+       }
+}