Rework BIO_ADDRINFO_protocol() to return correct values
authorRichard Levitte <levitte@openssl.org>
Wed, 10 Feb 2016 21:33:44 +0000 (22:33 +0100)
committerRichard Levitte <levitte@openssl.org>
Thu, 11 Feb 2016 13:13:01 +0000 (14:13 +0100)
As noted already, some platforms don't fill in ai_protocol as
expected.  To circumvent that, we have BIO_ADDRINFO_protocol() to
compute a sensible answer in that case.

Reviewed-by: Kurt Roeckx <kurt@openssl.org>
crypto/bio/b_addr.c

index 9131dcdd16b55e7ad40c4a8723af525f78433fb0..459443b3d986d98dbb3c6778c5165abbef9067fe 100644 (file)
@@ -379,8 +379,24 @@ int BIO_ADDRINFO_socktype(const BIO_ADDRINFO *bai)
 
 int BIO_ADDRINFO_protocol(const BIO_ADDRINFO *bai)
 {
-    if (bai != NULL)
-        return bai->bai_protocol;
+    if (bai != NULL) {
+        if (bai->bai_protocol != 0)
+            return bai->bai_protocol;
+
+#ifdef AF_UNIX
+        if (bai->bai_family == AF_UNIX)
+            return 0;
+#endif
+
+        switch (bai->bai_socktype) {
+        case SOCK_STREAM:
+            return IPPROTO_TCP;
+        case SOCK_DGRAM:
+            return IPPROTO_UDP;
+        default:
+            break;
+        }
+    }
     return 0;
 }