diff options
Diffstat (limited to 'src/or/addressmap.c')
-rw-r--r-- | src/or/addressmap.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/or/addressmap.c b/src/or/addressmap.c index e1efbf4bfd..f4c31295a8 100644 --- a/src/or/addressmap.c +++ b/src/or/addressmap.c @@ -863,9 +863,13 @@ addressmap_get_virtual_address(int type) const virtual_addr_conf_t *conf = ipv6 ? &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4; - // This is an imperfect estimate of how many addresses are available, but - // that's ok. We also don't try every one. - uint32_t attempts = ipv6 ? UINT32_MAX : (1u << (32- conf->bits)); + /* Don't try more than 1000 times. This gives us P < 1e-9 for + * failing to get a good address so long as the address space is + * less than ~97.95% full. That's always going to be true under + * sensible circumstances for an IPv6 /10, and it's going to be + * true for an IPv4 /10 as long as we've handed out less than + * 4.08 million addresses. */ + uint32_t attempts = 1000; tor_addr_t addr; |