Address review feedback for the SCTP changes
authorMatt Caswell <matt@openssl.org>
Mon, 24 Apr 2017 13:15:49 +0000 (14:15 +0100)
committerMatt Caswell <matt@openssl.org>
Tue, 25 Apr 2017 10:13:39 +0000 (11:13 +0100)
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/3286)

crypto/bio/b_addr.c
doc/man3/BIO_ADDRINFO.pod
test/handshake_helper.c

index 82c220a..b8e1f96 100644 (file)
@@ -617,7 +617,7 @@ int BIO_lookup(const char *host, const char *service,
 }
 
 /*-
- * BIO_lookup - look up the node and service you want to connect to.
+ * BIO_lookup_ex - look up the node and service you want to connect to.
  * @node: the node you want to connect to.
  * @service: the service you want to connect to.
  * @lookup_type: declare intent with the result, client or server.
index 45e6e05..37a3e62 100644 (file)
@@ -52,7 +52,7 @@ IPPROTO_TCP, IPPROTO_UDP or IPPORTO_SCTP. If set to 0 than any protocol can be
 used. B<res> points at a pointer to hold the start of a B<BIO_ADDRINFO>
 chain.
 
-For the family B<AF_UNIX>, BIO_lookup() will ignore the B<service>
+For the family B<AF_UNIX>, BIO_lookup_ex() will ignore the B<service>
 parameter and expects the B<node> parameter to hold the path to the
 socket file.
 
@@ -89,6 +89,14 @@ case.
 All other functions described here return 0 or B<NULL> when the
 information they should return isn't available.
 
+=head1 NOTES
+
+The BIO_lookup_ex() implementation uses the platform provided getaddrinfo()
+function. On Linux it is known that specifying 0 for the protocol will not
+return any SCTP based addresses when calling getaddrinfo(). Therefore if an SCTP
+address is required then the B<protocol> parameter to BIO_lookup_ex() should be
+explicitly set to IPPROTO_SCTP. The same may be true on other platforms.
+
 =head1 HISTORY
 
 The BIO_lookup_ex() function was added in OpenSSL 1.1.1.
index 4943e82..8ad35ce 100644 (file)
@@ -1006,11 +1006,16 @@ static handshake_status_t handshake_status(peer_status_t last_status,
                                            int client_spoke_last)
 {
     switch (last_status) {
+    case PEER_WAITING:
+        /* Shouldn't ever happen */
+        return INTERNAL_ERROR;
+
     case PEER_SUCCESS:
         switch (previous_status) {
         case PEER_SUCCESS:
             /* Both succeeded. */
             return HANDSHAKE_SUCCESS;
+        case PEER_WAITING:
         case PEER_RETRY:
             /* Let the first peer finish. */
             return HANDSHAKE_RETRY;