summaryrefslogtreecommitdiffstats
path: root/crypto/bio/b_addr.c
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2017-04-20 09:51:55 +0100
committerMatt Caswell <matt@openssl.org>2017-04-25 11:13:39 +0100
commit5114d8227e0516fffc0c8653f5118290709f6494 (patch)
treee5626dd44bfe76607fc068314b7dc12fa977b780 /crypto/bio/b_addr.c
parentb3c42fc2503a685a9e51427c1a83c8f09487389d (diff)
Add a BIO_lookup_ex() function
The existing BIO_lookup() wraps a call to getaddrinfo and provides an abstracted capability to lookup addresses based on socket type and family. However it provides no ability to lookup based on protocol. Normally, when dealing with TCP/UDP this is not required. However getaddrinfo (at least on linux) never returns SCTP addresses unless you specifically ask for them in the protocol field. Therefore BIO_lookup_ex() is added which provides the protocol field. Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/3286)
Diffstat (limited to 'crypto/bio/b_addr.c')
-rw-r--r--crypto/bio/b_addr.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/crypto/bio/b_addr.c b/crypto/bio/b_addr.c
index 289404c16b..141f1a9ee9 100644
--- a/crypto/bio/b_addr.c
+++ b/crypto/bio/b_addr.c
@@ -609,6 +609,13 @@ DEFINE_RUN_ONCE_STATIC(do_bio_lookup_init)
return bio_lookup_lock != NULL;
}
+int BIO_lookup(const char *host, const char *service,
+ enum BIO_lookup_type lookup_type,
+ int family, int socktype, BIO_ADDRINFO **res)
+{
+ return BIO_lookup_ex(host, service, lookup_type, family, socktype, 0, res);
+}
+
/*-
* BIO_lookup - look up the node and service you want to connect to.
* @node: the node you want to connect to.
@@ -618,6 +625,10 @@ DEFINE_RUN_ONCE_STATIC(do_bio_lookup_init)
* AF_INET, AF_INET6 or AF_UNIX.
* @socktype: The socket type you want to use. Can be SOCK_STREAM, SOCK_DGRAM
* or 0 for all.
+ * @protocol: The protocol to use, e.g. IPPROTO_TCP or IPPROTO_UDP or 0 for all.
+ * Note that some platforms may not return IPPROTO_SCTP without
+ * explicitly requesting it (i.e. IPPROTO_SCTP may not be returned
+ * with 0 for the protocol)
* @res: Storage place for the resulting list of returned addresses
*
* This will do a lookup of the node and service that you want to connect to.
@@ -627,9 +638,9 @@ DEFINE_RUN_ONCE_STATIC(do_bio_lookup_init)
*
* The return value is 1 on success or 0 in case of error.
*/
-int BIO_lookup(const char *host, const char *service,
- enum BIO_lookup_type lookup_type,
- int family, int socktype, BIO_ADDRINFO **res)
+int BIO_lookup_ex(const char *host, const char *service,
+ enum BIO_lookup_type lookup_type,
+ int family, int socktype, int protocol, BIO_ADDRINFO **res)
{
int ret = 0; /* Assume failure */
@@ -646,7 +657,7 @@ int BIO_lookup(const char *host, const char *service,
#endif
break;
default:
- BIOerr(BIO_F_BIO_LOOKUP, BIO_R_UNSUPPORTED_PROTOCOL_FAMILY);
+ BIOerr(BIO_F_BIO_LOOKUP_EX, BIO_R_UNSUPPORTED_PROTOCOL_FAMILY);
return 0;
}
@@ -655,7 +666,7 @@ int BIO_lookup(const char *host, const char *service,
if (addrinfo_wrap(family, socktype, host, strlen(host), 0, res))
return 1;
else
- BIOerr(BIO_F_BIO_LOOKUP, ERR_R_MALLOC_FAILURE);
+ BIOerr(BIO_F_BIO_LOOKUP_EX, ERR_R_MALLOC_FAILURE);
return 0;
}
#endif
@@ -672,6 +683,7 @@ int BIO_lookup(const char *host, const char *service,
hints.ai_family = family;
hints.ai_socktype = socktype;
+ hints.ai_protocol = protocol;
if (lookup_type == BIO_LOOKUP_SERVER)
hints.ai_flags |= AI_PASSIVE;
@@ -683,14 +695,14 @@ int BIO_lookup(const char *host, const char *service,
# ifdef EAI_SYSTEM
case EAI_SYSTEM:
SYSerr(SYS_F_GETADDRINFO, get_last_socket_error());
- BIOerr(BIO_F_BIO_LOOKUP, ERR_R_SYS_LIB);
+ BIOerr(BIO_F_BIO_LOOKUP_EX, ERR_R_SYS_LIB);
break;
# endif
case 0:
ret = 1; /* Success */
break;
default:
- BIOerr(BIO_F_BIO_LOOKUP, ERR_R_SYS_LIB);
+ BIOerr(BIO_F_BIO_LOOKUP_EX, ERR_R_SYS_LIB);
ERR_add_error_data(1, gai_strerror(gai_ret));
break;
}
@@ -732,7 +744,7 @@ int BIO_lookup(const char *host, const char *service,
#endif
if (!RUN_ONCE(&bio_lookup_init, do_bio_lookup_init)) {
- BIOerr(BIO_F_BIO_LOOKUP, ERR_R_MALLOC_FAILURE);
+ BIOerr(BIO_F_BIO_LOOKUP_EX, ERR_R_MALLOC_FAILURE);
ret = 0;
goto err;
}
@@ -824,7 +836,7 @@ int BIO_lookup(const char *host, const char *service,
goto err;
}
} else {
- BIOerr(BIO_F_BIO_LOOKUP, BIO_R_MALFORMED_HOST_OR_SERVICE);
+ BIOerr(BIO_F_BIO_LOOKUP_EX, BIO_R_MALFORMED_HOST_OR_SERVICE);
goto err;
}
}
@@ -866,7 +878,7 @@ int BIO_lookup(const char *host, const char *service,
addrinfo_malloc_err:
BIO_ADDRINFO_free(*res);
*res = NULL;
- BIOerr(BIO_F_BIO_LOOKUP, ERR_R_MALLOC_FAILURE);
+ BIOerr(BIO_F_BIO_LOOKUP_EX, ERR_R_MALLOC_FAILURE);
ret = 0;
goto err;
}