On 2021-11-20 21:16 +01, Otto Moerbeek <o...@drijf.net> wrote: > On Sat, Nov 20, 2021 at 06:44:58PM +0100, Florian Obser wrote: > >> On 2021-11-20 18:41 +01, Florian Obser <flor...@openbsd.org> wrote: >> > On 2021-11-20 18:19 +01, Florian Obser <flor...@openbsd.org> wrote: >> > >> >> +/* >> >> + * Clear AD flag in the answer. >> >> + */ >> >> +static void >> >> +clear_ad(struct asr_result *ar) >> >> +{ >> >> + struct asr_dns_header *h; >> >> + uint16_t flags; >> >> + >> >> + h = (struct asr_dns_header *)ar->ar_data; >> >> + flags = ntohs(h->flags); >> >> + flags &= ~(AD_MASK); >> >> + h->flags = htons(flags); >> >> +} >> >> + >> > >> > btw. is it possible that this is not alligned correctly on sparc64? >> > >> > should be do something like (not even compile tested) >> > >> > static void >> > clear_ad(struct asr_result *ar) >> > { >> > struct asr_dns_header h; >> > >> > memmove(&h, ar->ar_data, sizeof(h)); >> > h.flags = ntohs(h.flags); >> > h.flags &= ~(AD_MASK); >> > h.flags = htons(h.flags); >> > memmove(ar->ar_data, &h, sizeof(h)); >> > } >> > >> >> memcpy obviously, I was distracted by the copious amount of memmove in >> asr code... > > It is not needed to copy the "whole" header just to change the flags. > You could just copy out, modify and copy back the flags field only. > > otoh, it's just 12 bytes, so no big deal.
right. So I have tried my patch (without the memcpy dance) on sparc64 over udp and tcp and I have also tracked this down in the code. This should be fine as is. ar->ar_data comes directly out of malloc (reallocarray) in ensure_ibuf() and the struct is defined thusly: struct asr_dns_header { uint16_t id; uint16_t flags; uint16_t qdcount; uint16_t ancount; uint16_t nscount; uint16_t arcount; }; > > -Otto > -- I'm not entirely sure you are real.