172 lines
5.8 KiB
Diff
172 lines
5.8 KiB
Diff
From 701f7873da013fb19d9120317322cd78333e63c2 Mon Sep 17 00:00:00 2001
|
|
From: Florian Weimer <fweimer@redhat.com>
|
|
Date: Fri, 1 Sep 2017 08:57:07 +0200
|
|
Subject: [PATCH 23] getaddrinfo: Use &h_errno has the h_errno pointer
|
|
|
|
This simplifies the code because it is not necessary to propagate the
|
|
temporary h_errno value to the thread-local variable. It also increases
|
|
compatibility with NSS modules which update only one of the two places.
|
|
|
|
(cherry picked from commit 53250a21b81474ef4e78090a4a9a63d8471e1091)
|
|
---
|
|
ChangeLog | 6 ++++++
|
|
sysdeps/posix/getaddrinfo.c | 46 ++++++++++++++++++---------------------------
|
|
2 files changed, 24 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/ChangeLog b/ChangeLog
|
|
index 04304bb929..d53c8fe083 100644
|
|
--- a/ChangeLog
|
|
+++ b/ChangeLog
|
|
@@ -1,5 +1,11 @@
|
|
2017-09-01 Florian Weimer <fweimer@redhat.com>
|
|
|
|
+ * sysdeps/posix/getaddrinfo.c (gethosts): Use h_errno directly.
|
|
+ (getcanonname): Likewise.
|
|
+ (gaih_inet): Likewise.
|
|
+
|
|
+2017-09-01 Florian Weimer <fweimer@redhat.com>
|
|
+
|
|
* sysdeps/posix/getaddrinfo.c (gethosts): Use errno directly.
|
|
(getcanonname): Likewise.
|
|
(gaih_inet): Likewise.
|
|
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
|
|
index 1a16820b7e..076e1fa62b 100644
|
|
--- a/sysdeps/posix/getaddrinfo.c
|
|
+++ b/sysdeps/posix/getaddrinfo.c
|
|
@@ -241,7 +241,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
|
|
|
|
#define gethosts(_family, _type) \
|
|
{ \
|
|
- int herrno; \
|
|
struct hostent th; \
|
|
struct hostent *h; \
|
|
char *localcanon = NULL; \
|
|
@@ -249,8 +248,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
|
|
while (1) { \
|
|
status = DL_CALL_FCT (fct, (name, _family, &th, \
|
|
tmpbuf->data, tmpbuf->length, \
|
|
- &errno, &herrno, NULL, &localcanon)); \
|
|
- if (errno != ERANGE || herrno != NETDB_INTERNAL) \
|
|
+ &errno, &h_errno, NULL, &localcanon)); \
|
|
+ if (errno != ERANGE || h_errno != NETDB_INTERNAL) \
|
|
break; \
|
|
if (!scratch_buffer_grow (tmpbuf)) \
|
|
{ \
|
|
@@ -266,18 +265,17 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
|
|
h = NULL; \
|
|
if (errno != 0) \
|
|
{ \
|
|
- if (herrno == NETDB_INTERNAL) \
|
|
+ if (h_errno == NETDB_INTERNAL) \
|
|
{ \
|
|
- __set_h_errno (herrno); \
|
|
__resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \
|
|
__resolv_context_put (res_ctx); \
|
|
result = -EAI_SYSTEM; \
|
|
goto free_and_return; \
|
|
} \
|
|
- if (herrno == TRY_AGAIN) \
|
|
+ if (h_errno == TRY_AGAIN) \
|
|
no_data = EAI_AGAIN; \
|
|
else \
|
|
- no_data = herrno == NO_DATA; \
|
|
+ no_data = h_errno == NO_DATA; \
|
|
} \
|
|
else if (h != NULL) \
|
|
{ \
|
|
@@ -333,9 +331,8 @@ getcanonname (service_user *nip, struct gaih_addrtuple *at, const char *name)
|
|
if (cfct != NULL)
|
|
{
|
|
char buf[256];
|
|
- int herrno;
|
|
if (DL_CALL_FCT (cfct, (at->name ?: name, buf, sizeof (buf),
|
|
- &s, &errno, &herrno)) != NSS_STATUS_SUCCESS)
|
|
+ &s, &errno, &h_errno)) != NSS_STATUS_SUCCESS)
|
|
/* If the canonical name cannot be determined, use the passed
|
|
string. */
|
|
s = (char *) name;
|
|
@@ -594,14 +591,13 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
int rc;
|
|
struct hostent th;
|
|
struct hostent *h;
|
|
- int herrno;
|
|
|
|
while (1)
|
|
{
|
|
rc = __gethostbyname2_r (name, AF_INET, &th,
|
|
tmpbuf->data, tmpbuf->length,
|
|
- &h, &herrno);
|
|
- if (rc != ERANGE || herrno != NETDB_INTERNAL)
|
|
+ &h, &h_errno);
|
|
+ if (rc != ERANGE || h_errno != NETDB_INTERNAL)
|
|
break;
|
|
if (!scratch_buffer_grow (tmpbuf))
|
|
{
|
|
@@ -626,12 +622,9 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
}
|
|
else
|
|
{
|
|
- if (herrno == NETDB_INTERNAL)
|
|
- {
|
|
- __set_h_errno (herrno);
|
|
- result = -EAI_SYSTEM;
|
|
- }
|
|
- else if (herrno == TRY_AGAIN)
|
|
+ if (h_errno == NETDB_INTERNAL)
|
|
+ result = -EAI_SYSTEM;
|
|
+ else if (h_errno == TRY_AGAIN)
|
|
result = -EAI_AGAIN;
|
|
else
|
|
/* We made requests but they turned out no data.
|
|
@@ -654,8 +647,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
{
|
|
/* Try to use nscd. */
|
|
struct nscd_ai_result *air = NULL;
|
|
- int herrno;
|
|
- int err = __nscd_getai (name, &air, &herrno);
|
|
+ int err = __nscd_getai (name, &air, &h_errno);
|
|
if (air != NULL)
|
|
{
|
|
/* Transform into gaih_addrtuple list. */
|
|
@@ -746,9 +738,9 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
goto free_and_return;
|
|
else if (__nss_not_use_nscd_hosts == 0)
|
|
{
|
|
- if (herrno == NETDB_INTERNAL && errno == ENOMEM)
|
|
+ if (h_errno == NETDB_INTERNAL && errno == ENOMEM)
|
|
result = -EAI_MEMORY;
|
|
- else if (herrno == TRY_AGAIN)
|
|
+ else if (h_errno == TRY_AGAIN)
|
|
result = -EAI_AGAIN;
|
|
else
|
|
result = -EAI_SYSTEM;
|
|
@@ -787,23 +779,21 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
|
|
if (fct4 != NULL)
|
|
{
|
|
- int herrno;
|
|
-
|
|
while (1)
|
|
{
|
|
status = DL_CALL_FCT (fct4, (name, pat,
|
|
tmpbuf->data, tmpbuf->length,
|
|
- &errno, &herrno,
|
|
+ &errno, &h_errno,
|
|
NULL));
|
|
if (status == NSS_STATUS_SUCCESS)
|
|
break;
|
|
if (status != NSS_STATUS_TRYAGAIN
|
|
- || errno != ERANGE || herrno != NETDB_INTERNAL)
|
|
+ || errno != ERANGE || h_errno != NETDB_INTERNAL)
|
|
{
|
|
- if (herrno == TRY_AGAIN)
|
|
+ if (h_errno == TRY_AGAIN)
|
|
no_data = EAI_AGAIN;
|
|
else
|
|
- no_data = herrno == NO_DATA;
|
|
+ no_data = h_errno == NO_DATA;
|
|
break;
|
|
}
|
|
|
|
|