File tree 1 file changed +27
-9
lines changed 1 file changed +27
-9
lines changed Original file line number Diff line number Diff line change @@ -604,27 +604,45 @@ func (d *Decoder) rawToken() (Token, error) {
604
604
case '?' :
605
605
// <?: Processing instruction.
606
606
var target string
607
+ var data []byte
607
608
if target , ok = d .name (); ! ok {
608
609
if d .err == nil {
609
610
d .err = d .syntaxError ("expected target name after <?" )
610
611
}
611
612
return nil , d .err
612
613
}
613
- d .space ()
614
614
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 '?' :
617
635
if b , ok = d .mustgetc (); ! ok {
618
636
return nil , d .err
619
637
}
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
623
641
}
624
- b0 = b
642
+ default :
643
+ d .err = d .syntaxError ("unexpected byte after processing instruction name" )
644
+ return nil , d .err
625
645
}
626
- data := d .buf .Bytes ()
627
- data = data [0 : len (data )- 2 ] // chop ?>
628
646
629
647
if target == "xml" {
630
648
content := string (data )
You can’t perform that action at this time.
0 commit comments