From 3f89d3eb33bbd9d58a6ea861e6f505acfb556559 Mon Sep 17 00:00:00 2001 From: Andrew Gerrand Date: Mon, 12 Aug 2013 12:08:11 +1000 Subject: [PATCH] fix overflow in peer selection --- http.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/http.go b/http.go index db3ac59..e1fde7f 100644 --- a/http.go +++ b/http.go @@ -90,7 +90,11 @@ func (p *HTTPPool) PickPeer(key string) (ProtoGetter, bool) { if len(p.peers) == 0 { return nil, false } - if peer := p.peers[int(h)%len(p.peers)]; peer != p.self { + n := int(h) + if n < 0 { + n *= -1 + } + if peer := p.peers[n%len(p.peers)]; peer != p.self { // TODO: pre-build a slice of *httpGetter when Set() // is called to avoid these two allocations. return &httpGetter{p.Transport, peer + p.basePath}, true