Skip to content

Commit d8717df

Browse files
json: support cycle detection involving maps
1 parent f786a42 commit d8717df

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

json/encode.go

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,15 +329,29 @@ func (e encoder) encodeMap(b []byte, p unsafe.Pointer, t reflect.Type, encodeKey
329329
return e.encodeNull(b, nil)
330330
}
331331

332+
// checkRefCycle/freeRefCycle expect the map header pointer itself,
333+
// rather than a pointer to the header.
334+
p = *(*unsafe.Pointer)(p)
335+
336+
if shouldCheckForRefCycle(&e) {
337+
key := cycleKey{ptr: p}
338+
if hasRefCycle(&e, key) {
339+
return b, refCycleError(t, p)
340+
}
341+
342+
defer freeRefCycleInfo(&e, key)
343+
}
344+
332345
keys := m.MapKeys()
333346
if sortKeys != nil && (e.flags&SortMapKeys) != 0 {
334347
sortKeys(keys)
335348
}
336349

337350
start := len(b)
338-
var err error
339351
b = append(b, '{')
340352

353+
var err error
354+
341355
for i, k := range keys {
342356
v := m.MapIndex(k)
343357

@@ -384,6 +398,19 @@ func (e encoder) encodeMapStringInterface(b []byte, p unsafe.Pointer) ([]byte, e
384398
return e.encodeNull(b, nil)
385399
}
386400

401+
// checkRefCycle/freeRefCycle expect the map header pointer itself,
402+
// rather than a pointer to the header.
403+
p = *(*unsafe.Pointer)(p)
404+
405+
if shouldCheckForRefCycle(&e) {
406+
key := cycleKey{ptr: p}
407+
if hasRefCycle(&e, key) {
408+
return b, refCycleError(mapStringInterfaceType, p)
409+
}
410+
411+
defer freeRefCycleInfo(&e, key)
412+
}
413+
387414
if (e.flags & SortMapKeys) == 0 {
388415
// Optimized code path when the program does not need the map keys to be
389416
// sorted.
@@ -424,9 +451,10 @@ func (e encoder) encodeMapStringInterface(b []byte, p unsafe.Pointer) ([]byte, e
424451
sort.Sort(s)
425452

426453
start := len(b)
427-
var err error
428454
b = append(b, '{')
429455

456+
var err error
457+
430458
for i, elem := range s.elements {
431459
if i != 0 {
432460
b = append(b, ',')

0 commit comments

Comments
 (0)