From: Matt Joiner Date: Thu, 13 Jun 2019 03:07:37 +0000 (+1000) Subject: bencode: Decode singleton lists of the expected type X-Git-Tag: v1.3.0~8 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=95daebd06764741f39db7bbdf5d366162ba188cc;p=btrtrc.git bencode: Decode singleton lists of the expected type Fixes #297. --- diff --git a/bencode/decode.go b/bencode/decode.go index 081a44a7..8b22fa73 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -344,12 +344,23 @@ func (d *Decoder) parseDict(v reflect.Value) error { func (d *Decoder) parseList(v reflect.Value) error { switch v.Kind() { - case reflect.Array, reflect.Slice: default: - return &UnmarshalTypeError{ - Value: "list", - Type: v.Type(), + // If the list is a singleton of the expected type, use that value. See + // https://github.com/anacrolix/torrent/issues/297. + l := reflect.New(reflect.SliceOf(v.Type())) + if err := d.parseList(l.Elem()); err != nil { + return err + } + if l.Elem().Len() != 1 { + return &UnmarshalTypeError{ + Value: "list", + Type: v.Type(), + } } + v.Set(l.Elem().Index(0)) + return nil + case reflect.Array, reflect.Slice: + // We can work with this. Normal case, fallthrough. } i := 0