bencode/decode.go | 6 ++++-- bencode/decode_test.go | 1 + diff --git a/bencode/decode.go b/bencode/decode.go index 1007db906c58eeafd46b282c2348d1f509122ded..e72a12d5cf63418b492f9c0e9b9e7e9b7fbf651a 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -690,7 +690,8 @@ } 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 @@ Offset: d.Offset, 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 @@ d.throwSyntaxError(start, fmt.Errorf("dict elem missing value [key=%v]", key)) } lastKey = key + lastKeyOk = true dict[key] = valuei } return dict diff --git a/bencode/decode_test.go b/bencode/decode_test.go index 8cb972f81e6cde9868fe7af544e1d90261b3b4a3..eaf9e71ea09749460b4badb0400858efd3741ec8 100644 --- a/bencode/decode_test.go +++ b/bencode/decode_test.go @@ -40,6 +40,7 @@ "t": "\x9a\x87\x01", "v": "TR%=", "y": "r", }}, + {"d0:i420ee", map[string]interface{}{"": int64(420)}}, } func TestRandomDecode(t *testing.T) {