From 48f5dffe590d6e998f9ac918b2205f51a87f8515 Mon Sep 17 00:00:00 2001 From: paladz <453256728@qq.com> Date: Wed, 9 May 2018 20:15:47 +0800 Subject: [PATCH] fix for nil pointer bug --- p2p/pex_reactor.go | 26 ++++++++++++++------------ p2p/public_ip.go | 22 +++++++--------------- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/p2p/pex_reactor.go b/p2p/pex_reactor.go index 79f80202..86b11b80 100644 --- a/p2p/pex_reactor.go +++ b/p2p/pex_reactor.go @@ -58,7 +58,6 @@ type PEXReactor struct { // tracks message count by peer, so we can prevent abuse msgCountByPeer *cmn.CMap maxMsgCountByPeer uint16 - wg sync.WaitGroup } // NewPEXReactor creates new PEX reactor. @@ -330,19 +329,13 @@ func (r *PEXReactor) ensurePeers() { } toDial[picked.IP.String()] = picked } - // Dial picked addresses + + var wg *sync.WaitGroup for _, item := range toDial { - r.wg.Add(1) - go func(picked *NetAddress) { - if _, err := r.Switch.DialPeerWithAddress(picked, false); err != nil { - r.book.MarkAttempt(picked) - } else { - r.book.MarkGood(picked) - } - r.wg.Done() - }(item) + wg.Add(1) + go r.dialPeerWorker(item, wg) } - r.wg.Wait() + wg.Wait() // If we need more addresses, pick a random peer and ask for more. if r.book.NeedMoreAddrs() { @@ -357,6 +350,15 @@ func (r *PEXReactor) ensurePeers() { } } +func (r *PEXReactor) dialPeerWorker(a *NetAddress, wg *sync.WaitGroup) { + if _, err := r.Switch.DialPeerWithAddress(a, false); err != nil { + r.book.MarkAttempt(a) + } else { + r.book.MarkGood(a) + } + wg.Done() +} + func (r *PEXReactor) flushMsgCountByPeer() { ticker := time.NewTicker(msgCountByPeerFlushInterval) diff --git a/p2p/public_ip.go b/p2p/public_ip.go index 441f7b60..6f6bc749 100644 --- a/p2p/public_ip.go +++ b/p2p/public_ip.go @@ -4,13 +4,13 @@ import ( "errors" "fmt" "io/ioutil" + "net" "net/http" "strings" "time" - "regexp" ) -var defaultServices = []string{ +var defaultServices = []string{ "http://members.3322.org/dyndns/getip", "http://ifconfig.me/", "http://icanhazip.com/", @@ -24,8 +24,8 @@ var defaultServices = []string{ type IpResult struct { Success bool - Ip string - Error error + Ip string + Error error } var timeout time.Duration @@ -45,8 +45,8 @@ func GetIP(services []string, to time.Duration) *IpResult { for k := range services { go ipAddress(services[k], done) } - for ;; { - select{ + for { + select { case result := <-done: if result.Success { return result @@ -81,7 +81,7 @@ func ipAddress(service string, done chan<- *IpResult) { address, err := ioutil.ReadAll(resp.Body) ip := fmt.Sprintf("%s", strings.TrimSpace(string(address))) - if err== nil && checkIp(ip) { + if err == nil && net.ParseIP(ip) != nil { sendResult(&IpResult{true, ip, nil}, done) return } @@ -97,11 +97,3 @@ func sendResult(result *IpResult, done chan<- *IpResult) { return } } - -func checkIp(ip string) bool { - match, _ := regexp.MatchString(`^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`, ip) - if match { - return true - } - return false -} -- 2.11.0