mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-01 10:06:57 +03:00
Fix a few error cases in *name4_r lookup handling.
This commit is contained in:
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
2009-12-10 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
[BZ #11000]
|
||||||
|
* nis/nss_nis/nis-hosts.c (_nss_nis_gethostbyname4_r): Always set
|
||||||
|
*herrnop before returning.
|
||||||
|
* nis/nss_nisplus/nisplus-hosts.c (internal_gethostbyname2_r):
|
||||||
|
Likewise.
|
||||||
|
* nss/nss_files/files-hosts.c (_nss_files_gethostbyname4_r): Handle
|
||||||
|
TRYAGAIN errors separately.
|
||||||
|
* sysdeps/posix/getaddrinfo.c (gaih_inet): Fix error handling of
|
||||||
|
*name4_r after functions.
|
||||||
|
|
||||||
2009-12-09 Ulrich Drepper <drepper@redhat.com>
|
2009-12-09 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
[BZ #11046]
|
[BZ #11046]
|
||||||
|
@ -70,20 +70,20 @@ LINE_PARSER
|
|||||||
{
|
{
|
||||||
assert ((flags & AI_V4MAPPED) == 0 || af != AF_UNSPEC);
|
assert ((flags & AI_V4MAPPED) == 0 || af != AF_UNSPEC);
|
||||||
if (flags & AI_V4MAPPED)
|
if (flags & AI_V4MAPPED)
|
||||||
{
|
{
|
||||||
map_v4v6_address ((char *) entdata->host_addr,
|
map_v4v6_address ((char *) entdata->host_addr,
|
||||||
(char *) entdata->host_addr);
|
(char *) entdata->host_addr);
|
||||||
result->h_addrtype = AF_INET6;
|
result->h_addrtype = AF_INET6;
|
||||||
result->h_length = IN6ADDRSZ;
|
result->h_length = IN6ADDRSZ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result->h_addrtype = AF_INET;
|
result->h_addrtype = AF_INET;
|
||||||
result->h_length = INADDRSZ;
|
result->h_length = INADDRSZ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (af != AF_INET
|
else if (af != AF_INET
|
||||||
&& inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
|
&& inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
|
||||||
{
|
{
|
||||||
result->h_addrtype = AF_INET6;
|
result->h_addrtype = AF_INET6;
|
||||||
result->h_length = IN6ADDRSZ;
|
result->h_length = IN6ADDRSZ;
|
||||||
@ -164,14 +164,14 @@ internal_nis_gethostent_r (struct hostent *host, char *buffer,
|
|||||||
int keylen;
|
int keylen;
|
||||||
int yperr;
|
int yperr;
|
||||||
if (new_start)
|
if (new_start)
|
||||||
yperr = yp_first (domain, "hosts.byname", &outkey, &keylen, &result,
|
yperr = yp_first (domain, "hosts.byname", &outkey, &keylen, &result,
|
||||||
&len);
|
&len);
|
||||||
else
|
else
|
||||||
yperr = yp_next (domain, "hosts.byname", oldkey, oldkeylen, &outkey,
|
yperr = yp_next (domain, "hosts.byname", oldkey, oldkeylen, &outkey,
|
||||||
&keylen, &result, &len);
|
&keylen, &result, &len);
|
||||||
|
|
||||||
if (__builtin_expect (yperr != YPERR_SUCCESS, 0))
|
if (__builtin_expect (yperr != YPERR_SUCCESS, 0))
|
||||||
{
|
{
|
||||||
enum nss_status retval = yperr2nss (yperr);
|
enum nss_status retval = yperr2nss (yperr);
|
||||||
|
|
||||||
switch (retval)
|
switch (retval)
|
||||||
@ -191,12 +191,12 @@ internal_nis_gethostent_r (struct hostent *host, char *buffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (__builtin_expect ((size_t) (len + 1) > linebuflen, 0))
|
if (__builtin_expect ((size_t) (len + 1) > linebuflen, 0))
|
||||||
{
|
{
|
||||||
free (result);
|
free (result);
|
||||||
*h_errnop = NETDB_INTERNAL;
|
*h_errnop = NETDB_INTERNAL;
|
||||||
*errnop = ERANGE;
|
*errnop = ERANGE;
|
||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *p = strncpy (data->linebuffer, result, len);
|
char *p = strncpy (data->linebuffer, result, len);
|
||||||
data->linebuffer[len] = '\0';
|
data->linebuffer[len] = '\0';
|
||||||
@ -233,7 +233,7 @@ _nss_nis_gethostent_r (struct hostent *host, char *buffer, size_t buflen,
|
|||||||
__libc_lock_lock (lock);
|
__libc_lock_lock (lock);
|
||||||
|
|
||||||
status = internal_nis_gethostent_r (host, buffer, buflen, errnop, h_errnop,
|
status = internal_nis_gethostent_r (host, buffer, buflen, errnop, h_errnop,
|
||||||
((_res.options & RES_USE_INET6) ? AF_INET6 : AF_INET),
|
((_res.options & RES_USE_INET6) ? AF_INET6 : AF_INET),
|
||||||
((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0 ));
|
((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0 ));
|
||||||
|
|
||||||
__libc_lock_unlock (lock);
|
__libc_lock_unlock (lock);
|
||||||
@ -346,7 +346,7 @@ _nss_nis_gethostbyname2_r (const char *name, int af, struct hostent *host,
|
|||||||
|
|
||||||
return internal_gethostbyname2_r (name, af, host, buffer, buflen, errnop,
|
return internal_gethostbyname2_r (name, af, host, buffer, buflen, errnop,
|
||||||
h_errnop,
|
h_errnop,
|
||||||
((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0));
|
((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -456,7 +456,10 @@ _nss_nis_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
|
|||||||
{
|
{
|
||||||
char *domain;
|
char *domain;
|
||||||
if (yp_get_default_domain (&domain))
|
if (yp_get_default_domain (&domain))
|
||||||
return NSS_STATUS_UNAVAIL;
|
{
|
||||||
|
*herrnop = NO_DATA;
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Convert name to lowercase. */
|
/* Convert name to lowercase. */
|
||||||
size_t namlen = strlen (name);
|
size_t namlen = strlen (name);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1997-2003, 2005, 2006, 2008 Free Software Foundation, Inc.
|
/* Copyright (C) 1997-2003, 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997.
|
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997.
|
||||||
|
|
||||||
@ -38,10 +38,10 @@ static nis_name tablename_val;
|
|||||||
static u_long tablename_len;
|
static u_long tablename_len;
|
||||||
|
|
||||||
#define NISENTRYVAL(idx, col, res) \
|
#define NISENTRYVAL(idx, col, res) \
|
||||||
(NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_val)
|
(NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_val)
|
||||||
|
|
||||||
#define NISENTRYLEN(idx, col, res) \
|
#define NISENTRYLEN(idx, col, res) \
|
||||||
(NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_len)
|
(NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_len)
|
||||||
|
|
||||||
/* Get implementation for some internal functions. */
|
/* Get implementation for some internal functions. */
|
||||||
#include <resolv/mapv4v6addr.h>
|
#include <resolv/mapv4v6addr.h>
|
||||||
@ -287,15 +287,15 @@ internal_nisplus_gethostent_r (struct hostent *host, char *buffer,
|
|||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
}
|
}
|
||||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
enum nss_status retval = niserr2nss (result->status);
|
enum nss_status retval = niserr2nss (result->status);
|
||||||
if (retval == NSS_STATUS_TRYAGAIN)
|
if (retval == NSS_STATUS_TRYAGAIN)
|
||||||
{
|
{
|
||||||
*herrnop = NETDB_INTERNAL;
|
*herrnop = NETDB_INTERNAL;
|
||||||
*errnop = errno;
|
*errnop = errno;
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -308,18 +308,18 @@ internal_nisplus_gethostent_r (struct hostent *host, char *buffer,
|
|||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
}
|
}
|
||||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
enum nss_status retval= niserr2nss (result->status);
|
enum nss_status retval= niserr2nss (result->status);
|
||||||
|
|
||||||
nis_freeresult (result);
|
nis_freeresult (result);
|
||||||
result = saved_res;
|
result = saved_res;
|
||||||
if (retval == NSS_STATUS_TRYAGAIN)
|
if (retval == NSS_STATUS_TRYAGAIN)
|
||||||
{
|
{
|
||||||
*herrnop = NETDB_INTERNAL;
|
*herrnop = NETDB_INTERNAL;
|
||||||
*errnop = errno;
|
*errnop = errno;
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_res.options & RES_USE_INET6)
|
if (_res.options & RES_USE_INET6)
|
||||||
@ -330,13 +330,13 @@ internal_nisplus_gethostent_r (struct hostent *host, char *buffer,
|
|||||||
buflen, errnop, 0);
|
buflen, errnop, 0);
|
||||||
|
|
||||||
if (parse_res == -1)
|
if (parse_res == -1)
|
||||||
{
|
{
|
||||||
nis_freeresult (result);
|
nis_freeresult (result);
|
||||||
result = saved_res;
|
result = saved_res;
|
||||||
*herrnop = NETDB_INTERNAL;
|
*herrnop = NETDB_INTERNAL;
|
||||||
*errnop = ERANGE;
|
*errnop = ERANGE;
|
||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
}
|
}
|
||||||
if (saved_res != NULL)
|
if (saved_res != NULL)
|
||||||
nis_freeresult (saved_res);
|
nis_freeresult (saved_res);
|
||||||
|
|
||||||
@ -435,6 +435,7 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
|
|||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
{
|
{
|
||||||
*errnop = ENOMEM;
|
*errnop = ENOMEM;
|
||||||
|
*herrnop = NETDB_INTERNAL;
|
||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -444,10 +445,13 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
|
|||||||
if (retval == NSS_STATUS_TRYAGAIN)
|
if (retval == NSS_STATUS_TRYAGAIN)
|
||||||
{
|
{
|
||||||
*errnop = errno;
|
*errnop = errno;
|
||||||
*herrnop = NETDB_INTERNAL;
|
*herrnop = TRY_AGAIN;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
__set_errno (olderr);
|
{
|
||||||
|
__set_errno (olderr);
|
||||||
|
*herrnop = NETDB_INTERNAL;
|
||||||
|
}
|
||||||
nis_freeresult (result);
|
nis_freeresult (result);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
@ -502,7 +506,7 @@ _nss_nisplus_gethostbyname_r (const char *name, struct hostent *host,
|
|||||||
buflen, errnop, h_errnop,
|
buflen, errnop, h_errnop,
|
||||||
AI_V4MAPPED);
|
AI_V4MAPPED);
|
||||||
if (status == NSS_STATUS_SUCCESS)
|
if (status == NSS_STATUS_SUCCESS)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
return internal_gethostbyname2_r (name, AF_INET, host, buffer,
|
return internal_gethostbyname2_r (name, AF_INET, host, buffer,
|
||||||
|
@ -423,6 +423,11 @@ _nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
|
|||||||
if (! keep_stream)
|
if (! keep_stream)
|
||||||
internal_endent ();
|
internal_endent ();
|
||||||
}
|
}
|
||||||
|
else if (status == NSS_STATUS_TRYAGAIN)
|
||||||
|
{
|
||||||
|
*errnop = errno;
|
||||||
|
*herrnop = TRY_AGAIN;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*errnop = errno;
|
*errnop = errno;
|
||||||
|
@ -719,13 +719,8 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|||||||
if (status != NSS_STATUS_TRYAGAIN
|
if (status != NSS_STATUS_TRYAGAIN
|
||||||
|| rc != ERANGE || herrno != NETDB_INTERNAL)
|
|| rc != ERANGE || herrno != NETDB_INTERNAL)
|
||||||
{
|
{
|
||||||
if (herrno == NETDB_INTERNAL)
|
if (status == NSS_STATUS_TRYAGAIN
|
||||||
{
|
&& herrno == TRY_AGAIN)
|
||||||
__set_h_errno (herrno);
|
|
||||||
_res.options = old_res_options;
|
|
||||||
return -EAI_SYSTEM;
|
|
||||||
}
|
|
||||||
if (herrno == TRY_AGAIN)
|
|
||||||
no_data = EAI_AGAIN;
|
no_data = EAI_AGAIN;
|
||||||
else
|
else
|
||||||
no_data = herrno == NO_DATA;
|
no_data = herrno == NO_DATA;
|
||||||
|
Reference in New Issue
Block a user