]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/xml: EncodeToken silently eats tokens with invalid type
authorDidier Spezia <didier.06@gmail.com>
Wed, 15 Jul 2015 20:09:24 +0000 (20:09 +0000)
committerRuss Cox <rsc@golang.org>
Thu, 23 Jul 2015 14:16:01 +0000 (14:16 +0000)
EncodeToken takes a Token (i.e. an interface{}) as a parameter,
and expects a value of type StartElement, EndElement, CharData,
Comment, ProcInst, or Directive.

If a pointer is passed instead, or any type which does not match
this list, the token is silently ignored.

Added a default case in the type switch to issue a proper error
when the type is invalid.

The behavior could be later improved by allowing pointers to
token to be accepted as well, but not for go1.5.

Fixes #11719

Change-Id: Ifd13c1563450b474acf66d57669fdccba76c1949
Reviewed-on: https://go-review.googlesource.com/12252
Reviewed-by: Andrew Gerrand <adg@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
src/encoding/xml/marshal.go
src/encoding/xml/marshal_test.go

index 5a49cc35285a75b638db88a95df0b20d4cb479bc..3c3b6aca586f5ed183ecedeb8caf32c9483c459a 100644 (file)
@@ -199,6 +199,7 @@ var (
 // elements (including the StartElement itself) will use the declared
 // prefix when encoding names with matching namespace URIs.
 func (enc *Encoder) EncodeToken(t Token) error {
+
        p := &enc.p
        switch t := t.(type) {
        case StartElement:
@@ -245,6 +246,9 @@ func (enc *Encoder) EncodeToken(t Token) error {
                p.WriteString("<!")
                p.Write(t)
                p.WriteString(">")
+       default:
+               return fmt.Errorf("xml: EncodeToken of invalid token type")
+
        }
        return p.cachedWriteError()
 }
index 78fe841d76abce1edc759bb3a1f7c6a394bb4af2..5dc78e748b306fb9e7b471da46ec082f36021145 100644 (file)
@@ -1906,3 +1906,34 @@ func TestIsValidDirective(t *testing.T) {
                }
        }
 }
+
+// Issue 11719. EncodeToken used to silently eat tokens with an invalid type.
+func TestSimpleUseOfEncodeToken(t *testing.T) {
+       var buf bytes.Buffer
+       enc := NewEncoder(&buf)
+       if err := enc.EncodeToken(&StartElement{Name: Name{"", "object1"}}); err == nil {
+               t.Errorf("enc.EncodeToken: pointer type should be rejected")
+       }
+       if err := enc.EncodeToken(&EndElement{Name: Name{"", "object1"}}); err == nil {
+               t.Errorf("enc.EncodeToken: pointer type should be rejected")
+       }
+       if err := enc.EncodeToken(StartElement{Name: Name{"", "object2"}}); err != nil {
+               t.Errorf("enc.EncodeToken: StartElement %s", err)
+       }
+       if err := enc.EncodeToken(EndElement{Name: Name{"", "object2"}}); err != nil {
+               t.Errorf("enc.EncodeToken: EndElement %s", err)
+       }
+       if err := enc.EncodeToken(Universe{}); err == nil {
+               t.Errorf("enc.EncodeToken: invalid type not caught")
+       }
+       if err := enc.Flush(); err != nil {
+               t.Errorf("enc.Flush: %s", err)
+       }
+       if buf.Len() == 0 {
+               t.Errorf("enc.EncodeToken: empty buffer")
+       }
+       want := "<object2></object2>"
+       if buf.String() != want {
+               t.Errorf("enc.EncodeToken: expected %q; got %q", want, buf.String())
+       }
+}