summaryrefslogtreecommitdiff
path: root/Annex/Ssh.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-09-13 19:26:39 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-09-13 19:26:39 -0400
commit5573911d25e51c3434f1666ee415a0c0781714fc (patch)
treea1fef80f88909e70136d0e9685321935ba32716f /Annex/Ssh.hs
parent60c31afc3804734e8c85b1d3f4a530b9cdaf8b5e (diff)
Disable ssh connection caching if the path to the control socket would be too long (and use relative path to minimise path to the control socket).
Diffstat (limited to 'Annex/Ssh.hs')
-rw-r--r--Annex/Ssh.hs21
1 files changed, 20 insertions, 1 deletions
diff --git a/Annex/Ssh.hs b/Annex/Ssh.hs
index 8bd4fe33a..46885393c 100644
--- a/Annex/Ssh.hs
+++ b/Annex/Ssh.hs
@@ -42,7 +42,13 @@ sshInfo (host, port) = ifM caching
( do
dir <- fromRepo gitAnnexSshDir
let socketfile = dir </> hostport2socket host port
- return (Just socketfile, cacheParams socketfile)
+ if valid_unix_socket_path socketfile
+ then return (Just socketfile, cacheParams socketfile)
+ else do
+ socketfile' <- liftIO $ relPathCwdToFile socketfile
+ if valid_unix_socket_path socketfile'
+ then return (Just socketfile', cacheParams socketfile')
+ else return (Nothing, [])
, return (Nothing, [])
)
where
@@ -118,3 +124,16 @@ isLock f = lockExt `isSuffixOf` f
lockExt :: String
lockExt = ".lock"
+
+{- This is the size of the sun_path component of sockaddr_un, which
+ - is the limit to the total length of the filename of a unix socket.
+ -
+ - On Linux, this is 108. On OSX, 104. TODO: Probe
+ -}
+sizeof_sockaddr_un_sun_path :: Int
+sizeof_sockaddr_un_sun_path = 100
+
+{- Note that this looks at the true length of the path in bytes, as it will
+ - appear on disk. -}
+valid_unix_socket_path :: FilePath -> Bool
+valid_unix_socket_path f = length (decodeW8 f) < sizeof_sockaddr_un_sun_path