From e23028d19b493c7abae0dffb96da44591aacca7b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 1 Nov 2016 14:03:55 -0400 Subject: [PATCH] restart coprocess in raw mode Restarting a crashing git process could result in filename encoding issues when not in a unicode locale, as the restarted processes's handles were not read in raw mode. Since rawMode is always used when starting a coprocess, didn't bother to parameterise it and just always enable it for simplicity. This commit was sponsored by Jake Vosloo on Patreon. --- CHANGELOG | 8 ++++++++ Git/CatFile.hs | 2 +- Git/CheckAttr.hs | 2 +- Git/CheckIgnore.hs | 2 +- Git/HashObject.hs | 2 +- Git/Tree.hs | 2 +- Utility/CoProcess.hs | 22 ++++++++-------------- 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 6a1301b3eb..a939435cf4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,11 @@ +git-annex (6.20161032) UNRELEASED; urgency=medium + + * Restarting a crashing git process could result in filename encoding + issues when not in a unicode locale, as the restarted processes's + handles were not read in raw mode. + + -- Joey Hess Tue, 01 Nov 2016 14:02:06 -0400 + git-annex (6.20161031) unstable; urgency=medium * Assistant, repair: Fix ignoring of git fsck errors due to diff --git a/Git/CatFile.hs b/Git/CatFile.hs index 9af46fb515..061349f054 100644 --- a/Git/CatFile.hs +++ b/Git/CatFile.hs @@ -51,7 +51,7 @@ catFileStart' restartable repo = CatFileHandle <$> startp "--batch" <*> startp "--batch-check=%(objectname) %(objecttype) %(objectsize)" where - startp p = CoProcess.rawMode =<< gitCoProcessStart restartable + startp p = gitCoProcessStart restartable [ Param "cat-file" , Param p ] repo diff --git a/Git/CheckAttr.hs b/Git/CheckAttr.hs index b94bc0ee16..a248f49822 100644 --- a/Git/CheckAttr.hs +++ b/Git/CheckAttr.hs @@ -24,7 +24,7 @@ type Attr = String checkAttrStart :: [Attr] -> Repo -> IO CheckAttrHandle checkAttrStart attrs repo = do currdir <- getCurrentDirectory - h <- CoProcess.rawMode =<< gitCoProcessStart True params repo + h <- gitCoProcessStart True params repo oldgit <- Git.Version.older "1.7.7" return (h, attrs, oldgit, currdir) where diff --git a/Git/CheckIgnore.hs b/Git/CheckIgnore.hs index 7d30e5ada9..594882a81d 100644 --- a/Git/CheckIgnore.hs +++ b/Git/CheckIgnore.hs @@ -37,7 +37,7 @@ type CheckIgnoreHandle = CoProcess.CoProcessHandle -} checkIgnoreStart :: Repo -> IO (Maybe CheckIgnoreHandle) checkIgnoreStart repo = ifM supportedGitVersion - ( Just <$> (CoProcess.rawMode =<< gitCoProcessStart True params repo') + ( Just <$> gitCoProcessStart True params repo' , return Nothing ) where diff --git a/Git/HashObject.hs b/Git/HashObject.hs index ed3baf4c6e..4cd54ef54c 100644 --- a/Git/HashObject.hs +++ b/Git/HashObject.hs @@ -20,7 +20,7 @@ import Utility.Tmp type HashObjectHandle = CoProcess.CoProcessHandle hashObjectStart :: Repo -> IO HashObjectHandle -hashObjectStart = CoProcess.rawMode <=< gitCoProcessStart True +hashObjectStart = gitCoProcessStart True [ Param "hash-object" , Param "-w" , Param "--stdin-paths" diff --git a/Git/Tree.hs b/Git/Tree.hs index c341e1f5bf..282643f498 100644 --- a/Git/Tree.hs +++ b/Git/Tree.hs @@ -59,7 +59,7 @@ newtype MkTreeHandle = MkTreeHandle CoProcess.CoProcessHandle withMkTreeHandle :: (MonadIO m, MonadMask m) => Repo -> (MkTreeHandle -> m a) -> m a withMkTreeHandle repo a = bracketIO setup cleanup (a . MkTreeHandle) where - setup = CoProcess.rawMode =<< gitCoProcessStart False ps repo + setup = gitCoProcessStart False ps repo ps = [Param "mktree", Param "--batch", Param "-z"] cleanup = CoProcess.stop diff --git a/Utility/CoProcess.hs b/Utility/CoProcess.hs index 9854b47fcd..94d5ac3bc4 100644 --- a/Utility/CoProcess.hs +++ b/Utility/CoProcess.hs @@ -13,7 +13,6 @@ module Utility.CoProcess ( start, stop, query, - rawMode ) where import Common @@ -44,7 +43,15 @@ start numrestarts cmd params environ = do start' :: CoProcessSpec -> IO CoProcessState start' s = do (pid, from, to) <- startInteractiveProcess (coProcessCmd s) (coProcessParams s) (coProcessEnv s) + rawMode from + rawMode to return $ CoProcessState pid to from s + where + rawMode h = do + fileEncoding h +#ifdef mingw32_HOST_OS + hSetNewlineMode h noNewlineTranslation +#endif stop :: CoProcessHandle -> IO () stop ch = do @@ -79,16 +86,3 @@ query ch send receive = do { coProcessNumRestarts = coProcessNumRestarts (coProcessSpec s) - 1 } putMVar ch s' query ch send receive - -rawMode :: CoProcessHandle -> IO CoProcessHandle -rawMode ch = do - s <- readMVar ch - raw $ coProcessFrom s - raw $ coProcessTo s - return ch - where - raw h = do - fileEncoding h -#ifdef mingw32_HOST_OS - hSetNewlineMode h noNewlineTranslation -#endif