summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamar Christina <tamar@zhox.com>2017-08-29 22:59:38 +0100
committerTamar Christina <tamar@zhox.com>2017-08-29 22:59:38 +0100
commit3c6b2fc3b5ca11a5410405664e4640767ef941dd (patch)
tree0535048a7de1f2bf7d8d4aaa24ea723c927d8c5c
parent895a7650a038131f3043f882c558c627abe9a61e (diff)
downloadhaskell-3c6b2fc3b5ca11a5410405664e4640767ef941dd.tar.gz
Fix decomposition error on Windows
Summary: Fix the path decomposition error that occurs when the Symlink resolver fails. `Win32.try` throws an exception, so catch it and assume the path isn't a symlink to use the old behavior. Test Plan: ./validate Reviewers: austin, bgamari Reviewed By: bgamari Subscribers: rwbarton, thomie GHC Trac Issues: #14159 Differential Revision: https://phabricator.haskell.org/D3891
-rw-r--r--compiler/main/SysTools.hs13
1 files changed, 11 insertions, 2 deletions
diff --git a/compiler/main/SysTools.hs b/compiler/main/SysTools.hs
index 57d77a3a13..b48bbf4202 100644
--- a/compiler/main/SysTools.hs
+++ b/compiler/main/SysTools.hs
@@ -1340,9 +1340,18 @@ getFinalPath name = do
(fILE_ATTRIBUTE_NORMAL .|. fILE_FLAG_BACKUP_SEMANTICS)
Nothing
let fnPtr = makeGetFinalPathNameByHandle $ castPtrToFunPtr addr
- path <- Win32.try "GetFinalPathName"
+ -- First try to resolve the path to get the actual path
+ -- of any symlinks or other file system redirections that
+ -- may be in place. However this function can fail, and in
+ -- the event it does fail, we need to try using the
+ -- original path and see if we can decompose that.
+ -- If the call fails Win32.try will raise an exception
+ -- that needs to be caught. See #14159
+ path <- (Win32.try "GetFinalPathName"
(\buf len -> fnPtr handle buf len 0) 512
- `finally` closeHandle handle
+ `finally` closeHandle handle)
+ `catch`
+ (\(_ :: IOException) -> return name)
return $ Just path
type GetFinalPath = HANDLE -> LPTSTR -> DWORD -> DWORD -> IO DWORD