[GHC] #13891: forkIO can trivially defeat bracket

GHC ghc-devs at haskell.org
Wed Jun 28 13:29:32 UTC 2017


#13891: forkIO can trivially defeat bracket
-------------------------------------+-------------------------------------
           Reporter:  bgamari        |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Consider this program,
 {{{#!hs
 import Control.Concurrent
 import Control.Exception

 main = do
     putStrLn "forking"
     forkIO $ bracket (putStrLn "forked") (const $ putStrLn "finalize")
 (const $ putStrLn "hello" >> threadDelay 100000000)
     threadDelay 10000
     putStrLn "done"
 }}}

 Would you predict that it would print `finalize`?

 Answer: no. It will print,
 {{{
 forking
 forked
 hello
 done
 }}}

 It would pointed out by an author of a cryptographic library (`raaz`) that
 this is quite bad as it means that secure memory could leak out uncleared.

 It's not entirely clear how best to deal with this. Perhaps raise a
 `ThreadKilled` async exception to all running threads during RTS shutdown,
 followed by a synchronization?

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13891>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list