From df9293cb169bf848be529381ca43680aa192421e Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 8 Jan 2009 00:03:29 +0000 Subject: [PATCH] * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyaddr2_r): Check and adjust the buffer alignment. --- ChangeLog | 5 +++++ nptl/allocatestack.c | 20 ++++++++++---------- resolv/nss_dns/dns-host.c | 15 ++++++++++++++- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ebe5bb..25953f28 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-12-31 Rafael Avila de Espindola + + * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyaddr2_r): Check and + adjust the buffer alignment. + 2009-01-07 Samuel Thibault * sysdeps/mach/hurd/Makefile (sysdep_headers) [subdir=socket]: diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index d275181..ce05770 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -115,7 +115,7 @@ static LIST_HEAD (stack_used); /* We need to record what list operations we are going to do so that, in case of an asynchronous interruption due to a fork() call, we can correct for the work. */ -static uintptr_t *in_flight_stack; +static uintptr_t in_flight_stack; /* List of the threads with user provided stacks in use. No need to initialize this, since it's done in __pthread_initialize_minimal. */ @@ -815,10 +815,10 @@ __reclaim_stacks (void) we have to be aware that we might have interrupted a list operation. */ - if (in_flight_stack != NULL) + if (in_flight_stack != 0) { bool add_p = in_flight_stack & 1; - in_flight_stack = (list_t *) (in_flight_stack & ~1l); + list_t *elem = (list_t *) (in_flight_stack & ~UINTMAX_C (1)); if (add_p) { @@ -828,11 +828,11 @@ __reclaim_stacks (void) { if (l->next->prev != l) { - assert (l->next->prev == in_flight_stack); + assert (l->next->prev == elem); - in_flight_stack->next = l->next; - in_flight_stack->prev = l; - l->next = in_flight_stack; + elem->next = l->next; + elem->prev = l; + l->next = elem; return 1; } @@ -846,11 +846,11 @@ __reclaim_stacks (void) else { /* We can simply always replay the delete operation. */ - in_flight_stack->next->prev = in_flight_stack->prev; - in_flight_stack->prev->next = in_flight_stack->next; + elem->next->prev = elem->prev; + elem->prev->next = elem->next; } - in_flight_stack = NULL; + in_flight_stack = 0; } /* Mark all stacks except the still running one as free. */ diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index b8e513a..a9462ae 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2004, 2007, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1996-2004, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Extended from original form by Ulrich Drepper , 1996. @@ -376,6 +376,19 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af, int n, status; int olderr = errno; + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct host_data); + buffer += pad; + buflen = buflen > pad ? buflen - pad : 0; + + if (__builtin_expect (buflen < sizeof (struct host_data), 0)) + { + *errnop = ERANGE; + *h_errnop = NETDB_INTERNAL; + return NSS_STATUS_TRYAGAIN; + } + + host_data = (struct host_data *) buffer; + if (__res_maybe_init (&_res, 0) == -1) return NSS_STATUS_UNAVAIL; -- 2.7.4