diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | inet/getnameinfo.c | 71 | ||||
-rw-r--r-- | locale/programs/ld-collate.c | 5 | ||||
-rw-r--r-- | locale/programs/ld-ctype.c | 2 |
4 files changed, 46 insertions, 43 deletions
@@ -1,3 +1,14 @@ +2006-08-28 Jakub Jelinek <jakub@redhat.com> + + * inet/getnameinfo.c (getnameinfo): For AF_INET, check errno + only if herrno is NETDB_INTERNAL. Handle errors other than + ERANGE outside of the loops, handle TRY_AGAIN. + + * locale/programs/ld-ctype.c (translit_flatten): Issue error + if other's ctype category was missing. + * locale/programs/ld-collate.c (collate_read): Return if + copy_locale's collate category is missing. + 2006-08-27 Ulrich Drepper <drepper@redhat.com> [BZ #2684] diff --git a/inet/getnameinfo.c b/inet/getnameinfo.c index 5057fd2..b7b2b15 100644 --- a/inet/getnameinfo.c +++ b/inet/getnameinfo.c @@ -203,48 +203,40 @@ getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host, if (!(flags & NI_NUMERICHOST)) { struct hostent *h = NULL; + if (sa->sa_family == AF_INET6) + { + while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in6 *) sa)->sin6_addr), + sizeof(struct in6_addr), + AF_INET6, &th, tmpbuf, tmpbuflen, + &h, &herrno)) + if (herrno == NETDB_INTERNAL && errno == ERANGE) + tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen); + else + break; + } + else + { + while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in *)sa)->sin_addr), + sizeof(struct in_addr), AF_INET, + &th, tmpbuf, tmpbuflen, + &h, &herrno)) + if (herrno == NETDB_INTERNAL && errno == ERANGE) + tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen); + else + break; + } + if (h == NULL) { - if (sa->sa_family == AF_INET6) + if (herrno == NETDB_INTERNAL) { - while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in6 *) sa)->sin6_addr), - sizeof(struct in6_addr), - AF_INET6, &th, tmpbuf, tmpbuflen, - &h, &herrno)) - { - if (herrno == NETDB_INTERNAL) - { - if (errno == ERANGE) - tmpbuf = extend_alloca (tmpbuf, tmpbuflen, - 2 * tmpbuflen); - else - { - __set_h_errno (herrno); - __set_errno (serrno); - return EAI_SYSTEM; - } - } - else - { - break; - } - } + __set_h_errno (herrno); + return EAI_SYSTEM; } - else + if (herrno == TRY_AGAIN) { - while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in *)sa)->sin_addr), - sizeof(struct in_addr), AF_INET, - &th, tmpbuf, tmpbuflen, - &h, &herrno)) - { - if (errno == ERANGE) - tmpbuf = extend_alloca (tmpbuf, tmpbuflen, - 2 * tmpbuflen); - else - { - break; - } - } + __set_h_errno (herrno); + return EAI_AGAIN; } } @@ -361,10 +353,7 @@ getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host, (const void *) &(((const struct sockaddr_in *) sa)->sin_addr), host, hostlen); if (c == NULL) - { - __set_errno (serrno); - return EAI_SYSTEM; - } + return EAI_SYSTEM; } ok = 1; } diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index 66638d5..e69ac85 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2002, 2003, 2005 Free Software Foundation, Inc. +/* Copyright (C) 1995-2002, 2003, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -2671,6 +2671,9 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, if (locfile_read (copy_locale, charmap) != 0) goto skip_category; } + + if (copy_locale->categories[LC_COLLATE].collate == NULL) + return; } lr_ignore_rest (ldfile, 1); diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index a42b6f1..b1a28b9 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -3769,7 +3769,7 @@ translit_flatten (struct locale_ctype_t *ctype, other = find_locale (LC_CTYPE, copy_locale, copy_repertoire, charmap); - if (other == NULL) + if (other == NULL || other->categories[LC_CTYPE].ctype == NULL) { WITH_CUR_LOCALE (error (0, 0, _("\ %s: transliteration data from locale `%s' not available"), |