diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2010-06-29 03:47:25 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2010-06-29 03:47:25 +0000 |
commit | 1a6c84d15ddbf6ae253cee85365107b81279b8a7 (patch) | |
tree | ef22106e8d70672165db893c03899827d62d8a8b /usr.sbin | |
parent | 27d18160c9396db3e3b2cb67151fb869a9a704f3 (diff) |
force the dns buffers to be aligned using a union, until the retarded
"misalign strings on the stack" bug in gcc4 is fixed (even when that
is fixed this idiom is safer and quite common)
ok jacekm
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/smtpd/dns.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/usr.sbin/smtpd/dns.c b/usr.sbin/smtpd/dns.c index c769f2ec498..677f40ff9e8 100644 --- a/usr.sbin/smtpd/dns.c +++ b/usr.sbin/smtpd/dns.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dns.c,v 1.21 2010/06/02 19:16:53 chl Exp $ */ +/* $OpenBSD: dns.c,v 1.22 2010/06/29 03:47:24 deraadt Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org> @@ -365,14 +365,17 @@ int get_mxlist(char *host, char *self, struct dns **res) { struct mx tab[MAX_MX_COUNT]; - unsigned char buf[PACKETSZ], *p, *endp; + unsigned char *p, *endp; int ntab, i, ret, type, n, maxprio, cname_ok = 3; int qdcount, ancount; - + union { + HEADER hdr; + char buf[PACKETSZ]; + } answer; again: ntab = 0; maxprio = 16384; - ret = res_query(host, C_IN, T_MX, buf, sizeof(buf)); + ret = res_query(host, C_IN, T_MX, answer.buf, sizeof(answer.buf)); if (ret < 0) { switch (h_errno) { case TRY_AGAIN: @@ -388,10 +391,10 @@ again: fatal("get_mxlist: res_query"); } - p = buf + HFIXEDSZ; - endp = buf + ret; - qdcount = ntohs(((HEADER *)buf)->qdcount); - ancount = ntohs(((HEADER *)buf)->ancount); + p = answer.buf + HFIXEDSZ; + endp = answer.buf + ret; + qdcount = ntohs(((HEADER *)answer.buf)->qdcount); + ancount = ntohs(((HEADER *)answer.buf)->ancount); if (qdcount < 1) return (EAI_FAIL); @@ -415,7 +418,7 @@ again: if (type == T_CNAME) { if (cname_ok-- == 0) return (EAI_FAIL); - ret = dn_expand(buf, endp, p, tab[0].host, + ret = dn_expand(answer.buf, endp, p, tab[0].host, sizeof(tab[0].host)); if (ret < 0) return (EAI_FAIL); @@ -431,7 +434,7 @@ again: GETSHORT(tab[ntab].prio, p); - ret = dn_expand(buf, endp, p, tab[ntab].host, + ret = dn_expand(answer.buf, endp, p, tab[ntab].host, sizeof(tab[ntab].host)); if (ret < 0) return (EAI_FAIL); |