summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsf <sf@13f79535-47bb-0310-9956-ffa450edef68>2013-05-03 18:39:44 +0000
committersf <sf@13f79535-47bb-0310-9956-ffa450edef68>2013-05-03 18:39:44 +0000
commitdaabd33ddfe2ac3a8b3d4d15ecf3dc1cfe665d9b (patch)
tree0e331e7678bc4f343963cdeae855b5217a64cdfc
parent7ad4e1535d6a685ae69a6c6680f915b5f2950291 (diff)
downloadlibapr-daabd33ddfe2ac3a8b3d4d15ecf3dc1cfe665d9b.tar.gz
Merge r1478905, add CHANGES entry:
Make sure apr_sockaddr_info_get() returns an error if - getaddrinfo() returned only useless entries - getaddrinfo() returned EAI_SYSTEM but errno == 0 - gethostbyname() returns no error but an empty address list Submitted by: Jan Kaluža <jkaluza redhat com>, Stefan Fritsch git-svn-id: http://svn.apache.org/repos/asf/apr/apr/branches/1.4.x@1478911 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--CHANGES3
-rw-r--r--network_io/unix/sockaddr.c16
2 files changed, 18 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 9bd782779..12596b215 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
-*- coding: utf-8 -*-
Changes for APR 1.4.7
+ *) Fix apr_sockaddr_info_get() not returning an error in some cases.
+ [Jan Kaluža <jkaluza redhat com>]
+
*) Fix amd64 assembler version of apr_atomic_xchgptr(). PR 51851. [Mattias
Engdegård <mattiase acm org>]
diff --git a/network_io/unix/sockaddr.c b/network_io/unix/sockaddr.c
index a5cb8221c..9253a2746 100644
--- a/network_io/unix/sockaddr.c
+++ b/network_io/unix/sockaddr.c
@@ -385,7 +385,7 @@ static apr_status_t call_resolver(apr_sockaddr_t **sa,
return apr_get_netos_error();
#else
if (error == EAI_SYSTEM) {
- return errno;
+ return errno ? errno : APR_EGENERAL;
}
else
{
@@ -440,6 +440,15 @@ static apr_status_t call_resolver(apr_sockaddr_t **sa,
ai = ai->ai_next;
}
freeaddrinfo(ai_list);
+
+ if (prev_sa == NULL) {
+ /*
+ * getaddrinfo returned only useless entries and *sa is still empty.
+ * This should be treated as an error.
+ */
+ return APR_EGENERAL;
+ }
+
return APR_SUCCESS;
}
@@ -573,6 +582,11 @@ static apr_status_t find_addresses(apr_sockaddr_t **sa,
++curaddr;
}
+ if (prev_sa == NULL) {
+ /* this should not happen but no result should be treated as error */
+ return APR_EGENERAL;
+ }
+
return APR_SUCCESS;
}