]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/gob: add "too big" check when writing a message
authorRob Pike <r@golang.org>
Tue, 12 May 2015 17:29:53 +0000 (10:29 -0700)
committerRob Pike <r@golang.org>
Tue, 12 May 2015 17:52:39 +0000 (17:52 +0000)
Messages that are too big are rejected when read, so they should
be rejected when written too.

Fixes #10518.

Change-Id: I96678fbe2d94f51b957fe26faef33cd8df3823dd
Reviewed-on: https://go-review.googlesource.com/9965
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/encoding/gob/encoder.go
src/encoding/gob/encoder_test.go

index a340e47b5ed6a903cc954738421e1e52a2327790..62d0f42e81ae3fc8f7bbdd692bfc31427803a68d 100644 (file)
@@ -5,6 +5,7 @@
 package gob
 
 import (
+       "errors"
        "io"
        "reflect"
        "sync"
@@ -65,6 +66,11 @@ func (enc *Encoder) writeMessage(w io.Writer, b *encBuffer) {
        // it by hand.
        message := b.Bytes()
        messageLen := len(message) - maxLength
+       // Length cannot be bigger than the decoder can handle.
+       if messageLen >= tooBig {
+               enc.setError(errors.New("gob: encoder: message too big"))
+               return
+       }
        // Encode the length.
        enc.countState.b.Reset()
        enc.countState.encodeUint(uint64(messageLen))
index c0bd379c937541962e08ea002de29873dd1bafd3..8a72a3118cf84a0850973b50cf74596755c92c46 100644 (file)
@@ -976,3 +976,21 @@ func TestBadData(t *testing.T) {
                }
        }
 }
+
+// TestHugeWriteFails tests that enormous messages trigger an error.
+func TestHugeWriteFails(t *testing.T) {
+       if testing.Short() {
+               // Requires allocating a monster, so don't do this from all.bash.
+               t.Skip("skipping huge allocation in short mode")
+       }
+       huge := make([]byte, tooBig)
+       huge[0] = 7 // Make sure it's not all zeros.
+       buf := new(bytes.Buffer)
+       err := NewEncoder(buf).Encode(huge)
+       if err == nil {
+               t.Fatalf("expected error for huge slice")
+       }
+       if !strings.Contains(err.Error(), "message too big") {
+               t.Fatalf("expected 'too big' error; got %s\n", err.Error())
+       }
+}