async exception safety for openFd

Audited for openFile and openFd, and this fixes all the ones I found
where an async exception could prevent the file getting closed.

Except for the lock pool, which is a whole other can of worms.
This commit is contained in:
Joey Hess 2020-06-05 15:46:01 -04:00
parent 1dd770b1af
commit 0210e81d83
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
5 changed files with 35 additions and 13 deletions

View file

@ -174,12 +174,13 @@ linkToLock (Just _) src dest = do
, return False
)
Left _ -> catchBoolIO $ do
fd <- openFd dest WriteOnly
(Just $ combineModes readModes)
(defaultFileFlags {exclusive = True})
h <- fdToHandle fd
readFile src >>= hPutStr h
hClose h
let setup = do
fd <- openFd dest WriteOnly
(Just $ combineModes readModes)
(defaultFileFlags {exclusive = True})
fdToHandle fd
let cleanup = hClose
bracket setup cleanup (\h -> readFile src >>= hPutStr h)
return True
where
checklinked = do