]> Sergey Matveev's repositories - btrtrc.git/commitdiff
bencode: Support decoding "" as dict key
authorMatt Joiner <anacrolix@gmail.com>
Fri, 7 Jan 2022 08:11:37 +0000 (19:11 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 7 Jan 2022 08:11:41 +0000 (19:11 +1100)
bencode/decode.go
bencode/decode_test.go

index 1007db906c58eeafd46b282c2348d1f509122ded..e72a12d5cf63418b492f9c0e9b9e7e9b7fbf651a 100644 (file)
@@ -690,7 +690,8 @@ func (d *Decoder) parseStringInterface() string {
 
 func (d *Decoder) parseDictInterface() interface{} {
        dict := make(map[string]interface{})
-       lastKey := ""
+       var lastKey string
+       lastKeyOk := false
        for {
                start := d.Offset
                keyi, ok := d.parseValueInterface()
@@ -705,7 +706,7 @@ func (d *Decoder) parseDictInterface() interface{} {
                                What:   errors.New("non-string key in a dict"),
                        })
                }
-               if key <= lastKey {
+               if lastKeyOk && key <= lastKey {
                        d.throwSyntaxError(start, fmt.Errorf("dict keys unsorted: %q <= %q", key, lastKey))
                }
                start = d.Offset
@@ -715,6 +716,7 @@ func (d *Decoder) parseDictInterface() interface{} {
                }
 
                lastKey = key
+               lastKeyOk = true
                dict[key] = valuei
        }
        return dict
index 8cb972f81e6cde9868fe7af544e1d90261b3b4a3..eaf9e71ea09749460b4badb0400858efd3741ec8 100644 (file)
@@ -40,6 +40,7 @@ var random_decode_tests = []random_decode_test{
                "v": "TR%=",
                "y": "r",
        }},
+       {"d0:i420ee", map[string]interface{}{"": int64(420)}},
 }
 
 func TestRandomDecode(t *testing.T) {