dop251/goja

Panic at JSON.stringify

nixijnat opened this issue · 0 comments

go.mod:

require github.com/dop251/goja v0.0.0-20230919151941-fc55792775de

Run Code:

package main

import (
	"fmt"
	"log"

	"github.com/dop251/goja"
)

func main() {
	if err := run(); err != nil {
		log.Println("failed:", err)
	}
}

const script = `

function test(obj) {
	// return obj.MarshalJSON();
	return JSON.stringify(obj);
}

`

type PermissionType int

const (
	_ PermissionType = iota

	PermissionTypeList = 1
)

func (t PermissionType) MarshalJSON() ([]byte, error) {
	switch t {
	case PermissionTypeList:
		return []byte(`1`), nil
	}
	return nil, fmt.Errorf("invalid permission_type: %v", t)
}

func run() error {
	runtime := goja.New()
	_, err := runtime.RunString(script)
	if err != nil {
		return fmt.Errorf("run string: %w", err)
	}
	var fn func(obj interface{}) (interface{}, error)
	if err := runtime.ExportTo(runtime.Get("test"), &fn); err != nil {
		return fmt.Errorf("export: %w", err)
	}
	if fn == nil {
		return fmt.Errorf("export function is nil")
	}
	t := PermissionType(10)
	result, err := fn(t)
	if err != nil {
		return fmt.Errorf("exec: %w", err)
	}
	log.Println("result: ", result)
	return nil
}

It will panic with message:

 go run main.go
panic: invalid permission_type: 10 [recovered]
        panic: invalid permission_type: 10 [recovered]
        panic: invalid permission_type: 10 [recovered]
        panic: invalid permission_type: 10

goroutine 1 [running]:
github.com/dop251/goja.(*Runtime).runWrapped.func1()
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/runtime.go:2516 +0x174
panic({0x75cce0, 0xc00016aa50})
        /usr/local/go/src/runtime/panic.go:838 +0x207
github.com/dop251/goja.(*vm).handleThrow(0xc0000d4360, {0x75cce0, 0xc00016aa50})
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/vm.go:788 +0x497
github.com/dop251/goja.(*vm).try.func1()
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/vm.go:807 +0x45
panic({0x75cce0, 0xc00016aa50})
        /usr/local/go/src/runtime/panic.go:838 +0x207
github.com/dop251/goja.(*vm).handleThrow(0xc0000d4360, {0x75cce0, 0xc00016aa50})
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/vm.go:788 +0x497
github.com/dop251/goja.(*vm).runTryInner.func1()
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/vm.go:830 +0x45
panic({0x75cce0, 0xc00016aa50})
        /usr/local/go/src/runtime/panic.go:838 +0x207
github.com/dop251/goja.(*_builtinJSON_stringifyContext).str(0xc00011d0a8, {0x83bf90?, 0xbef220?}, 0xc00016f890)
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/builtin_json.go:319 +0xa5a
github.com/dop251/goja.(*_builtinJSON_stringifyContext).do(0xc00011d0a8, {0x83bc00, 0xc00016f770})
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/builtin_json.go:278 +0x26e
github.com/dop251/goja.(*Runtime).builtinJSON_stringify(0xc0?, {{0x83bc00, 0xc00016e570}, {0xc00014e290, 0x1, 0x7}})
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/builtin_json.go:263 +0x4db
github.com/dop251/goja.(*nativeFuncObject).vmCall(0xc000168d20, 0xc0000d4360, 0x1)
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/func.go:559 +0x1ae
github.com/dop251/goja.call.exec(0x9?, 0xc0000d4360)
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/vm.go:3366 +0x6b
github.com/dop251/goja.(*vm).run(0xc0000d4360)
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/vm.go:582 +0x62
github.com/dop251/goja.(*vm).runTryInner(0xc0000d4360?)
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/vm.go:834 +0x70
github.com/dop251/goja.(*baseJsFuncObject).__call(0xc00014e180, {0xc00016a9d0?, 0x1, 0x0?}, {0x0?, 0x0}, {0x83c3b8?, 0xc20e80?})
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/func.go:426 +0x645
github.com/dop251/goja.(*baseJsFuncObject)._call(...)
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/func.go:442
github.com/dop251/goja.(*baseJsFuncObject).call(0xc0000c35a8?, {{0x83c3b8, 0xc20e80}, {0xc00016a9d0, 0x1, 0x1}}, {0x0?, 0x0?})
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/func.go:450 +0x7a
github.com/dop251/goja.(*baseJsFuncObject).Call(0xc0000c35b8?, {{0x83c3b8, 0xc20e80}, {0xc00016a9d0, 0x1, 0x1}})
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/func.go:382 +0x45
github.com/dop251/goja.AssertFunction.func1.1()
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/runtime.go:2476 +0x74
github.com/dop251/goja.(*vm).try(0xc0000d4360, 0xc00011d800)
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/vm.go:811 +0x230
github.com/dop251/goja.(*Runtime).runWrapped(0xc000080800, 0x7f9329ef75b8?)
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/runtime.go:2520 +0x7c
github.com/dop251/goja.AssertFunction.func1({0x83c3b8?, 0xc20e80?}, {0xc00016a9d0?, 0x0?, 0x10?})
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/runtime.go:2475 +0x92
github.com/dop251/goja.(*Runtime).wrapJSFunc.func1({0xc0000ac5a0, 0x1, 0x2?})
        /home/good/code/go/pkg/mod/github.com/dop251/goja@v0.0.0-20230707174833-636fdf960de1/runtime.go:2284 +0x106
main.run()
        /home/good/code/go_repo/good/test.service.strategy/test/main.go:55 +0x147
main.main()
        /home/good/code/go_repo/good/test.service.strategy/test/main.go:11 +0x19
exit status 2