Skip to content
Snippets Groups Projects
Commit 65c375ef authored by davidepianca98's avatar davidepianca98
Browse files

Use the correct data length for the address struct in Posix client socket

parent 83aec9e9
No related branches found
No related tags found
No related merge requests found
Showing
with 95 additions and 35 deletions
......@@ -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()}")
}
......
......@@ -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()}")
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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>)
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
......@@ -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
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment