aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/xml/xml.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding/xml/xml.go')
-rw-r--r--src/encoding/xml/xml.go12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go
index 6b8f2e7978..a1e63ed30d 100644
--- a/src/encoding/xml/xml.go
+++ b/src/encoding/xml/xml.go
@@ -212,6 +212,7 @@ type Decoder struct {
line int
linestart int64
offset int64
+ readNonWS bool
unmarshalDepth int
}
@@ -559,6 +560,8 @@ func (d *Decoder) rawToken() (Token, error) {
return EndElement{d.toClose}, nil
}
+ readNonWS := d.readNonWS
+
b, ok := d.getc()
if !ok {
return nil, d.err
@@ -571,8 +574,12 @@ func (d *Decoder) rawToken() (Token, error) {
if data == nil {
return nil, d.err
}
+ if !d.readNonWS && !isWhitespace(CharData(data)) {
+ d.readNonWS = true
+ }
return CharData(data), nil
}
+ d.readNonWS = true
if b, ok = d.mustgetc(); !ok {
return nil, d.err
@@ -623,6 +630,11 @@ func (d *Decoder) rawToken() (Token, error) {
data = data[0 : len(data)-2] // chop ?>
if target == "xml" {
+ if readNonWS {
+ d.err = errors.New("xml: XML declaration after start of document")
+ return nil, d.err
+ }
+
content := string(data)
ver := procInst("version", content)
if ver != "" && ver != "1.0" {