aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2019-05-24 22:14:04 +0200
committerFlorian Weimer <fweimer@redhat.com>2019-05-24 22:14:04 +0200
commit5c23c82195fc9e95ae34180250f64438f1e6fb0b (patch)
tree3f0d15867781144e230a9aa8cb3f69277fc18493
parentbee1f2c413ef0cf99d25f898fa0eb0d41fb71dc5 (diff)
downloadglibc-5c23c82195fc9e95ae34180250f64438f1e6fb0b.tar
glibc-5c23c82195fc9e95ae34180250f64438f1e6fb0b.tar.gz
glibc-5c23c82195fc9e95ae34180250f64438f1e6fb0b.tar.bz2
glibc-5c23c82195fc9e95ae34180250f64438f1e6fb0b.zip
nss_dns: Check for proper A/AAAA address alignment
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
-rw-r--r--ChangeLog5
-rw-r--r--resolv/nss_dns/dns-host.c15
2 files changed, 18 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 5f21fe463a..b46b581707 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2019-05-24 Florian Weimer <fweimer@redhat.com>
+
+ * resolv/nss_dns/dns-host.c (getanswer_r): Be more explicit about
+ struct in_addr/struct in6_addr alignment.
+
2019-05-23 Joseph Myers <joseph@codesourcery.com>
* 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 9c15f25f28..5af47fd10d 100644
--- a/resolv/nss_dns/dns-host.c
+++ b/resolv/nss_dns/dns-host.c
@@ -78,6 +78,7 @@
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
+#include <libc-pointer-arith.h>
#include "nsswitch.h"
#include <arpa/nameser.h>
@@ -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;