Skip to content

[Bug] Marshal crashed #546

@xrfang

Description

@xrfang
package main

import (
	"encoding/json"
	"fmt"

	gj "github.com/goccy/go-json"
)

type device struct {
	Alerts [][]any
	Items  []device
	ID     int64
}

const data = `
    {
        "items": [
            {
                "alerts": [[2]],
                "id": 2
            }
        ],
        "id": 1
    }
`

func main() {
	var d device
	json.Unmarshal([]byte(data), &d)
	fmt.Printf("%+v\n", d)
	gj.Marshal(d)
}

produces

{Alerts:[] Items:[{Alerts:[[2]] Items:[] ID:2}] ID:1}
unexpected fault address 0x0
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x48f040]

goroutine 1 gp=0xc000002380 m=0 mp=0x6bb2c0 [running]:
runtime.throw({0x581256?, 0x7f41447b5108?})
        /usr/local/go/src/runtime/panic.go:1101 +0x48 fp=0xc00008f718 sp=0xc00008f6e8 pc=0x46a5c8
runtime.sigpanic()
        /usr/local/go/src/runtime/signal_unix.go:939 +0x26c fp=0xc00008f778 sp=0xc00008f718 pc=0x46bdcc
reflect.(*rtype).common(...)
        /usr/local/go/src/reflect/type.go:324
reflect.(*rtype).Implements(0xd775dd79aaa9aab5, {0x5c8950, 0x55fba0})
        /usr/local/go/src/reflect/type.go:1392 +0x60 fp=0xc00008f798 sp=0xc00008f778 pc=0x48f040
github.com/goccy/go-json/internal/runtime.(*Type).Implements(...)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/internal/runtime/rtype.go:96
github.com/goccy/go-json/internal/encoder.(*Compiler).implementsMarshalJSONType(0xc00008f820?, 0xd775dd79aaa9aab5)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/internal/encoder/compiler.go:884 +0x2c fp=0xc00008f7c0 sp=0xc00008f798 pc=0x4e7c6c
github.com/goccy/go-json/internal/encoder.(*Compiler).implementsMarshalJSON(0xc00008f948, 0xd775dd79aaa9aab5)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/internal/encoder/compiler.go:838 +0x1d fp=0xc00008f7e0 sp=0xc00008f7c0 pc=0x4e7a5d
github.com/goccy/go-json/internal/encoder.(*Compiler).typeToCode(0xc00008f948, 0xd775dd79aaa9aab5)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/internal/encoder/compiler.go:146 +0x25 fp=0xc00008f830 sp=0xc00008f7e0 pc=0x4e4265
github.com/goccy/go-json/internal/encoder.(*Compiler).compile(0xc00008f948, 0xd775dd79aaa9aab5)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/internal/encoder/compiler.go:104 +0x25 fp=0xc00008f868 sp=0xc00008f830 pc=0x4e3ea5
github.com/goccy/go-json/internal/encoder.compileToGetCodeSetSlowPath(0xd775dd79aaa9aab5)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/internal/encoder/compiler.go:62 +0xe5 fp=0xc00008f960 sp=0xc00008f868 pc=0x4e3c05
github.com/goccy/go-json/internal/encoder.CompileToGetCodeSet(0xc0001025b0, 0xd775dd79aaa9aab5)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/internal/encoder/compiler_norace.go:9 +0x56 fp=0xc00008fa50 sp=0xc00008f960 pc=0x4e82d6
github.com/goccy/go-json/internal/encoder/vm.Run(0xc0001025b0, {0xc00011c000?, 0x0?, 0x400?}, 0xc00010a070?)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/internal/encoder/vm/vm.go:206 +0x2519b fp=0xc000091da0 sp=0xc00008fa50 pc=0x54805b
github.com/goccy/go-json.encodeRunCode(0xc0001025b0?, {0xc00011c000?, 0xc000115dd8?, 0xc0001002c0?}, 0xc00011c400?)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/encode.go:310 +0x56 fp=0xc000091dd8 sp=0xc000091da0 pc=0x5496f6
github.com/goccy/go-json.encode(0xc0001025b0, {0x56d2a0, 0xc000100280})
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/encode.go:235 +0x205 fp=0xc000091e58 sp=0xc000091dd8 pc=0x549605
github.com/goccy/go-json.marshal({0x56d2a0, 0xc000100280}, {0x0, 0x0, 0xc000100280?})
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/encode.go:150 +0xb7 fp=0xc000091eb8 sp=0xc000091e58 pc=0x5492f7
github.com/goccy/go-json.MarshalWithOption(...)
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/json.go:185
github.com/goccy/go-json.Marshal({0x56d2a0?, 0xc000100280?})
        /home/xrfang/go/pkg/mod/github.com/goccy/go-json@v0.10.5/json.go:170 +0x25 fp=0xc000091ef0 sp=0xc000091eb8 pc=0x549765
