From: Matt Joiner Date: Fri, 7 Jan 2022 08:11:37 +0000 (+1100) Subject: bencode: Support decoding "" as dict key X-Git-Tag: v1.41.0~28 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=726eec2f8ddc35b40ad674ba0c5ed6944a576f72;p=btrtrc.git bencode: Support decoding "" as dict key --- diff --git a/bencode/decode.go b/bencode/decode.go index 1007db90..e72a12d5 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -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 diff --git a/bencode/decode_test.go b/bencode/decode_test.go index 8cb972f8..eaf9e71e 100644 --- a/bencode/decode_test.go +++ b/bencode/decode_test.go @@ -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) {