Commit ff3ea68e authored by Rob Pike's avatar Rob Pike

explicitly catch attempt to decode into a value - must be a pointer to see the result.

R=rsc
https://golang.org/cl/163070
parent f9810f1b
......@@ -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();
......
......@@ -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")
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment