Fix for race condition in *nix connect().

This commit is contained in:
cheatfate 2019-06-06 21:22:17 +03:00
parent 9160dcdbba
commit a8a1138b8b
No known key found for this signature in database
GPG Key ID: 46ADD633A7201F95

View File

@ -1076,22 +1076,23 @@ else:
return retFuture return retFuture
proc continuation(udata: pointer) = proc continuation(udata: pointer) =
var data = cast[ptr CompletionData](udata) if not retFuture.finished:
var err = 0 var data = cast[ptr CompletionData](udata)
let fd = data.fd var err = 0
fd.removeWriter() let fd = data.fd
if not fd.getSocketError(err): fd.removeWriter()
closeSocket(fd) if not fd.getSocketError(err):
retFuture.fail(getTransportOsError(osLastError())) closeSocket(fd)
return retFuture.fail(getTransportOsError(osLastError()))
if err != 0: return
closeSocket(fd) if err != 0:
retFuture.fail(getTransportOsError(OSErrorCode(err))) closeSocket(fd)
return retFuture.fail(getTransportOsError(OSErrorCode(err)))
let transp = newStreamSocketTransport(fd, bufferSize, child) return
# Start tracking transport let transp = newStreamSocketTransport(fd, bufferSize, child)
trackStream(transp) # Start tracking transport
retFuture.complete(transp) trackStream(transp)
retFuture.complete(transp)
while true: while true:
var res = posix.connect(SocketHandle(sock), var res = posix.connect(SocketHandle(sock),