withMVar family have a bug
withMVar is defined like this:
withMVar :: MVar a -> (a -> IO b) -> IO b
withMVar m io =
block $ do
a <- takeMVar m
b <- catch (unblock (io a))
(\e -> do putMVar m a; throw e)
putMVar m a
return b
unfortunately this has a (very rare) bug: catch can raise a stack overflow exception, which would leave the MVar empty.
This is a tricky one. Perhaps in the event of a stack overflow, catch should ensure that the exception is passed directly to its handler, and we always add some extra stack space for the handler.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.4.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | Unknown |
| Architecture | Unknown |