main.main()
        /home/xrfang/jsonTest/main.go:34 +0xe5 fp=0xc000091f50 sp=0xc000091ef0 pc=0x549965
runtime.main()
        /usr/local/go/src/runtime/proc.go:283 +0x28b fp=0xc000091fe0 sp=0xc000091f50 pc=0x43af2b
runtime.goexit({})
        /usr/local/go/src/runtime/asm_amd64.s:1700 +0x1 fp=0xc000091fe8 sp=0xc000091fe0 pc=0x470fc1

goroutine 2 gp=0xc0000028c0 m=nil [force gc (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
        /usr/local/go/src/runtime/proc.go:435 +0xce fp=0xc000048fa8 sp=0xc000048f88 pc=0x46a6ae
runtime.goparkunlock(...)
        /usr/local/go/src/runtime/proc.go:441
runtime.forcegchelper()
        /usr/local/go/src/runtime/proc.go:348 +0xb3 fp=0xc000048fe0 sp=0xc000048fa8 pc=0x43b273
runtime.goexit({})
        /usr/local/go/src/runtime/asm_amd64.s:1700 +0x1 fp=0xc000048fe8 sp=0xc000048fe0 pc=0x470fc1
created by runtime.init.7 in goroutine 1
        /usr/local/go/src/runtime/proc.go:336 +0x1a

goroutine 3 gp=0xc000002e00 m=nil [GC sweep wait]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
        /usr/local/go/src/runtime/proc.go:435 +0xce fp=0xc000049780 sp=0xc000049760 pc=0x46a6ae
runtime.goparkunlock(...)
        /usr/local/go/src/runtime/proc.go:441
runtime.bgsweep(0xc000026080)
        /usr/local/go/src/runtime/mgcsweep.go:276 +0x94 fp=0xc0000497c8 sp=0xc000049780 pc=0x426e14
runtime.gcenable.gowrap1()
        /usr/local/go/src/runtime/mgc.go:204 +0x25 fp=0xc0000497e0 sp=0xc0000497c8 pc=0x41b545
runtime.goexit({})
        /usr/local/go/src/runtime/asm_amd64.s:1700 +0x1 fp=0xc0000497e8 sp=0xc0000497e0 pc=0x470fc1
created by runtime.gcenable in goroutine 1
        /usr/local/go/src/runtime/mgc.go:204 +0x66

goroutine 4 gp=0xc000002fc0 m=nil [GC scavenge wait]:
runtime.gopark(0xc000026080?, 0x5c4cd0?, 0x1?, 0x0?, 0xc000002fc0?)
        /usr/local/go/src/runtime/proc.go:435 +0xce fp=0xc000049f78 sp=0xc000049f58 pc=0x46a6ae
runtime.goparkunlock(...)
        /usr/local/go/src/runtime/proc.go:441
runtime.(*scavengerState).park(0x6ba3e0)
        /usr/local/go/src/runtime/mgcscavenge.go:425 +0x49 fp=0xc000049fa8 sp=0xc000049f78 pc=0x4248c9
runtime.bgscavenge(0xc000026080)
        /usr/local/go/src/runtime/mgcscavenge.go:653 +0x3c fp=0xc000049fc8 sp=0xc000049fa8 pc=0x424e3c
runtime.gcenable.gowrap2()
        /usr/local/go/src/runtime/mgc.go:205 +0x25 fp=0xc000049fe0 sp=0xc000049fc8 pc=0x41b4e5
runtime.goexit({})
        /usr/local/go/src/runtime/asm_amd64.s:1700 +0x1 fp=0xc000049fe8 sp=0xc000049fe0 pc=0x470fc1
created by runtime.gcenable in goroutine 1
        /usr/local/go/src/runtime/mgc.go:205 +0xa5

goroutine 5 gp=0xc000003500 m=nil [finalizer wait]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
        /usr/local/go/src/runtime/proc.go:435 +0xce fp=0xc000048630 sp=0xc000048610 pc=0x46a6ae
runtime.runfinq()
        /usr/local/go/src/runtime/mfinal.go:196 +0x107 fp=0xc0000487e0 sp=0xc000048630 pc=0x41a507
runtime.goexit({})
        /usr/local/go/src/runtime/asm_amd64.s:1700 +0x1 fp=0xc0000487e8 sp=0xc0000487e0 pc=0x470fc1
created by runtime.createfing in goroutine 1
        /usr/local/go/src/runtime/mfinal.go:166 +0x3d
exit status 2

If the type definition changes to:

type device struct {
	ID     int64
	Alerts [][]any
	Items  []device
}

The program will not crash.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions