diff options
author | bptato <nincsnevem662@gmail.com> | 2025-01-12 01:20:08 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2025-01-12 01:25:18 +0100 |
commit | 60f26ec6c42a29fee4c4fc33fc7a171fa6114ccc (patch) | |
tree | b8a95de30b31945fe5f34e51cb1c4d13987822b2 | |
parent | 2db84e9ea2cde323516586ec1478c953cc25f6cc (diff) | |
download | chawan-60f26ec6c42a29fee4c4fc33fc7a171fa6114ccc.tar.gz |
buffer, dynstream: fix clone race, recvmsg/sendmsg cast
The fds must be read before the other buffer resumes execution. Also, for some reason, CMSG_SPACE/CMSG_LEN are inconsistent in their size with controllen on BSDs...
-rw-r--r-- | src/io/dynstream.nim | 6 | ||||
-rw-r--r-- | src/server/buffer.nim | 8 |
2 files changed, 7 insertions, 7 deletions
diff --git a/src/io/dynstream.nim b/src/io/dynstream.nim index 4c322f95..478b6044 100644 --- a/src/io/dynstream.nim +++ b/src/io/dynstream.nim @@ -367,9 +367,9 @@ proc sendMsg*(s: SocketStream; buffer: openArray[uint8]; hdr.msg_iov = addr iov hdr.msg_iovlen = 1 hdr.msg_control = cmsgBuf - hdr.msg_controllen = controlLen + hdr.msg_controllen = SockLen(controlLen) let cmsg = CMSG_FIRSTHDR(addr hdr) - cmsg.cmsg_len = CMSG_LEN(csize_t(sendAuxSize)) + cmsg.cmsg_len = SockLen(CMSG_LEN(csize_t(sendAuxSize))) cmsg.cmsg_level = SOL_SOCKET cmsg.cmsg_type = SCM_RIGHTS if sendAux.len > 0: @@ -396,7 +396,7 @@ proc recvMsg*(s: SocketStream; buffer: var openArray[uint8]; hdr.msg_iov = addr iov hdr.msg_iovlen = 1 hdr.msg_control = cmsgBuf - hdr.msg_controllen = controlLen + hdr.msg_controllen = SockLen(controlLen) let n = recvmsg(SocketHandle(s.fd), addr hdr, 0) if n < 0: if cmsgBuf != nil: diff --git a/src/server/buffer.nim b/src/server/buffer.nim index 08ff062c..a62c0659 100644 --- a/src/server/buffer.nim +++ b/src/server/buffer.nim @@ -1013,14 +1013,14 @@ proc clone*(buffer: Buffer; newurl: URL): int {.proxy.} = # the cache. (This also lets us skip suspend/resume in this case.) # We ignore errors; not much we can do with them here :/ discard buffer.rewind(buffer.bytesRead, unregister = false) - ps.write(char(0)) - buffer.url = newurl - for it in buffer.tasks.mitems: - it = 0 var sockFd: cint buffer.pstream.withPacketReader r: sockFd = r.recvAux.pop() buffer.pstream.sclose() + ps.write(char(0)) + buffer.url = newurl + for it in buffer.tasks.mitems: + it = 0 buffer.pstream = newSocketStream(sockFd) gpstream = buffer.pstream buffer.loader.clientPid = myPid |