summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-08-10 23:10:08 +0200
committerLennart Poettering <lennart@poettering.net>2014-08-11 15:06:22 +0200
commit556a22945fcc88ca27ae7ecc46c9bb2727e37895 (patch)
tree9934da67283ed34c8f17fe3322c3ac808969455a
parent4d91eec42d3ba547c4e2578df0d6fd568075647b (diff)
resolved: when picking a new hostname make sure two hosts pick different ones
This way we can avoid always picking the same replacement hostnames when picking one.
-rw-r--r--src/resolve/resolved-manager.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
index 1d33c2ae19..988aa6e3b1 100644
--- a/src/resolve/resolved-manager.c
+++ b/src/resolve/resolved-manager.c
@@ -1646,7 +1646,7 @@ void manager_refresh_rrs(Manager *m) {
int manager_next_hostname(Manager *m) {
const char *p;
- uint64_t u;
+ uint64_t u, a;
char *h;
assert(m);
@@ -1664,7 +1664,15 @@ int manager_next_hostname(Manager *m) {
if (*p == 0 || safe_atou64(p, &u) < 0 || u <= 0)
u = 1;
- u++;
+ /* Add a random number to the old value. This way we can avoid
+ * that two hosts pick the same hostname, win on IPv4 and lose
+ * on IPv6 (or vice versa), and pick the same hostname
+ * replacement hostname, ad infinitum. We still want the
+ * numbers to go up monotonically, hence we just add a random
+ * value 1..10 */
+
+ random_bytes(&a, sizeof(a));
+ u += 1 + a % 10;
if (asprintf(&h, "%.*s%" PRIu64, (int) (p - m->hostname), m->hostname, u) < 0)
return -ENOMEM;