goccy / go-yaml

YAML support for the Go language
MIT License
1.12k stars 129 forks source link

`Unmarshal` will `panic` on malformed octets #439

Open infosecual opened 5 months ago

infosecual commented 5 months ago

Describe the bug Unmarshal will panic on malformed octets.

To Reproduce I made a test function in a fork of this project that will reliably trigger the panic here.

The offending test case is simple:

%YAML 1.2
---
a: 1
b: 0_

Expected behavior A clear error returned from Unmarshal that gracefully handles the malformed token (no panic) .

Version Variables

Additional context Here is the panic output:

Running tool: /usr/local/go/bin/go test -timeout 30s -run ^TestUnmarshalOctet$ github.com/goccy/go-yaml

--- FAIL: TestUnmarshalOctet (0.00s)
panic: runtime error: index out of range [1] with length 1 [recovered]
    panic: runtime error: index out of range [1] with length 1

goroutine 6 [running]:
testing.tRunner.func1.2({0x742ce0, 0xc0003182e8})
    /usr/local/go/src/testing/testing.go:1631 +0x24a
testing.tRunner.func1()
    /usr/local/go/src/testing/testing.go:1634 +0x377
panic({0x742ce0?, 0xc0003182e8?})
    /usr/local/go/src/runtime/panic.go:770 +0x132
github.com/goccy/go-yaml/ast.Integer(0xc000017130)
    /home/user/repos/infosecual-go-yaml/ast/ast.go:336 +0x9d2
github.com/goccy/go-yaml/parser.(*parser).parseScalarValue(0x7fd1d9453bf8?, 0xc000017130)
    /home/user/repos/infosecual-go-yaml/parser/parser.go:470 +0x48e
github.com/goccy/go-yaml/parser.(*parser).parseScalarValueWithComment(0xc0000edcb8, 0xc000328500, 0x0?)
    /home/user/repos/infosecual-go-yaml/parser/parser.go:443 +0x25
github.com/goccy/go-yaml/parser.(*parser).createNodeFromToken(0xc0000edcb8, 0xc000328500, 0xc000017130)
    /home/user/repos/infosecual-go-yaml/parser/parser.go:650 +0x4a
github.com/goccy/go-yaml/parser.(*parser).parseToken(0xa43f20?, 0xc000328500, 0x0?)
    /home/user/repos/infosecual-go-yaml/parser/parser.go:632 +0x1c
github.com/goccy/go-yaml/parser.(*parser).parse(0xc0000edcb8, {0xc000074230?, 0x1?, 0x0?}, 0x0?)
    /home/user/repos/infosecual-go-yaml/parser/parser.go:688 +0x14d
github.com/goccy/go-yaml/parser.Parse({0xc000074230?, 0xc0002fb600?, 0x2?}, 0x7fd1d94790e8?)
    /home/user/repos/infosecual-go-yaml/parser/parser.go:724 +0x29
github.com/goccy/go-yaml/parser.ParseBytes({0xc0002fb600?, 0xc0002e4690?, 0x7e2d60?}, 0x0)
    /home/user/repos/infosecual-go-yaml/parser/parser.go:714 +0x3d
github.com/goccy/go-yaml.(*Decoder).parse(0xc000000180, {0xc0002fb600?, 0x7e2d40?, 0xc0002e4690?})
    /home/user/repos/infosecual-go-yaml/decode.go:1642 +0x3e
github.com/goccy/go-yaml.(*Decoder).decodeInit(0xc000000180)
    /home/user/repos/infosecual-go-yaml/decode.go:1670 +0xb1
github.com/goccy/go-yaml.(*Decoder).DecodeContext(0xc000000180, {0x7e4e10, 0xa43f20}, {0x6ee4a0?, 0xc000012228?})
    /home/user/repos/infosecual-go-yaml/decode.go:1718 +0x19a
github.com/goccy/go-yaml.UnmarshalContext({0x7e4e10, 0xa43f20}, {0xc00030fc58, 0x2, 0x8}, {0x6ee4a0, 0xc000012228}, {0x0, 0x0, 0x0})
    /home/user/repos/infosecual-go-yaml/yaml.go:191 +0x225
github.com/goccy/go-yaml.UnmarshalWithOptions(...)
    /home/user/repos/infosecual-go-yaml/yaml.go:185
github.com/goccy/go-yaml.Unmarshal(...)
    /home/user/repos/infosecual-go-yaml/yaml.go:179
github.com/goccy/go-yaml_test.TestUnmarshalOctet(0xc0000d0d00)
    /home/user/repos/infosecual-go-yaml/yaml_test.go:53 +0x7c
testing.tRunner(0xc0000d0d00, 0x77b7c0)
    /usr/local/go/src/testing/testing.go:1689 +0xfb
created by testing.(*T).Run in goroutine 1
    /usr/local/go/src/testing/testing.go:1742 +0x390
FAIL    github.com/goccy/go-yaml    0.005s
FAIL