Skip to content

Commit 722d2e3

Browse files
json: detect slice-based value cycles
1 parent d8717df commit 722d2e3

File tree

2 files changed

+10
-0
lines changed

2 files changed

+10
-0
lines changed

json/codec.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ type encoder struct {
4949

5050
type cycleKey struct {
5151
ptr unsafe.Pointer
52+
len int // 0 for pointers or maps; length for slices or array pointers.
5253
}
5354

5455
type cycleMap map[cycleKey]struct{}

json/encode.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,15 @@ func (e encoder) encodeTime(b []byte, p unsafe.Pointer) ([]byte, error) {
296296
}
297297

298298
func (e encoder) encodeArray(b []byte, p unsafe.Pointer, n int, size uintptr, t reflect.Type, encode encodeFunc) ([]byte, error) {
299+
if shouldCheckForRefCycle(&e) {
300+
key := cycleKey{ptr: p}
301+
if hasRefCycle(&e, key) {
302+
return b, refCycleError(t, p)
303+
}
304+
305+
defer freeRefCycleInfo(&e, key)
306+
}
307+
299308
start := len(b)
300309
var err error
301310
b = append(b, '[')

0 commit comments

Comments
 (0)