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>
This commit is contained in:
Sam Whited 2017-10-13 22:28:57 -05:00 committed by Ian Lance Taylor
parent 01c144c410
commit be08ddbfcd
3 changed files with 27 additions and 3 deletions

View file

@ -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
}

View file

@ -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{})
}