From 146540c1125597162bd89820d611f6531f5e5e4b Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 30 Jan 2019 13:45:17 +0400 Subject: [PATCH] fix another potential infinite loop if a.nNew == 0 -> pickFromOldBucket=true, but we don't have enough items (a.nOld > len(oldBucketToAddrsMap) false) --- p2p/pex/addrbook.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/p2p/pex/addrbook.go b/p2p/pex/addrbook.go index c724c3726..7e9d39bc0 100644 --- a/p2p/pex/addrbook.go +++ b/p2p/pex/addrbook.go @@ -413,12 +413,12 @@ ADDRS_LOOP: for selectionIndex < numAddresses { // determine whether to pick from an old bucket. - // if there's not enough old addresses to pick from, then we cant pick from old bucket. - pickFromOldBucket := int((float64(selectionIndex)/float64(numAddresses))*100) >= biasTowardsNewAddrs - pickFromOldBucket = (pickFromOldBucket && a.nOld > 0 && len(oldBucketToAddrsMap) < a.nOld) || a.nNew == 0 + biasedTowardsOldAddrs := int((float64(selectionIndex)/float64(numAddresses))*100) >= biasTowardsNewAddrs + // if there's not enough old addresses to pick from, then we can't pick from old bucket. + pickFromOldBucket := biasedTowardsOldAddrs && a.nOld > len(oldBucketToAddrsMap) // if there's not enough new addrs to pick from, just return early. - if !pickFromOldBucket && len(newBucketToAddrsMap) >= a.nNew { + if !pickFromOldBucket && a.nNew <= len(newBucketToAddrsMap) { return selection }