Skip to content

jsoniter crash with custom encoders with map #204

Closed
@sreekanth-cb

Description

@sreekanth-cb

Seeing a crash with custom map encoders with jsoniter. The same works fine with std json.
Attaching the code.

package main

import (
	"encoding/json"
	"fmt"
	"unsafe"

	jsoniter "github.com/json-iterator/go"
)

func jsoniterMarshal(input Status) {
	bb, err := jsoniter.Marshal(&input)
	if err != nil {
		fmt.Printf("JSONITER Error %v \n", err)
		return
	}
	fmt.Printf("JSONITER Res %s  \n", bb)
}

func jsonMarshal(input Status) {
	bb, err := json.Marshal(&input)
	if err != nil {
		fmt.Printf("JSON Error %v \n", err)
		return
	}
	fmt.Printf("JSON Res %s  \n", bb)
}

type ErrMap map[string]error

type Status struct {
	Total   int    `json:"total"`
	ErrMaps ErrMap `json:"errMaps,omitempty"`
}

func (iem ErrMap) MarshalJSON() ([]byte, error) {
	tmp := make(map[string]string, len(iem))
	for k, v := range iem {
		tmp[k] = v.Error()
	}
	return json.Marshal(tmp)
}

func encodeMap(ptr unsafe.Pointer, stream *jsoniter.Stream) {
	iem := *((*ErrMap)(ptr))
	//log.Printf("\nval-> %+v", iem)
	if iem != nil {
		tmp := make(map[string]string, len(iem))
		for k, v := range iem {
			tmp[k] = v.Error()
		}
		stream.WriteVal(tmp)
	}
}

func main() {
	jsoniter.RegisterTypeEncoderFunc("main.ErrMap", encodeMap, nil)

	eMap := make(ErrMap, 2)
	eMap["first"] = fmt.Errorf("First Error")
	eMap["second"] = fmt.Errorf("Second Error")
	s := Status{Total: 100,
		ErrMaps: eMap}

	jsonMarshal(s)
	jsoniterMarshal(s)

}

Crash stack observed

goroutine 1 [running]:
main.encodeMap(0xc42007c4e0, 0xc420074360)
/Users/sreekanth/jsoniter/mapFails.go:48 +0x48
github.com/json-iterator/go.(*funcEncoder).Encode(0xc420076250, 0xc42007c4e0, 0xc420074360)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_reflect_extension.go:99 +0x3d
github.com/json-iterator/go.(*optionalMapEncoder).Encode(0xc4200764b0, 0xc4200763e8, 0xc420074360)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_reflect.go:144 +0x4f
github.com/json-iterator/go.(*structFieldEncoder).Encode(0xc420070420, 0xc4200763e0, 0xc420074360)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_reflect_object.go:118 +0x5c
github.com/json-iterator/go.(*structEncoder).Encode(0xc4200704c0, 0xc4200763e0, 0xc420074360)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_reflect_object.go:155 +0xc2
github.com/json-iterator/go.(*OptionalEncoder).Encode(0xc420076510, 0xc420076528, 0xc420074360)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_reflect.go:124 +0x4f
github.com/json-iterator/go.WriteToStream(0x10fad60, 0xc4200763e0, 0xc420074360, 0x11c3c80, 0xc420076510)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_reflect.go:47 +0xd5
github.com/json-iterator/go.(*OptionalEncoder).EncodeInterface(0xc420076510, 0x10fad60, 0xc4200763e0, 0xc420074360)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_reflect.go:129 +0x55
github.com/json-iterator/go.(*Stream).WriteVal(0xc420074360, 0x10fad60, 0xc4200763e0)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_reflect.go:252 +0xe4
github.com/json-iterator/go.(*frozenConfig).Marshal(0xc420096100, 0x10fad60, 0xc4200763e0, 0x0, 0x0, 0x0, 0x0, 0x0)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_config.go:263 +0xdb
github.com/json-iterator/go.Marshal(0x10fad60, 0xc4200763e0, 0xc420041ea8, 0x1, 0x1, 0x53, 0x0)
/Users/sreekanth/workspace_fix_json/godeps/src/github.com/json-iterator/go/feature_adapter.go:43 +0x49
main.jsoniterMarshal(0x64, 0xc42007c4e0)
/Users/sreekanth/jsoniter/mapFails.go:12 +0x87
main.main()
/Users/sreekanth/jsoniter/mapFails.go:66 +0x296
exit status 2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions