aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-08-28 16:24:10 +0000
committerUlrich Drepper <drepper@redhat.com>2006-08-28 16:24:10 +0000
commit6e31011191823a5d7dc65632f4be8a87fcf0779b (patch)
tree966cd58c385575fbe94afea770a16bffa90e169f
parent[BZ #2684] (diff)
downloadglibc-cvs/fedora-glibc-20060828T1903.tar.gz
glibc-cvs/fedora-glibc-20060828T1903.tar.bz2
glibc-cvs/fedora-glibc-20060828T1903.zip
* inet/getnameinfo.c (getnameinfo): For AF_INET, check errnocvs/fedora-glibc-20060828T1903
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.
-rw-r--r--ChangeLog11
-rw-r--r--inet/getnameinfo.c71
-rw-r--r--locale/programs/ld-collate.c5
-rw-r--r--locale/programs/ld-ctype.c2
4 files changed, 46 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog
index 3975e02de0..2f46b1e408 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 5057fd221a..b7b2b151b2 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 66638d50c8..e69ac85a95 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 a42b6f184d..b1a28b9280 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"),