From 5b2d8ffb5a1ebbd1e7c5359a9b924454f9dac031 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 5 Nov 2020 13:33:52 +0100 Subject: [PATCH] answer: add helper for randomizing RR of answers --- src/resolve/resolved-dns-answer.c | 21 +++++++++++++++++++++ src/resolve/resolved-dns-answer.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/src/resolve/resolved-dns-answer.c b/src/resolve/resolved-dns-answer.c index 051a2a0f25..8591ed0f3b 100644 --- a/src/resolve/resolved-dns-answer.c +++ b/src/resolve/resolved-dns-answer.c @@ -4,6 +4,7 @@ #include "alloc-util.h" #include "dns-domain.h" +#include "random-util.h" #include "resolved-dns-answer.h" #include "resolved-dns-dnssec.h" #include "string-util.h" @@ -898,3 +899,23 @@ int dns_answer_has_dname_for_cname(DnsAnswer *a, DnsResourceRecord *cname) { return 0; } + +void dns_answer_randomize(DnsAnswer *a) { + size_t n; + + /* Permutes the answer list randomly (Knuth shuffle) */ + + n = dns_answer_size(a); + if (n <= 1) + return; + + for (size_t i = 0; i < n; i++) { + size_t k; + + k = random_u64_range(n); + if (k == i) + continue; + + SWAP_TWO(a->items[i], a->items[k]); + } +} diff --git a/src/resolve/resolved-dns-answer.h b/src/resolve/resolved-dns-answer.h index cc2cd93a33..f90ca67019 100644 --- a/src/resolve/resolved-dns-answer.h +++ b/src/resolve/resolved-dns-answer.h @@ -80,6 +80,8 @@ static inline bool dns_answer_isempty(DnsAnswer *a) { void dns_answer_dump(DnsAnswer *answer, FILE *f); +void dns_answer_randomize(DnsAnswer *a); + DEFINE_TRIVIAL_CLEANUP_FUNC(DnsAnswer*, dns_answer_unref); #define _DNS_ANSWER_FOREACH(q, kk, a) \ -- 2.25.1