From: Matt Joiner Date: Sat, 14 Dec 2013 11:20:13 +0000 (+1100) Subject: Fix parsing of UDP announce response peers X-Git-Tag: v1.0.0~1781 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=8baadf0af35e39064dc275edff05f580352c4a5c;p=btrtrc.git Fix parsing of UDP announce response peers --- diff --git a/tracker/udp/udp_tracker.go b/tracker/udp/udp_tracker.go index 13800d13..1bb57b37 100644 --- a/tracker/udp/udp_tracker.go +++ b/tracker/udp/udp_tracker.go @@ -91,18 +91,25 @@ func (c *client) Announce(req *tracker.AnnounceRequest) (res tracker.AnnounceRes if err != nil { return } - var ( - h AnnounceResponseHeader - ps []Peer - ) - err = readBody(b, &h, &ps) + var h AnnounceResponseHeader + err = readBody(b, &h) if err != nil { return } res.Interval = h.Interval res.Leechers = h.Leechers res.Seeders = h.Seeders - for _, p := range ps { + for { + var p Peer + err = binary.Read(b, binary.BigEndian, &p) + switch err { + case nil: + case io.EOF: + err = nil + fallthrough + default: + return + } res.Peers = append(res.Peers, tracker.Peer{ IP: p.IP[:], Port: int(p.Port), @@ -131,7 +138,7 @@ func (c *client) write(h *RequestHeader, body interface{}) (err error) { return } -func (c *client) request(action Action, args interface{}) (responseBody []byte, err error) { +func (c *client) request(action Action, args interface{}) (responseBody *bytes.Reader, err error) { tid := newTransactionId() err = c.write(&RequestHeader{ ConnectionId: c.connectionId, @@ -172,13 +179,15 @@ func (c *client) request(action Action, args interface{}) (responseBody []byte, continue } c.contiguousTimeouts = 0 - responseBody = buf.Bytes() + if h.Action == Error { + err = errors.New(buf.String()) + } + responseBody = bytes.NewReader(buf.Bytes()) return } } -func readBody(b []byte, data ...interface{}) (err error) { - r := bytes.NewReader(b) +func readBody(r *bytes.Reader, data ...interface{}) (err error) { for _, datum := range data { err = binary.Read(r, binary.BigEndian, datum) if err != nil {