From 65c375ef379f8b9553b4bc5f8e1798f3d4aeae71 Mon Sep 17 00:00:00 2001
From: davidepianca98 <davidepianca98@gmail.com>
Date: Sat, 11 Jan 2025 15:42:52 +0100
Subject: [PATCH] Use the correct data length for the address struct in Posix
 client socket

---
 .../kotlin/io/github/davidepianca98/ClientSocket.kt       | 4 ++--
 .../kotlin/io/github/davidepianca98/TLSClientSocket.kt    | 4 ++--
 .../iosArm64Main/kotlin/io/github/davidepianca98/Posix.kt | 8 ++++++--
 .../kotlin/io/github/davidepianca98/Posix.kt              | 8 ++++++--
 .../iosX64Main/kotlin/io/github/davidepianca98/Posix.kt   | 8 ++++++--
 .../kotlin/io/github/davidepianca98/Posix.kt              | 8 ++++++--
 .../linuxX64Main/kotlin/io/github/davidepianca98/Posix.kt | 8 ++++++--
 .../kotlin/io/github/davidepianca98/Posix.kt              | 8 ++++++--
 .../macosX64Main/kotlin/io/github/davidepianca98/Posix.kt | 8 ++++++--
 .../mingwX64Main/kotlin/io/github/davidepianca98/Posix.kt | 8 ++++++--
 .../posixMain/kotlin/io/github/davidepianca98/Posix.kt    | 2 +-
 .../kotlin/io/github/davidepianca98/Posix.kt              | 8 ++++++--
 .../kotlin/io/github/davidepianca98/Posix.kt              | 8 ++++++--
 .../tvosX64Main/kotlin/io/github/davidepianca98/Posix.kt  | 8 ++++++--
 .../kotlin/io/github/davidepianca98/Posix.kt              | 8 ++++++--
 .../kotlin/io/github/davidepianca98/Posix.kt              | 8 ++++++--
 .../kotlin/io/github/davidepianca98/Posix.kt              | 8 ++++++--
 .../kotlin/io/github/davidepianca98/Posix.kt              | 8 ++++++--
 18 files changed, 95 insertions(+), 35 deletions(-)

