go-qemu icon indicating copy to clipboard operation
go-qemu copied to clipboard

Stack overflow when marshaling QMP generated structs.

Open mosca1337 opened this issue 7 years ago • 0 comments

Attempting to marshal ChardevBackendSocket or similar structs results in a stack overflow. MarshalJSON() seems to be recursively called by nesting s. Am I missing something critical or is the generated method incorrect?

// Reproduce with
socket := raw.ChardevBackendSocket{}
data, err := json.Marshal(socket)

// Attempting to add a chardev via QMP
socket := raw.ChardevBackendSocket{}
result, err := monitoronitor.ChardevAdd("mySocket", socket)
func (s ChardevBackendSocket) MarshalJSON() ([]byte, error) {
	v := map[string]interface{}{
		"type": "socket",
		"data": s,
	}
	return json.Marshal(v)
}
	<autogenerated>:528 +0x7d fp=0xc440500950 sp=0xc4405008c0
encoding/json.marshalerEncoder(0xc4376add90, 0xac9e00, 0xc4348b47e0, 0x99, 0xc4348b0100)
	/usr/lib/golang/src/encoding/json/encode.go:451 +0x9f fp=0xc4405009c0 sp=0xc440500950
encoding/json.(*encodeState).reflectValue(0xc4376add90, 0xac9e00, 0xc4348b47e0, 0x99, 0xc4348b0100)
	/usr/lib/golang/src/encoding/json/encode.go:323 +0x82 fp=0xc4405009f8 sp=0xc4405009c0
encoding/json.interfaceEncoder(0xc4376add90, 0xa192e0, 0xc4376aabf0, 0x94, 0xc4376a0100)
	/usr/lib/golang/src/encoding/json/encode.go:617 +0xdb fp=0xc440500a38 sp=0xc4405009f8
encoding/json.(*mapEncoder).encode(0xc420196030, 0xc4376add90, 0xa28ec0, 0xc4313c88a0, 0x15, 0xa20100)
	/usr/lib/golang/src/encoding/json/encode.go:690 +0x589 fp=0xc440500ba8 sp=0xc440500a38
encoding/json.(*mapEncoder).(encoding/json.encode)-fm(0xc4376add90, 0xa28ec0, 0xc4313c88a0, 0x15, 0xc4313c0100)
	/usr/lib/golang/src/encoding/json/encode.go:706 +0x64 fp=0xc440500be8 sp=0xc440500ba8
encoding/json.(*encodeState).reflectValue(0xc4376add90, 0xa28ec0, 0xc4313c88a0, 0x15, 0x100)
	/usr/lib/golang/src/encoding/json/encode.go:323 +0x82 fp=0xc440500c20 sp=0xc440500be8
encoding/json.(*encodeState).marshal(0xc4376add90, 0xa28ec0, 0xc4313c88a0, 0xc4376b0100, 0x0, 0x0)
	/usr/lib/golang/src/encoding/json/encode.go:296 +0xb8 fp=0xc440500c58 sp=0xc440500c20
encoding/json.Marshal(0xa28ec0, 0xc4313c88a0, 0xc440500cf0, 0xc4376b03f8, 0xc4313c88a0, 0x0, 0xc420490400)
	/usr/lib/golang/src/encoding/json/encode.go:161 +0x6e fp=0xc440500ca0 sp=0xc440500c58
/vendor/github.com/digitalocean/go-qemu/qmp/raw.ChardevBackendSocket.MarshalJSON(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/vendor/github.com/digitalocean/go-qemu/qmp/raw/autogen.go:3474 +0x1da fp=0xc440500d78 sp=0xc440500ca0
/vendor/github.com/digitalocean/go-qemu/qmp/raw.(*ChardevBackendSocket).MarshalJSON(0xc4348b4660, 0xac9e00, 0xc4348b4660, 0x7f4190f43100, 0xc4348b4660, 0xc440500e01)
	<autogenerated>:528 +0x7d fp=0xc440500e08 sp=0xc440500d78
encoding/json.marshalerEncoder(0xc4376adce0, 0xac9e00, 0xc4348b4660, 0x99, 0xc4348b0100)
	/usr/lib/golang/src/encoding/json/encode.go:451 +0x9f fp=0xc440500e78 sp=0xc440500e08
encoding/json.(*encodeState).reflectValue(0xc4376adce0, 0xac9e00, 0xc4348b4660, 0x99, 0xc4348b0100)
	/usr/lib/golang/src/encoding/json/encode.go:323 +0x82 fp=0xc440500eb0 sp=0xc440500e78
encoding/json.interfaceEncoder(0xc4376adce0, 0xa192e0, 0xc4376aabb0, 0x94, 0xc4376a0100)
	/usr/lib/golang/src/encoding/json/encode.go:617 +0xdb fp=0xc440500ef0 sp=0xc440500eb0
encoding/json.(*mapEncoder).encode(0xc420196030, 0xc4376adce0, 0xa28ec0, 0xc4313c8780, 0x15, 0xa20100)
	/usr/lib/golang/src/encoding/json/encode.go:690 +0x589 fp=0xc440501060 sp=0xc440500ef0
encoding/json.(*mapEncoder).(encoding/json.encode)-fm(0xc4376adce0, 0xa28ec0, 0xc4313c8780, 0x15, 0xc4313c0100)
	/usr/lib/golang/src/encoding/json/encode.go:706 +0x64 fp=0xc4405010a0 sp=0xc440501060
encoding/json.(*encodeState).reflectValue(0xc4376adce0, 0xa28ec0, 0xc4313c8780, 0x15, 0x100)
	/usr/lib/golang/src/encoding/json/encode.go:323 +0x82 fp=0xc4405010d8 sp=0xc4405010a0
encoding/json.(*encodeState).marshal(0xc4376adce0, 0xa28ec0, 0xc4313c8780, 0xc4376b0100, 0x0, 0x0)
	/usr/lib/golang/src/encoding/json/encode.go:296 +0xb8 fp=0xc440501110 sp=0xc4405010d8
encoding/json.Marshal(0xa28ec0, 0xc4313c8780, 0xc4405011a8, 0xc4376b02d8, 0xc4313c8780, 0x0, 0xc420490400)
	/usr/lib/golang/src/encoding/json/encode.go:161 +0x6e fp=0xc440501158 sp=0xc440501110
/vendor/github.com/digitalocean/go-qemu/qmp/raw.ChardevBackendSocket.MarshalJSON(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/vendor/github.com/digitalocean/go-qemu/qmp/raw/autogen.go:3474 +0x1da fp=0xc440501230 sp=0xc440501158
/vendor/github.com/digitalocean/go-qemu/qmp/raw.(*ChardevBackendSocket).MarshalJSON(0xc4348b44e0, 0xac9e00, 0xc4348b44e0, 0x7f4190f43100, 0xc4348b44e0, 0xc440501301)

mosca1337 avatar Jan 05 '18 20:01 mosca1337