]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: dns: Make dns_query_id_seed unsigned
authorTim Duesterhus <tim@bastelstu.be>
Sat, 18 Jan 2020 01:04:12 +0000 (02:04 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 18 Jan 2020 05:45:54 +0000 (06:45 +0100)
Left shifting of large signed values and negative values is undefined.

In a test script clang's ubsan rightfully complains:

> runtime error: left shift of 1934242336581872173 by 13 places cannot be represented in type 'int64_t' (aka 'long')

This bug was introduced in the initial version of the DNS resolver
in 325137d603aa81bd24cbd8c99d816dd42291daa7. The fix must be backported
to HAProxy 1.6+.

src/dns.c

index bc68a81c064345d4b562535ab1ea043ab275914b..64bb0d15f1e3988ab0717ab52c6e33e3e6e0d14b 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -54,7 +54,7 @@
 struct list dns_resolvers  = LIST_HEAD_INIT(dns_resolvers);
 struct list dns_srvrq_list = LIST_HEAD_INIT(dns_srvrq_list);
 
-static THREAD_LOCAL int64_t dns_query_id_seed = 0; /* random seed */
+static THREAD_LOCAL uint64_t dns_query_id_seed = 0; /* random seed */
 
 DECLARE_STATIC_POOL(dns_answer_item_pool, "dns_answer_item", sizeof(struct dns_answer_item));
 DECLARE_STATIC_POOL(dns_resolution_pool,  "dns_resolution",  sizeof(struct dns_resolution));