diff options
author | Joey Hess <joeyh@joeyh.name> | 2017-02-15 15:08:46 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2017-02-15 15:08:46 -0400 |
commit | 6892102ea2ef394de2a9802aa36dfe19761f37dd (patch) | |
tree | 3e90dcf2faf1db369ffa601bb858cf334364fc28 /Annex | |
parent | ebd15a59b4453e4e99a3a7225f50b897dd83653a (diff) |
Run ssh with -n whenever input is not being piped into it
... to avoid it consuming stdin that it shouldn't.
This fixes git-annex-checkpresentkey --batch remote, which didn't output
results for all keys passed into it.
Other git-annex commands that communicate with a remote over ssh may also
have been consuming stdin that they shouldn't have, which could have
impacted using them in eg, shell scripts. For example, a shell script
reading files from stdin and passing them to git annex drop would be
impacted by this bug, whenever git annex drop ran git-annex-shell
checkpresent, it would consume part/all of the stdin that the shell script
was supposed to consume.
Fixed by adding a ConsumeStdin parameter to Annex.Ssh.sshOptions, which
is used throughout git-annex to run ssh (in order for ssh connection
caching to work). Every call site was checked to see if it used
CreatePipe for stdin, and if not was marked NoConsumeStdin.
Diffstat (limited to 'Annex')
-rw-r--r-- | Annex/Ssh.hs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/Annex/Ssh.hs b/Annex/Ssh.hs index 512f0375c..285680f25 100644 --- a/Annex/Ssh.hs +++ b/Annex/Ssh.hs @@ -1,6 +1,6 @@ {- git-annex ssh interface, with connection caching - - - Copyright 2012-2015 Joey Hess <id@joeyh.name> + - Copyright 2012-2017 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -} @@ -8,6 +8,7 @@ {-# LANGUAGE CPP #-} module Annex.Ssh ( + ConsumeStdin(..), sshOptions, sshCacheDir, sshReadPort, @@ -41,10 +42,15 @@ import Annex.Perms import Annex.LockPool #endif +{- Some ssh commands are fed stdin on a pipe and so should be allowed to + - consume it. But ssh commands that are not piped stdin should generally + - not be allowed to consume the process's stdin. -} +data ConsumeStdin = ConsumeStdin | NoConsumeStdin + {- Generates parameters to ssh to a given host (or user@host) on a given - port. This includes connection caching parameters, and any ssh-options. -} -sshOptions :: (String, Maybe Integer) -> RemoteGitConfig -> [CommandParam] -> Annex [CommandParam] -sshOptions (host, port) gc opts = go =<< sshCachingInfo (host, port) +sshOptions :: ConsumeStdin -> (String, Maybe Integer) -> RemoteGitConfig -> [CommandParam] -> Annex [CommandParam] +sshOptions cs (host, port) gc opts = go =<< sshCachingInfo (host, port) where go (Nothing, params) = ret params go (Just socketfile, params) = do @@ -55,6 +61,9 @@ sshOptions (host, port) gc opts = go =<< sshCachingInfo (host, port) , map Param (remoteAnnexSshOptions gc) , opts , portParams port + , case cs of + ConsumeStdin -> [] + NoConsumeStdin -> [Param "-n"] , [Param "-T"] ] |