]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/gob: fix memory corruption
authorDmitriy Vyukov <dvyukov@google.com>
Wed, 7 Mar 2012 21:53:08 +0000 (08:53 +1100)
committerRob Pike <r@golang.org>
Wed, 7 Mar 2012 21:53:08 +0000 (08:53 +1100)
Fixes #3175.

R=golang-dev, iant, rsc, r
CC=golang-dev
https://golang.org/cl/5758069

src/pkg/encoding/gob/decode.go
src/pkg/encoding/gob/gobencdec_test.go

index 0708a83c99ad728be95c111b29f0ac15ac63b1b3..e32a178aba396fe2d0cc89d1f746abbb886bf01a 100644 (file)
@@ -707,6 +707,9 @@ func (dec *Decoder) decodeInterface(ityp reflect.Type, state *decoderState, p ui
        if name == "" {
                // Copy the representation of the nil interface value to the target.
                // This is horribly unsafe and special.
+               if indir > 0 {
+                       p = allocate(ityp, p, 1) // All but the last level has been allocated by dec.Indirect
+               }
                *(*[2]uintptr)(unsafe.Pointer(p)) = ivalue.InterfaceData()
                return
        }
index 83644c0331b426437888e3579dba1e3a760fac57..45240d764dcf474e19effb8bc8670ba740c6b590 100644 (file)
@@ -573,3 +573,22 @@ func TestGobEncodeIsZero(t *testing.T) {
                t.Fatalf("%v != %v", x, y)
        }
 }
+
+func TestGobEncodePtrError(t *testing.T) {
+       var err error
+       b := new(bytes.Buffer)
+       enc := NewEncoder(b)
+       err = enc.Encode(&err)
+       if err != nil {
+               t.Fatal("encode:", err)
+       }
+       dec := NewDecoder(b)
+       err2 := fmt.Errorf("foo")
+       err = dec.Decode(&err2)
+       if err != nil {
+               t.Fatal("decode:", err)
+       }
+       if err2 != nil {
+               t.Fatalf("expected nil, got %v", err2)
+       }
+}