withMVar family have a bug
|Reported by:||simonmar||Owned by:|
|Type of failure:||Difficulty:||Unknown|
|Test Case:||N/A||Blocked By:|
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.