diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-04-23 15:17:21 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-04-23 15:17:21 +0000 |
commit | 2f1687b96b25af512b095c9ebfa283f63c13bb78 (patch) | |
tree | 6181e875e18f83e0fba9b805c7024e67d86253e0 /nis/nss_nis/nis-hosts.c | |
parent | a15ccd8f07d7afbbd7635f350e318ede84709ac6 (diff) | |
download | glibc-2f1687b96b25af512b095c9ebfa283f63c13bb78.tar.gz |
[BZ #4381]
* nss/nss_files/files-hosts.c (HOST_DB_LOOKUP): Ensure sufficient
alignment of buffer and tmp_buffer.
* nis/nss_nis/nis-hosts.c (internal_nis_gethostent_r,
internal_gethostbyname2_r, _nss_nis_gethostbyaddr_r): Ensure sufficient
alignment of buffer.
* resolv/nss_dns/dns-hosts.c (getanswer_r): Likewise. Handle buflen
bigger than INT_MAX.
* resolv/nss_dns/dns-network.c (getanswer_r): Likewise. Add errnop and
h_errnop arguments. Fail if buflen is too small.
(_nss_dns_getnetbyname_r, _nss_dns_getnetbyaddr_r): Adjust callers.
2007-04-23 Jakub Jelinek <jakub@redhat.com>
Diffstat (limited to 'nis/nss_nis/nis-hosts.c')
-rw-r--r-- | nis/nss_nis/nis-hosts.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c index 4fa0361681..bde0a3291f 100644 --- a/nis/nss_nis/nis-hosts.c +++ b/nis/nss_nis/nis-hosts.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2000, 2002, 2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1996-2000, 2002, 2003, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996. @@ -134,13 +134,17 @@ internal_nis_gethostent_r (struct hostent *host, char *buffer, if (__builtin_expect (yp_get_default_domain (&domain), 0)) return NSS_STATUS_UNAVAIL; + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct parser_data); + buffer += pad; + struct parser_data *data = (void *) buffer; - if (__builtin_expect (buflen < sizeof *data + 1, 0)) + if (__builtin_expect (buflen < sizeof *data + 1 + pad, 0)) { *errnop = ERANGE; *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } + buflen -= pad; /* Get the next entry until we found a correct one. */ const size_t linebuflen = buffer + buflen - data->linebuffer; @@ -234,6 +238,9 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host, char *buffer, size_t buflen, int *errnop, int *h_errnop, int flags) { + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct parser_data); + buffer += pad; + struct parser_data *data = (void *) buffer; if (name == NULL) @@ -246,12 +253,13 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host, if (yp_get_default_domain (&domain)) return NSS_STATUS_UNAVAIL; - if (buflen < sizeof *data + 1) + if (buflen < sizeof *data + 1 + pad) { *h_errnop = NETDB_INTERNAL; *errnop = ERANGE; return NSS_STATUS_TRYAGAIN; } + buflen -= pad; /* Convert name to lowercase. */ size_t namlen = strlen (name); @@ -352,13 +360,17 @@ _nss_nis_gethostbyaddr_r (const void *addr, socklen_t addrlen, int af, if (__builtin_expect (yp_get_default_domain (&domain), 0)) return NSS_STATUS_UNAVAIL; + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct parser_data); + buffer += pad; + struct parser_data *data = (void *) buffer; - if (__builtin_expect (buflen < sizeof *data + 1, 0)) + if (__builtin_expect (buflen < sizeof *data + 1 + pad, 0)) { *errnop = ERANGE; *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } + buflen -= pad; char *buf = inet_ntoa (*(const struct in_addr *) addr); |