Skip to content

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information