From 556a22945fcc88ca27ae7ecc46c9bb2727e37895 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 10 Aug 2014 23:10:08 +0200 Subject: [PATCH] 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. --- src/resolve/resolved-manager.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 1d33c2ae1..988aa6e3b 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; -- 2.30.2