summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2019-09-08 12:11:16 +0100
committerJeremy Harris <jgh146exb@wizmail.org>2019-09-08 12:11:16 +0100
commit927e32d4e26593314c5c287b3033ed550d648706 (patch)
treed867a074983075eb159f4d2636452a51e43293ab /src
parentc3aefacc72991f4960486052775ab47cd83c5fae (diff)
Fix unaligned access in DNS negative-caching
Diffstat (limited to 'src')
-rw-r--r--src/src/dns.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/src/dns.c b/src/src/dns.c
index ece6524d6..04cb046f4 100644
--- a/src/src/dns.c
+++ b/src/src/dns.c
@@ -618,6 +618,12 @@ Returns: the return code
/*XXX the derivation of this value needs explaining */
#define DNS_FAILTAG_MAX 290
+#define alignment \
+ (sizeof(void *) > sizeof(double) ? sizeof(void *) : sizeof(double))
+#define align(n) \
+ (((((intptr_t)n) + (alignment-1)) / alignment) * alignment)
+#define DNS_FAILNODE_SIZE \
+ align(sizeof(tree_node) + DNS_FAILTAG_MAX + sizeof(expiring_data))
static int
dns_fail_return(const uschar * name, int type, time_t expiry, int rc)
@@ -631,11 +637,10 @@ if ((previous = tree_search(tree_dns_fails, node_name)))
e = previous->data.ptr;
else
{
- new = store_get_perm(
- sizeof(tree_node) + DNS_FAILTAG_MAX + sizeof(expiring_data), is_tainted(name));
+ new = store_get_perm(DNS_FAILNODE_SIZE, is_tainted(name));
dns_fail_tag(new->name, name, type);
- e = (expiring_data *)((char *)new + sizeof(tree_node) + DNS_FAILTAG_MAX);
+ e = (expiring_data *) align((char *)new + sizeof(tree_node) + DNS_FAILTAG_MAX);
new->data.ptr = e;
(void)tree_insertnode(&tree_dns_fails, new);
}