diff --git a/src/encoding/xml/marshal.go b/src/encoding/xml/marshal.go index 13fbeeeedc75ce..f2da0e006a01d7 100644 --- a/src/encoding/xml/marshal.go +++ b/src/encoding/xml/marshal.go @@ -733,6 +733,9 @@ func (p *printer) writeStart(start *StartElement) error { if start.Name.Local == "" { return fmt.Errorf("xml: start tag with no name") } + if !isNameString(start.Name.Local) { + return fmt.Errorf("xml: start tag with invalid name: %s", start.Name.Local) + } p.tags = append(p.tags, start.Name) p.markPrefix() @@ -753,9 +756,16 @@ func (p *printer) writeStart(start *StartElement) error { if name.Local == "" { continue } + if !isNameString(name.Local) { + return fmt.Errorf("xml: attribute with invalid name: %s", name.Local) + } p.WriteByte(' ') if name.Space != "" { - p.WriteString(p.createAttrPrefix(name.Space)) + prefix := p.createAttrPrefix(name.Space) + if !isNameString(prefix) { + return fmt.Errorf("xml: attribute prefix with invalid name: %s", prefix) + } + p.WriteString(prefix) p.WriteByte(':') } p.WriteString(name.Local) @@ -771,6 +781,9 @@ func (p *printer) writeEnd(name Name) error { if name.Local == "" { return fmt.Errorf("xml: end tag with no name") } + if !isNameString(name.Local) { + return fmt.Errorf("xml: end tag with invalid name: %s", name.Local) + } if len(p.tags) == 0 || p.tags[len(p.tags)-1].Local == "" { return fmt.Errorf("xml: end tag without start tag", name.Local) } diff --git a/src/encoding/xml/marshal_test.go b/src/encoding/xml/marshal_test.go index 6c7e711aac0566..b3df2a68ec1612 100644 --- a/src/encoding/xml/marshal_test.go +++ b/src/encoding/xml/marshal_test.go @@ -2588,3 +2588,77 @@ func TestClose(t *testing.T) { }) } } + +func TestEncodeTokenInvalidNames(t *testing.T) { + tests := []struct { + name string + token Token + }{ + { + name: "start element with angle bracket in name", + token: StartElement{Name: Name{Local: `div>bar"}, Value: "data"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := Marshal(tt.input) + if err == nil { + t.Errorf("Marshal with invalid XMLName.Local=%q succeeded, want error", tt.input.XMLName.Local) + } + }) + } +}