mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-06 21:17:48 +00:00
osproc: fix double close on POSIX (#5724)
Calling close() in some cases issued two close() syscalls to one FD, which is incorrect in multithreaded programs.
This commit is contained in:
committed by
Andreas Rumpf
parent
412cd61dab
commit
b2060acbc4
@@ -1001,13 +1001,21 @@ elif not defined(useNimRtl):
|
||||
{.pop}
|
||||
|
||||
proc close(p: Process) =
|
||||
if p.inStream != nil: close(p.inStream)
|
||||
if p.outStream != nil: close(p.outStream)
|
||||
if p.errStream != nil: close(p.errStream)
|
||||
if poParentStreams notin p.options:
|
||||
discard close(p.inHandle)
|
||||
discard close(p.outHandle)
|
||||
discard close(p.errHandle)
|
||||
if p.inStream != nil:
|
||||
close(p.inStream)
|
||||
else:
|
||||
discard close(p.inHandle)
|
||||
|
||||
if p.outStream != nil:
|
||||
close(p.outStream)
|
||||
else:
|
||||
discard close(p.outHandle)
|
||||
|
||||
if p.errStream != nil:
|
||||
close(p.errStream)
|
||||
else:
|
||||
discard close(p.errHandle)
|
||||
|
||||
proc suspend(p: Process) =
|
||||
if kill(p.id, SIGSTOP) != 0'i32: raiseOsError(osLastError())
|
||||
|
||||
24
tests/osproc/tclose.nim
Normal file
24
tests/osproc/tclose.nim
Normal file
@@ -0,0 +1,24 @@
|
||||
discard """
|
||||
exitcode: 0
|
||||
"""
|
||||
|
||||
when defined(linux):
|
||||
import osproc, os
|
||||
|
||||
proc countFds(): int =
|
||||
result = 0
|
||||
for i in walkDir("/proc/self/fd"):
|
||||
result += 1
|
||||
|
||||
let initCount = countFds()
|
||||
|
||||
let p = osproc.startProcess("echo", options={poUsePath})
|
||||
assert countFds() == initCount + 3
|
||||
p.close
|
||||
assert countFds() == initCount
|
||||
|
||||
let p1 = osproc.startProcess("echo", options={poUsePath})
|
||||
discard p1.inputStream
|
||||
assert countFds() == initCount + 3
|
||||
p.close
|
||||
assert countFds() == initCount
|
||||
Reference in New Issue
Block a user