|
@@ -1177,6 +1177,18 @@ address_is_in_virtual_range(const char *address)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ * virtual address range if it wraps around.
|
|
|
+ */
|
|
|
+static INLINE void
|
|
|
+increment_virtual_addr(void)
|
|
|
+{
|
|
|
+ ++next_virtual_addr;
|
|
|
+ if (addr_mask_cmp_bits(next_virtual_addr, virtual_addr_network,
|
|
|
+ virtual_addr_netmask_bits))
|
|
|
+ next_virtual_addr = virtual_addr_network;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
* (one of RESOLVED_TYPE_{IPV4|HOSTNAME}) that has not yet been mapped,
|
|
|
* and that is very unlikely to be the address of any real host.
|
|
@@ -1206,7 +1218,7 @@ addressmap_get_virtual_address(int type)
|
|
|
|
|
|
while ((next_virtual_addr & 0xff) == 0 ||
|
|
|
(next_virtual_addr & 0xff) == 0xff) {
|
|
|
- ++next_virtual_addr;
|
|
|
+ increment_virtual_addr();
|
|
|
if (! --available) {
|
|
|
log_warn(LD_CONFIG, "Ran out of virtual addresses!");
|
|
|
return NULL;
|
|
@@ -1215,20 +1227,17 @@ addressmap_get_virtual_address(int type)
|
|
|
in.s_addr = htonl(next_virtual_addr);
|
|
|
tor_inet_ntoa(&in, buf, sizeof(buf));
|
|
|
if (!strmap_get(addressmap, buf)) {
|
|
|
- ++next_virtual_addr;
|
|
|
+ increment_virtual_addr();
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- ++next_virtual_addr;
|
|
|
+ increment_virtual_addr();
|
|
|
--available;
|
|
|
- log_info(LD_CONFIG, "%d addrs available", (int)available);
|
|
|
+
|
|
|
if (! available) {
|
|
|
log_warn(LD_CONFIG, "Ran out of virtual addresses!");
|
|
|
return NULL;
|
|
|
}
|
|
|
- if (addr_mask_cmp_bits(next_virtual_addr, virtual_addr_network,
|
|
|
- virtual_addr_netmask_bits))
|
|
|
- next_virtual_addr = virtual_addr_network;
|
|
|
}
|
|
|
return tor_strdup(buf);
|
|
|
} else {
|