BIO: Add BIO_dgram_detect_peer_addr API
authorHugo Landau <hlandau@openssl.org>
Wed, 9 Aug 2023 16:46:33 +0000 (17:46 +0100)
committerHugo Landau <hlandau@openssl.org>
Fri, 1 Sep 2023 09:45:34 +0000 (10:45 +0100)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/21715)

crypto/bio/bss_conn.c
crypto/bio/bss_dgram.c
include/openssl/bio.h.in

index 0f9cba06da388c867d60d5bbb8e100021e836113..8d29f94bd120fb50e347c9deaf9fa0d3a61c18a1 100644 (file)
@@ -571,6 +571,7 @@ static long conn_ctrl(BIO *b, int cmd, long num, void *ptr)
         }
         break;
     case BIO_CTRL_DGRAM_GET_PEER:
+    case BIO_CTRL_DGRAM_DETECT_PEER_ADDR:
         if (data->state != BIO_CONN_S_OK)
             conn_state(b, data); /* best effort */
 
index 49cf56ad1924a22d4ae5f6a5c06e5fae1b49149b..eb6897a3fdb74f382b2fc1d45bcc6d94062aaf4c 100644 (file)
@@ -722,6 +722,28 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
     case BIO_CTRL_DGRAM_SET_PEER:
         BIO_ADDR_make(&data->peer, BIO_ADDR_sockaddr((BIO_ADDR *)ptr));
         break;
+    case BIO_CTRL_DGRAM_DETECT_PEER_ADDR:
+        {
+            BIO_ADDR xaddr, *p = &data->peer;
+            socklen_t xaddr_len = sizeof(xaddr.sa);
+
+            if (BIO_ADDR_family(p) == AF_UNSPEC) {
+                if (getpeername(b->num, (void *)&xaddr.sa, &xaddr_len) == 0
+                    && BIO_ADDR_family(&xaddr) != AF_UNSPEC) {
+                    p = &xaddr;
+                } else {
+                    ret = 0;
+                    break;
+                }
+            }
+
+            ret = BIO_ADDR_sockaddr_size(p);
+            if (num == 0 || num > ret)
+                num = ret;
+
+            memcpy(ptr, p, (ret = num));
+        }
+        break;
     case BIO_C_SET_NBIO:
         if (!BIO_socket_nbio(b->num, num != 0))
             ret = 0;
index 9d196c7ae500cf56b4239171fe389636207e90c9..e797769909e9705309233877aa28fe64e3edd3c5 100644 (file)
@@ -190,6 +190,7 @@ extern "C" {
 
 # define BIO_CTRL_GET_RPOLL_DESCRIPTOR          90
 # define BIO_CTRL_GET_WPOLL_DESCRIPTOR          91
+# define BIO_CTRL_DGRAM_DETECT_PEER_ADDR        92
 
 # define BIO_DGRAM_CAP_NONE                 0U
 # define BIO_DGRAM_CAP_HANDLES_SRC_ADDR     (1U << 0)
@@ -639,6 +640,8 @@ int BIO_ctrl_reset_read_request(BIO *b);
          (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)(peer))
 # define BIO_dgram_set_peer(b,peer) \
          (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)(peer))
+# define BIO_dgram_detect_peer_addr(b,peer) \
+         (int)BIO_ctrl(b, BIO_CTRL_DGRAM_DETECT_PEER_ADDR, 0, (char *)(peer))
 # define BIO_dgram_get_mtu_overhead(b) \
          (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL)
 # define BIO_dgram_get_local_addr_cap(b) \