Skip to content
Merged
1 change: 1 addition & 0 deletions _typos.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ RPC_S_CALL_FAILED_DNE = "RPC_S_CALL_FAILED_DNE"
SEH = "SEH"
setup_seh_handler = "setup_seh_handler"
usri4_parms = "usri4_parms"
msg_controllen = "msg_controllen"

[default]
extend-ignore-re = [
Expand Down
5 changes: 5 additions & 0 deletions spec/std/http/server/server_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,11 @@ describe HTTP::Server do
end

it "can process simultaneous SSL handshakes" do
{% if flag?(:win32) && flag?(:gnu) && flag?(:x86_64) %}
# FIXME: why does the spec causes the process to die with status code 67?
pending! "process dies with exit code 67 on msys2-ucrt-x86_64 on CI"
{% end %}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't pretty, but it at least allows to move on until we can figure out the issue on this specific msys2 environment. I cherry-picked the same commit to #16569 where the issue is also fixed.

It might be related to raising exceptions in OpenSSL::BIO callbacks from C.


server = HTTP::Server.new do |context|
context.response.print "ok"
end
Expand Down
30 changes: 30 additions & 0 deletions src/crystal/event_loop/polling.cr
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,36 @@ abstract class Crystal::EventLoop::Polling < Crystal::EventLoop
end
end

# Extension to support Kernel TLS in OpenSSL::BIO.
def recvmsg(socket : ::Socket, message : Pointer(LibC::Msghdr), flags : Int32) : Int32 | Errno
loop do
ret = LibC.recvmsg(socket.fd, message, flags)
return ret.to_i unless ret == -1

if Errno.value == Errno::EAGAIN
wait_readable(socket, socket.@read_timeout) { return Errno::ETIMEDOUT }
return Errno::EBADF if socket.closed?
else
return Errno.value
end
end
end

# Extension to support Kernel TLS in OpenSSL::BIO.
def sendmsg(socket : ::Socket, message : Pointer(LibC::Msghdr), flags : Int32) : Int32 | Errno
loop do
ret = LibC.sendmsg(socket.fd, message, flags)
return ret.to_i unless ret == -1

if Errno.value == Errno::EAGAIN
wait_writable(socket, socket.@write_timeout) { return Errno::ETIMEDOUT }
return Errno::EBADF if socket.closed?
else
return Errno.value
end
end
end

def shutdown(socket : ::Socket) : Nil
# perform cleanup before LibC.close. Using a file descriptor after it has
# been closed is never defined and can always lead to undefined results
Expand Down
1 change: 1 addition & 0 deletions src/lib_c/aarch64-linux-android/c/linux
9 changes: 5 additions & 4 deletions src/lib_c/aarch64-linux-android/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
22 changes: 22 additions & 0 deletions src/lib_c/aarch64-linux-android/c/sys/socket.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require "./types"
require "./uio"

lib LibC
SOCK_DGRAM = 2
Expand Down Expand Up @@ -28,6 +29,8 @@ lib LibC
SHUT_WR = 1
SOCK_CLOEXEC = 0o2000000
SOCK_NONBLOCK = 0o0004000
SOL_TCP = 6
SOL_TLS = 282

alias SocklenT = UInt32
alias SaFamilyT = UShort
Expand All @@ -48,6 +51,23 @@ lib LibC
l_linger : Int
end

struct Msghdr
msg_name : Void*
msg_namelen : SocklenT
msg_iov : Iovec*
msg_iovlen : SizeT
msg_control : Void*
msg_controllen : SizeT
msg_flags : Int
end

struct Cmsghdr
cmsg_len : SizeT
cmsg_level : Int
cmsg_type : Int
cmsg_data : Char[0]
end

fun accept(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT*) : Int
fun accept4(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT*, __flags : Int) : Int
fun bind(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT) : Int
Expand All @@ -58,7 +78,9 @@ lib LibC
fun listen(__fd : Int, __backlog : Int) : Int
fun recv(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int) : SSizeT
fun recvfrom(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int, __src_addr : Sockaddr*, __src_addr_length : SocklenT*) : SSizeT
fun recvmsg(Int, Msghdr*, Int) : Int
fun send(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int) : SSizeT
fun sendmsg(Int, Msghdr*, Int) : Int
fun sendto(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int, __dst_addr : Sockaddr*, __dst_addr_length : SocklenT) : SSizeT
fun setsockopt(__fd : Int, __level : Int, __option : Int, __value : Void*, __value_length : SocklenT) : Int
fun shutdown(__fd : Int, __how : Int) : Int
Expand Down
6 changes: 6 additions & 0 deletions src/lib_c/aarch64-linux-android/c/sys/uio.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
lib LibC
struct Iovec
iov_base : Void*
iov_len : SizeT
end
end
1 change: 1 addition & 0 deletions src/lib_c/aarch64-linux-gnu/c/linux
9 changes: 5 additions & 4 deletions src/lib_c/aarch64-linux-gnu/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
22 changes: 22 additions & 0 deletions src/lib_c/aarch64-linux-gnu/c/sys/socket.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require "./types"
require "./uio"

lib LibC
SOCK_DGRAM = 2
Expand Down Expand Up @@ -28,6 +29,8 @@ lib LibC
SHUT_WR = 1
SOCK_CLOEXEC = 524288
SOCK_NONBLOCK = 2048
SOL_TCP = 6
SOL_TLS = 282

alias SocklenT = UInt
alias SaFamilyT = UShort
Expand All @@ -48,6 +51,23 @@ lib LibC
l_linger : Int
end

struct Msghdr
msg_name : Void*
msg_namelen : SocklenT
msg_iov : Iovec*
msg_iovlen : SizeT
msg_control : Void*
msg_controllen : SizeT
msg_flags : Int
end

struct Cmsghdr
cmsg_len : SizeT
cmsg_level : Int
cmsg_type : Int
cmsg_data : Char[0]
end

fun accept(fd : Int, addr : Sockaddr*, addr_len : SocklenT*) : Int
fun accept4(fd : Int, addr : Sockaddr*, addr_len : SocklenT*, flags : Int) : Int
fun bind(fd : Int, addr : Sockaddr*, len : SocklenT) : Int
Expand All @@ -58,7 +78,9 @@ lib LibC
fun listen(fd : Int, n : Int) : Int
fun recv(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun recvfrom(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT*) : SSizeT
fun recvmsg(Int, Msghdr*, Int) : Int
fun send(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun sendmsg(Int, Msghdr*, Int) : Int
fun sendto(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT) : SSizeT
fun setsockopt(fd : Int, level : Int, optname : Int, optval : Void*, optlen : SocklenT) : Int
fun shutdown(fd : Int, how : Int) : Int
Expand Down
6 changes: 6 additions & 0 deletions src/lib_c/aarch64-linux-gnu/c/sys/uio.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
lib LibC
struct Iovec
iov_base : Void*
iov_len : SizeT
end
end
1 change: 1 addition & 0 deletions src/lib_c/aarch64-linux-musl/c/linux
9 changes: 5 additions & 4 deletions src/lib_c/aarch64-linux-musl/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
25 changes: 25 additions & 0 deletions src/lib_c/aarch64-linux-musl/c/sys/socket.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require "./types"
require "./uio"

lib LibC
SOCK_DGRAM = 2
Expand Down Expand Up @@ -28,6 +29,8 @@ lib LibC
SHUT_WR = 1
SOCK_CLOEXEC = 0o2000000
SOCK_NONBLOCK = 0o0004000
SOL_TCP = 6
SOL_TLS = 282

alias SocklenT = UInt
alias SaFamilyT = UShort
Expand All @@ -48,6 +51,26 @@ lib LibC
l_linger : Int
end

struct Msghdr
msg_name : Void*
msg_namelen : SocklenT
msg_iov : Iovec*
msg_iovlen : Int
__pad1 : Int
msg_control : Void*
msg_controllen : SocklenT
__pad2 : Int
msg_flags : Int
end

struct Cmsghdr
cmsg_len : SocklenT
__pad1 : Int
cmsg_level : Int
cmsg_type : Int
cmsg_data : Char[0]
end

fun accept(x0 : Int, x1 : Sockaddr*, x2 : SocklenT*) : Int
fun accept4(x0 : Int, x1 : Sockaddr*, x2 : SocklenT*, x3 : Int) : Int
fun bind(x0 : Int, x1 : Sockaddr*, x2 : SocklenT) : Int
Expand All @@ -58,7 +81,9 @@ lib LibC
fun listen(x0 : Int, x1 : Int) : Int
fun recv(x0 : Int, x1 : Void*, x2 : SizeT, x3 : Int) : SSizeT
fun recvfrom(x0 : Int, x1 : Void*, x2 : SizeT, x3 : Int, x4 : Sockaddr*, x5 : SocklenT*) : SSizeT
fun recvmsg(Int, Msghdr*, Int) : Int
fun send(x0 : Int, x1 : Void*, x2 : SizeT, x3 : Int) : SSizeT
fun sendmsg(Int, Msghdr*, Int) : Int
fun sendto(x0 : Int, x1 : Void*, x2 : SizeT, x3 : Int, x4 : Sockaddr*, x5 : SocklenT) : SSizeT
fun setsockopt(x0 : Int, x1 : Int, x2 : Int, x3 : Void*, x4 : SocklenT) : Int
fun shutdown(x0 : Int, x1 : Int) : Int
Expand Down
6 changes: 6 additions & 0 deletions src/lib_c/aarch64-linux-musl/c/sys/uio.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
lib LibC
struct Iovec
iov_base : Void*
iov_len : SizeT
end
end
1 change: 1 addition & 0 deletions src/lib_c/arm-linux-gnueabihf/c/linux
9 changes: 5 additions & 4 deletions src/lib_c/arm-linux-gnueabihf/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
22 changes: 22 additions & 0 deletions src/lib_c/arm-linux-gnueabihf/c/sys/socket.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require "./types"
require "./uio"

lib LibC
SOCK_DGRAM = 2
Expand Down Expand Up @@ -28,6 +29,8 @@ lib LibC
SHUT_WR = 1
SOCK_CLOEXEC = 524288
SOCK_NONBLOCK = 2048
SOL_TCP = 6
SOL_TLS = 282

alias SocklenT = UInt
alias SaFamilyT = UShort
Expand All @@ -48,6 +51,23 @@ lib LibC
l_linger : Int
end

struct Msghdr
msg_name : Void*
msg_namelen : SocklenT
msg_iov : Iovec*
msg_iovlen : SizeT
msg_control : Void*
msg_controllen : SizeT
msg_flags : Int
end

struct Cmsghdr
cmsg_len : SizeT
cmsg_level : Int
cmsg_type : Int
cmsg_data : Char[0]
end

fun accept(fd : Int, addr : Sockaddr*, addr_len : SocklenT*) : Int
fun accept4(fd : Int, addr : Sockaddr*, addr_len : SocklenT*, flags : Int) : Int
fun bind(fd : Int, addr : Sockaddr*, len : SocklenT) : Int
Expand All @@ -58,7 +78,9 @@ lib LibC
fun listen(fd : Int, n : Int) : Int
fun recv(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun recvfrom(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT*) : SSizeT
fun recvmsg(Int, Msghdr*, Int) : Int
fun send(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun sendmsg(Int, Msghdr*, Int) : Int
fun sendto(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT) : SSizeT
fun setsockopt(fd : Int, level : Int, optname : Int, optval : Void*, optlen : SocklenT) : Int
fun shutdown(fd : Int, how : Int) : Int
Expand Down
6 changes: 6 additions & 0 deletions src/lib_c/arm-linux-gnueabihf/c/sys/uio.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
lib LibC
struct Iovec
iov_base : Void*
iov_len : SizeT
end
end
1 change: 1 addition & 0 deletions src/lib_c/i386-linux-gnu/c/linux
9 changes: 5 additions & 4 deletions src/lib_c/i386-linux-gnu/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
Loading