Skip to content

Commit 9c648ca

Browse files
committed
encoding/xml: require whitespace before processing instruction value
The value of a processing instruction must either be empty or have whitespace before it. Fixes: #68386
1 parent 239666c commit 9c648ca

File tree

1 file changed

+27
-9
lines changed

1 file changed

+27
-9
lines changed

src/encoding/xml/xml.go

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -604,27 +604,45 @@ func (d *Decoder) rawToken() (Token, error) {
604604
case '?':
605605
// <?: Processing instruction.
606606
var target string
607+
var data []byte
607608
if target, ok = d.name(); !ok {
608609
if d.err == nil {
609610
d.err = d.syntaxError("expected target name after <?")
610611
}
611612
return nil, d.err
612613
}
613-
d.space()
614614
d.buf.Reset()
615-
var b0 byte
616-
for {
615+
if b, ok = d.mustgetc(); !ok {
616+
return nil, d.err
617+
}
618+
switch b {
619+
case ' ', '\t', '\r', '\n':
620+
d.space()
621+
var b0 byte
622+
for {
623+
if b, ok = d.mustgetc(); !ok {
624+
return nil, d.err
625+
}
626+
d.buf.WriteByte(b)
627+
if b0 == '?' && b == '>' {
628+
break
629+
}
630+
b0 = b
631+
}
632+
data = d.buf.Bytes()
633+
data = data[0 : len(data)-2] // chop ?>
634+
case '?':
617635
if b, ok = d.mustgetc(); !ok {
618636
return nil, d.err
619637
}
620-
d.buf.WriteByte(b)
621-
if b0 == '?' && b == '>' {
622-
break
638+
if b != '>' {
639+
d.err = d.syntaxError("expected ?> after empty processing instruction")
640+
return nil, d.err
623641
}
624-
b0 = b
642+
default:
643+
d.err = d.syntaxError("unexpected byte after processing instruction name")
644+
return nil, d.err
625645
}
626-
data := d.buf.Bytes()
627-
data = data[0 : len(data)-2] // chop ?>
628646

629647
if target == "xml" {
630648
content := string(data)

0 commit comments

Comments
 (0)