]> Cypherpunks repositories - gostls13.git/commitdiff
explicitly catch attempt to decode into a value - must be a pointer to see the result.
authorRob Pike <r@golang.org>
Wed, 2 Dec 2009 05:47:00 +0000 (21:47 -0800)
committerRob Pike <r@golang.org>
Wed, 2 Dec 2009 05:47:00 +0000 (21:47 -0800)
R=rsc
https://golang.org/cl/163070

src/pkg/gob/decoder.go
src/pkg/gob/encoder_test.go

index 1713a3e59fa8ddd7dfdfd6b4f18e07728986c1a5..a88c97400ea134f7a709515466a172c41d479dd3 100644 (file)
@@ -58,6 +58,13 @@ func (dec *Decoder) recvType(id typeId) {
 // The value underlying e must be the correct type for the next
 // data item received.
 func (dec *Decoder) Decode(e interface{}) os.Error {
+       // If e represents a value, the answer won't get back to the
+       // caller.  Make sure it's a pointer.
+       if _, ok := reflect.Typeof(e).(*reflect.PtrType); !ok {
+               dec.state.err = os.ErrorString("gob: attempt to decode into a non-pointer");
+               return dec.state.err;
+       }
+
        // Make sure we're single-threaded through here.
        dec.mutex.Lock();
        defer dec.mutex.Unlock();
index 77487884d63dba5f0fcf533884430311f4e67235..26ce96faf48b4f690dc706aca8440fa2905f3c3f 100644 (file)
@@ -9,6 +9,7 @@ import (
        "io";
        "os";
        "reflect";
+       "strings";
        "testing";
 )
 
@@ -195,7 +196,6 @@ func TestPtrTypeToType(t *testing.T) {
 }
 
 func TestTypeToPtrPtrPtrPtrType(t *testing.T) {
-       // Encode a *T, decode a T
        type Type2 struct {
                a ****float;
        }
@@ -215,7 +215,6 @@ func TestTypeToPtrPtrPtrPtrType(t *testing.T) {
 }
 
 func TestSlice(t *testing.T) {
-       // Encode a *T, decode a T
        type Type3 struct {
                a []string;
        }
@@ -225,3 +224,15 @@ func TestSlice(t *testing.T) {
                t.Error(err)
        }
 }
+
+func TestValueError(t *testing.T) {
+       // Encode a *T, decode a T
+       type Type4 struct {
+               a int;
+       }
+       t4p := Type4{3};        // note: not a pointer, unlike the other tests.
+       var t4 Type4;
+       if err := encAndDec(t4, t4p); err == nil || strings.Index(err.String(), "pointer") <= 0 {
+               t.Error("expected error; got none or got wrong one")
+       }
+}