]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
answer: add helper for randomizing RR of answers
authorLennart Poettering <lennart@poettering.net>
Thu, 5 Nov 2020 12:33:52 +0000 (13:33 +0100)
committerLennart Poettering <lennart@poettering.net>
Sun, 14 Feb 2021 14:42:56 +0000 (15:42 +0100)
src/resolve/resolved-dns-answer.c
src/resolve/resolved-dns-answer.h

index 051a2a0f252b59ed70c66cf4e54d4f2c593117e6..8591ed0f3b07c200e864c55f92053b65dd8fa521 100644 (file)
@@ -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]);
+        }
+}
index cc2cd93a33345242cd205d4a723463b7e2ff589c..f90ca6701946d27fbbb938d365fbd7edbd20ee4b 100644 (file)
@@ -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)                                   \