diff --git a/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/ClientSocket.kt b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/ClientSocket.kt
index ea1f393..809ee6e 100644
--- a/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/ClientSocket.kt
+++ b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/ClientSocket.kt
@@ -24,14 +24,14 @@ public actual class ClientSocket actual constructor(
 
     init {
         memScoped {
-            val ip = getaddrinfo(address, port.toString()) ?: throw IOException("Failed resolving address")
+            val ipLen = getaddrinfo(address, port.toString()) ?: throw IOException("Failed resolving address")
 
             if (set_send_socket_timeout(socket, connectTimeOut.convert()) == -1) {
                 socketsCleanup()
                 throw IOException("Socket connect timeout set failed, error ${getErrno()}")
             }
 
-            if (connect(socket, ip, sizeOf<sockaddr_in>().convert()) == -1) {
+            if (connect(socket, ipLen.first, ipLen.second) == -1) {
                 socketsCleanup()
                 throw IOException("Socket connect failed, error ${getErrno()}")
             }
diff --git a/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
index ce4fca9..9791631 100644
--- a/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
+++ b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
@@ -27,14 +27,14 @@ public actual class TLSClientSocket actual constructor(
 
     init {
         memScoped {
-            val ip = getaddrinfo(address, port.toString()) ?: throw IOException("Failed resolving address")
+            val ipLen = getaddrinfo(address, port.toString()) ?: throw IOException("Failed resolving address")
 
             if (set_send_socket_timeout(socket, connectTimeOut.convert()) == -1) {
                 socketsCleanup()
                 throw IOException("Socket connect timeout set failed, error ${getErrno()}")
             }
 
-            if (connect(socket, ip, sizeOf<sockaddr_in>().convert()) == -1) {
+            if (connect(socket, ipLen.first, ipLen.second) == -1) {
                 socketsCleanup()
                 throw IOException("Socket connect failed, error ${getErrno()}")
             }
diff --git a/kmqtt-common/src/iosArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/iosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index c1fe276..da469ec 100644
--- a/kmqtt-common/src/iosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/iosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index c1fe276..da469ec 100644
--- a/kmqtt-common/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/iosX64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/iosX64Main/kotlin/io/github/davidepianca98/Posix.kt
index c1fe276..da469ec 100644
--- a/kmqtt-common/src/iosX64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/iosX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/linuxArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/linuxArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index 2fa6eeb..69f3353 100644
--- a/kmqtt-common/src/linuxArm64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/linuxArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -137,7 +137,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -145,7 +145,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/linuxX64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/linuxX64Main/kotlin/io/github/davidepianca98/Posix.kt
index 5135fd5..9837ead 100644
--- a/kmqtt-common/src/linuxX64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/linuxX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -137,7 +137,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -145,7 +145,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/macosArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/macosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index c1fe276..da469ec 100644
--- a/kmqtt-common/src/macosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/macosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/macosX64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/macosX64Main/kotlin/io/github/davidepianca98/Posix.kt
index c1fe276..da469ec 100644
--- a/kmqtt-common/src/macosX64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/macosX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/mingwX64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/mingwX64Main/kotlin/io/github/davidepianca98/Posix.kt
index 981d73f..ba16fee 100644
--- a/kmqtt-common/src/mingwX64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/mingwX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -161,7 +161,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutValue.ptr, sizeOf<uint32_tVar>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_INET
@@ -169,7 +169,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!.toUInt())
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/Posix.kt
index a2f680c..9f76c29 100644
--- a/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/Posix.kt
@@ -97,7 +97,7 @@ public expect fun MemScope.select(
     timeout: Long
 ): Int
 
-public expect fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>?
+public expect fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>?
 
 public expect fun fdSet(fd: Int, fdSet: CValuesRef<fd_set>)
 
diff --git a/kmqtt-common/src/tvosArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/tvosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index c1fe276..da469ec 100644
--- a/kmqtt-common/src/tvosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/tvosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index c1fe276..da469ec 100644
--- a/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/tvosX64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/tvosX64Main/kotlin/io/github/davidepianca98/Posix.kt
index c1fe276..da469ec 100644
--- a/kmqtt-common/src/tvosX64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/tvosX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/watchosArm32Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/watchosArm32Main/kotlin/io/github/davidepianca98/Posix.kt
index ee62330..5b365d5 100644
--- a/kmqtt-common/src/watchosArm32Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/watchosArm32Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/watchosArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/watchosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index ee62330..5b365d5 100644
--- a/kmqtt-common/src/watchosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/watchosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index ee62330..5b365d5 100644
--- a/kmqtt-common/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
diff --git a/kmqtt-common/src/watchosX64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/watchosX64Main/kotlin/io/github/davidepianca98/Posix.kt
index ee62330..5b365d5 100644
--- a/kmqtt-common/src/watchosX64Main/kotlin/io/github/davidepianca98/Posix.kt
+++ b/kmqtt-common/src/watchosX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -145,7 +145,7 @@ public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): In
     return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
 }
 
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+public actual fun MemScope.getaddrinfo(name: String, service: String?): Pair<CPointer<sockaddr>, UInt>? {
     val hints = alloc<addrinfo>()
     platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
     hints.ai_family = platform.posix.AF_UNSPEC
@@ -153,7 +153,11 @@ public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer
     hints.ai_protocol = platform.posix.IPPROTO_TCP
     val result = alloc<CPointerVar<addrinfo>>()
     if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
+        return if (result.pointed != null && result.pointed?.ai_addr != null && result.pointed?.ai_addrlen != null) {
+            Pair(result.pointed?.ai_addr!!, result.pointed?.ai_addrlen!!)
+        } else {
+            null
+        }
     }
     return null
 }
-- 
GitLab