#4808: File descriptor reuse causes Handle to point to a different stream
------------------------+---------------------------------------------------
Reporter: clemens | Owner:
Type: bug | Status: new
Priority: normal | Component: libraries/base
Version: 7.0.1 | Keywords: fd reuse, file descriptor, handle reuse
Testcase: | Blockedby:
Os: Linux | Blocking:
Architecture: x86 | Failure: None/Unknown
------------------------+---------------------------------------------------
'''Short''': A handle ''h'' has been closed with hClose, while the file
descriptor underneath ''h'' has been reused, then hPutStrLn ''h'' might
succeed with the content written to the reconnected file descriptor.
'''Long:
'''
A popular server design -- also in Haskell -- is to have one thread for
each connected network client. The thread usually is blocking on read for
new packets of the connected client, while other threads write to the
socket of the connected client.
If a client drops its connection, the read thread terminates, and hCloses
the handle. However, in the example attached, we do not bother to notify
the other threads that the handle became invalid. We expect any write to
the closed handle to fail, so that those threads can lazily clean up their
handle lists and drop clients when they see a failing write.
However, the approach above does not work, as hPutStrLn will not fail for
closed handles, as the base library seems to rely on closed file
descriptors to signal errors on obsolete handles. When the file descriptor
is reused however, hPutStrLn will not signal any error, but happily write
content destined for an obsolete Handle to a file descriptor of a new
unrelated Handle.
In the example attached, just use netcat to connect and reconnect to port
1243, multiple times. The server will echo the list of connected handles.
If you just connect/reconnect that should not grow, but it does, as old
handles are not clean up because of non-failing writes.
You will also see the number of status message to multiply on connect.
This code is a minimal version of http://sequence.complete.org/node/258
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4808>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs