diff options
author | Alexander Pevzner <pzz@apevzner.com> | 2020-01-19 22:59:41 +0300 |
---|---|---|
committer | Alexander Pevzner <pzz@apevzner.com> | 2020-01-19 22:59:41 +0300 |
commit | 72ac6293ed2cc3960bfee62844a88780bfbfdb46 (patch) | |
tree | 9545df96d27045d966553756c0585d695a6ae9ec | |
parent | a99aeaade80c0b8f2bcad393896da3a3820210e5 (diff) |
Strict checking of value tags in message encoder
-rw-r--r-- | encoder.go | 20 | ||||
-rw-r--r-- | goipp_test.go | 2 |
2 files changed, 16 insertions, 6 deletions
@@ -48,7 +48,7 @@ func (me *messageEncoder) encode(m *Message) error { if attr.Name == "" { err = errors.New("Attribute without name") } else { - err = me.encodeAttr(attr) + err = me.encodeAttr(attr, true) } } } @@ -66,7 +66,7 @@ func (me *messageEncoder) encode(m *Message) error { } // Encode attribute -func (me *messageEncoder) encodeAttr(attr Attribute) error { +func (me *messageEncoder) encodeAttr(attr Attribute, check_tag bool) error { // Wire format // 1 byte: Tag // 2 bytes: len(Name) @@ -82,7 +82,15 @@ func (me *messageEncoder) encodeAttr(attr Attribute) error { name := attr.Name for _, val := range attr.Values { - err := me.encodeTag(val.T) + tag := val.T + + if check_tag { + if tag.IsDelimiter() || tag == TagMemberName || tag == TagEndCollection { + return fmt.Errorf("Tag %s cannot be used with value", tag) + } + } + + err := me.encodeTag(tag) if err != nil { return err } @@ -187,9 +195,9 @@ func (me *messageEncoder) encodeCollection(tag Tag, collection Collection) error attrName := MakeAttribute("", TagMemberName, String(attr.Name)) - err := me.encodeAttr(attrName) + err := me.encodeAttr(attrName, false) if err == nil { - err = me.encodeAttr(Attribute{Name: "", Values: attr.Values}) + err = me.encodeAttr(Attribute{Name: "", Values: attr.Values}, true) } if err != nil { @@ -197,7 +205,7 @@ func (me *messageEncoder) encodeCollection(tag Tag, collection Collection) error } } - return me.encodeAttr(MakeAttribute("", TagEndCollection, Void{})) + return me.encodeAttr(MakeAttribute("", TagEndCollection, Void{}), false) } // Write a piece of raw data to output stream diff --git a/goipp_test.go b/goipp_test.go index 5f216f1..b731ca0 100644 --- a/goipp_test.go +++ b/goipp_test.go @@ -180,6 +180,8 @@ func testDecode(t *testing.T, data []byte, mustFail bool) { } buf, err := m.EncodeBytes() + assertNoError(t, err) + if !bytes.Equal(buf, data) { t.Errorf("Message is not the same after decoding and encoding") } |