diff options
| author | Sam Whited <sam@samwhited.com> | 2017-10-13 22:28:57 -0500 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2017-10-30 18:52:19 +0000 |
| commit | be08ddbfcd855fd13cf80497921ae53d2b64a7b1 (patch) | |
| tree | 95363782670ce02c3edf907223addf04fbf2f8bf /src/encoding/xml | |
| parent | 01c144c410b09d8b56d40e7e9c54fface204aa29 (diff) | |
| download | go-be08ddbfcd855fd13cf80497921ae53d2b64a7b1.tar.xz | |
encoding/xml: don't panic when custom Unmarshaler sees StartElement
Change-Id: I90aa0a983abd0080f3de75d3340fdb15c1f9ca35
Reviewed-on: https://go-review.googlesource.com/70891
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Sam Whited <sam@samwhited.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/encoding/xml')
| -rw-r--r-- | src/encoding/xml/xml.go | 6 | ||||
| -rw-r--r-- | src/encoding/xml/xml_test.go | 23 |
2 files changed, 26 insertions, 3 deletions
diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go index be90b62c9a..7556d4b876 100644 --- a/src/encoding/xml/xml.go +++ b/src/encoding/xml/xml.go @@ -277,9 +277,6 @@ func NewTokenDecoder(t TokenReader) *Decoder { // If Token encounters an unrecognized name space prefix, // it uses the prefix as the Space rather than report an error. func (d *Decoder) Token() (Token, error) { - if d.t != nil { - return d.t.Token() - } var t Token var err error if d.stk != nil && d.stk.kind == stkEOF { @@ -548,6 +545,9 @@ func (d *Decoder) RawToken() (Token, error) { } func (d *Decoder) rawToken() (Token, error) { + if d.t != nil { + return d.t.Token() + } if d.err != nil { return nil, d.err } diff --git a/src/encoding/xml/xml_test.go b/src/encoding/xml/xml_test.go index 2437f19d9d..7a3511d583 100644 --- a/src/encoding/xml/xml_test.go +++ b/src/encoding/xml/xml_test.go @@ -861,3 +861,26 @@ func TestWrapDecoder(t *testing.T) { t.Fatalf("Got unexpected chardata: `%s`\n", o.Chardata) } } + +type tokReader struct{} + +func (tokReader) Token() (Token, error) { + return StartElement{}, nil +} + +type Failure struct{} + +func (Failure) UnmarshalXML(*Decoder, StartElement) error { + return nil +} + +func TestTokenUnmarshaler(t *testing.T) { + defer func() { + if r := recover(); r != nil { + t.Error("Unexpected panic using custom token unmarshaler") + } + }() + + d := NewTokenDecoder(tokReader{}) + d.Decode(&Failure{}) +} |
