aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/json/encode.go
diff options
context:
space:
mode:
authorJoe Tsai <joetsai@digital-static.net>2017-11-09 20:14:47 -0800
committerJoe Tsai <thebrokentoaster@gmail.com>2017-11-13 18:23:38 +0000
commit0cee4b7b780053425a24219866b894a46b1cfd5f (patch)
tree0beedb58dee58c15e132f471f16d29a9cbef3950 /src/encoding/json/encode.go
parent510327012bd42aca3deac989e2e109dc71bb4605 (diff)
downloadgo-0cee4b7b780053425a24219866b894a46b1cfd5f.tar.xz
encoding/json: always ignore embedded pointers to unexported struct types
CL 60410 fixes a bug in reflect that allows assignments to an embedded field of a pointer to an unexported struct type. This breaks the json package because unmarshal is now unable to assign a newly allocated struct to such fields. In order to be consistent in the behavior for marshal and unmarshal, this CL changes both marshal and unmarshal to always ignore embedded pointers to unexported structs. Fixes #21357 Change-Id: If62ea11155555e61115ebb9cfa5305caf101bde5 Reviewed-on: https://go-review.googlesource.com/76851 Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/encoding/json/encode.go')
-rw-r--r--src/encoding/json/encode.go13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go
index 317a5a940d..66d1a183b0 100644
--- a/src/encoding/json/encode.go
+++ b/src/encoding/json/encode.go
@@ -1094,11 +1094,18 @@ func typeFields(t reflect.Type) []field {
isUnexported := sf.PkgPath != ""
if sf.Anonymous {
t := sf.Type
- if t.Kind() == reflect.Ptr {
+ isPointer := t.Kind() == reflect.Ptr
+ if isPointer {
t = t.Elem()
}
- if isUnexported && t.Kind() != reflect.Struct {
- // Ignore embedded fields of unexported non-struct types.
+ isStruct := t.Kind() == reflect.Struct
+ if isUnexported && (!isStruct || isPointer) {
+ // Ignore embedded fields of unexported non-struct types
+ // or pointers to unexported struct types.
+ //
+ // The latter is forbidden because unmarshal is unable
+ // to assign a new struct to the unexported field.
+ // See https://golang.org/issue/21357
continue
}
// Do not ignore embedded fields of unexported struct types