From 5c23c82195fc9e95ae34180250f64438f1e6fb0b Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Fri, 24 May 2019 22:14:04 +0200 Subject: [PATCH] nss_dns: Check for proper A/AAAA address alignment Reviewed-by: Carlos O'Donell --- ChangeLog | 5 +++++ resolv/nss_dns/dns-host.c | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5f21fe4..b46b581 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2019-05-24 Florian Weimer + + * resolv/nss_dns/dns-host.c (getanswer_r): Be more explicit about + struct in_addr/struct in6_addr alignment. + 2019-05-23 Joseph Myers * sysdeps/unix/sysv/linux/bits/fcntl-linux.h [__USE_GNU] diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 9c15f25..5af47fd 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -78,6 +78,7 @@ #include #include #include +#include #include "nsswitch.h" #include @@ -947,8 +948,18 @@ getanswer_r (struct resolv_context *ctx, linebuflen -= nn; } - linebuflen -= sizeof (align) - ((u_long) bp % sizeof (align)); - bp += sizeof (align) - ((u_long) bp % sizeof (align)); + /* Provide sufficient alignment for both address + families. */ + enum { align = 4 }; + _Static_assert ((align % __alignof__ (struct in_addr)) == 0, + "struct in_addr alignment"); + _Static_assert ((align % __alignof__ (struct in6_addr)) == 0, + "struct in6_addr alignment"); + { + char *new_bp = PTR_ALIGN_UP (bp, align); + linebuflen -= new_bp - bp; + bp = new_bp; + } if (__glibc_unlikely (n > linebuflen)) goto too_small; -- 2.7.4