From: Joey Hess Date: Wed, 18 Nov 2020 19:10:35 +0000 (-0400) Subject: avoid throwing exception when the handle is closed X-Git-Tag: archive/raspbian/10.20250416-2+rpi1~2^2^2~80^2~56^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=682829c200edf79b7762f87eff56845ff4ad2444;p=git-annex.git avoid throwing exception when the handle is closed The handle could get closed eg, by cleanupProcess being called, which forces the process to exit and closes all its handles. At this point, the test case in https://git-annex.branchable.com/bugs/Buggy_external_special_remote_stalls_after_7245a9e/ is fixed. --- diff --git a/Utility/Process.hs b/Utility/Process.hs index 958d239069..94321b2dfc 100644 --- a/Utility/Process.hs +++ b/Utility/Process.hs @@ -232,8 +232,8 @@ cleanupProcess (mb_stdin, mb_stdout, mb_stderr, pid) = do #endif {- | Like hGetLine, reads a line from the Handle. Returns Nothing if end of - - file is reached, or if the process has exited and there is nothing more - - buffered to read from the handle. + - file is reached, or the handle is closed, or if the process has exited + - and there is nothing more buffered to read from the handle. - - This is useful to protect against situations where the process might - have transferred the handle being read to another process, and so @@ -284,9 +284,14 @@ hGetLineUntilExitOrEOF ph h = go [] waitforinputorerror t = hWaitForInput h t `catchNonAsync` const (pure True) - getchar = catchIOErrorType EOF - (const (pure Nothing)) - (Just <$> hGetChar h) + getchar = + catcherr EOF $ + -- If the handle is closed, reading from it is + -- an IllegalOperation. + catcherr IllegalOperation $ + Just <$> hGetChar h + where + catcherr t = catchIOErrorType t (const (pure Nothing)) getloop buf cont = getchar >>= \case