Fix the BIO_addr test
authorMatt Caswell <matt@openssl.org>
Thu, 5 Oct 2023 16:11:25 +0000 (17:11 +0100)
committerTomas Mraz <tomas@openssl.org>
Mon, 9 Oct 2023 08:15:40 +0000 (10:15 +0200)
The BIO_addr test is failing on non-stop. The length of the data is larger
than the size we have allocated for it. We dynamically allocate instead.

Fixes #22218

Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/22294)

test/bio_addr_test.c

index 9ca007e51195dfa3d955d7de2607ba99af9b445a..38ea3de36c94d574543bf0daa1a8e6d9a6049bc7 100644 (file)
@@ -80,8 +80,9 @@ static BIO_ADDR *make_dummy_addr(int family)
 
 static int bio_addr_is_eq(const BIO_ADDR *a, const BIO_ADDR *b)
 {
-    struct sockaddr_storage adata, bdata;
+    unsigned char *adata = NULL, *bdata = NULL;
     size_t alen, blen;
+    int ret = 0;
 
     /* True even if a and b are NULL */
     if (a == b)
@@ -98,15 +99,11 @@ static int bio_addr_is_eq(const BIO_ADDR *a, const BIO_ADDR *b)
     if (BIO_ADDR_rawport(a) != BIO_ADDR_rawport(b))
         return 0;
 
-    if (!BIO_ADDR_rawaddress(a, NULL, &alen)
-            || alen > sizeof(adata)
-            || !BIO_ADDR_rawaddress(a, &adata, &alen))
+    if (!BIO_ADDR_rawaddress(a, NULL, &alen))
         return 0;
 
-    if (!BIO_ADDR_rawaddress(a, NULL, &blen)
-            || blen > sizeof(bdata)
-            || !BIO_ADDR_rawaddress(a, &bdata, &blen))
-        return 0;
+    if (!BIO_ADDR_rawaddress(b, NULL, &blen))
+        goto err;
 
     if (alen != blen)
         return 0;
@@ -114,7 +111,22 @@ static int bio_addr_is_eq(const BIO_ADDR *a, const BIO_ADDR *b)
     if (alen == 0)
         return 1;
 
-    return memcmp(&adata, &bdata, alen) == 0;
+    adata = OPENSSL_malloc(alen);
+    if (!TEST_ptr(adata)
+            || !BIO_ADDR_rawaddress(a, adata, &alen))
+        goto err;
+
+    bdata = OPENSSL_malloc(blen);
+    if (!TEST_ptr(bdata)
+            || !BIO_ADDR_rawaddress(b, bdata, &blen))
+        goto err;
+
+    ret = (memcmp(adata, bdata, alen) == 0);
+
+ err:
+    OPENSSL_free(adata);
+    OPENSSL_free(bdata);
+    return ret;
 }
 
 static int test_bio_addr_copy_dup(int idx)