summaryrefslogtreecommitdiffstats
path: root/crypto/bio
diff options
context:
space:
mode:
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>2020-05-28 19:03:37 +0200
committerDr. David von Oheimb <David.von.Oheimb@siemens.com>2020-06-01 09:26:52 +0200
commitec5aad1ca26599bcaddc3a03708fb925b21f3b6c (patch)
tree1c68126ad031691a199e85114ebb132727f52bbd /crypto/bio
parent7d76c1fa0d6cd085419cb4cfadad8cfdfd24ce1f (diff)
Make BIO_do_connect() and friends handle multiple IP addresses
Backport of #11971 Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org> Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de> (Merged from https://github.com/openssl/openssl/pull/11989)
Diffstat (limited to 'crypto/bio')
-rw-r--r--crypto/bio/bss_conn.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/crypto/bio/bss_conn.c b/crypto/bio/bss_conn.c
index dd43a40601..f4c6b85728 100644
--- a/crypto/bio/bss_conn.c
+++ b/crypto/bio/bss_conn.c
@@ -186,8 +186,17 @@ static int conn_state(BIO *b, BIO_CONNECT *c)
case BIO_CONN_S_BLOCKED_CONNECT:
i = BIO_sock_error(b->num);
- if (i) {
+ if (i != 0) {
BIO_clear_retry_flags(b);
+ if ((c->addr_iter = BIO_ADDRINFO_next(c->addr_iter)) != NULL) {
+ /*
+ * if there are more addresses to try, do that first
+ */
+ BIO_closesocket(b->num);
+ c->state = BIO_CONN_S_CREATE_SOCKET;
+ ERR_clear_error();
+ break;
+ }
SYSerr(SYS_F_CONNECT, i);
ERR_add_error_data(4,
"hostname=", c->param_hostname,