diff options
author | Ben Gamari <bgamari.foss@gmail.com> | 2017-04-21 12:10:33 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-04-21 12:10:42 -0400 |
commit | e134af010bdd0d2a94fbfd68e0605dc55e1be3a8 (patch) | |
tree | 61632b07212f79e4622b149c64d53ba34ccbdada | |
parent | a1ffd70835fba3aeb5be5c5d526e068cafe277be (diff) | |
download | haskell-e134af010bdd0d2a94fbfd68e0605dc55e1be3a8.tar.gz |
base: Fix offset initialization of Windows hLock implementation
The previous implementation swapped the buffer size with the byte to be
set, essentially resulting in an uninitialized buffer.
Test Plan: Validate on Windows
Reviewers: austin, hvr
Subscribers: rwbarton, thomie
GHC Trac Issues: #13599
Differential Revision: https://phabricator.haskell.org/D3478
-rw-r--r-- | libraries/base/GHC/IO/Handle/Lock.hsc | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/libraries/base/GHC/IO/Handle/Lock.hsc b/libraries/base/GHC/IO/Handle/Lock.hsc index 5608c1810c..ebb3ce4a4e 100644 --- a/libraries/base/GHC/IO/Handle/Lock.hsc +++ b/libraries/base/GHC/IO/Handle/Lock.hsc @@ -45,7 +45,6 @@ import Foreign.Marshal.Utils import GHC.IO.FD import GHC.IO.Handle.FD import GHC.Ptr -import GHC.Real import GHC.Windows #endif @@ -123,7 +122,7 @@ lockImpl h ctx mode block = do FD{fdFD = fd} <- handleToFd h wh <- throwErrnoIf (== iNVALID_HANDLE_VALUE) ctx $ c_get_osfhandle fd allocaBytes sizeof_OVERLAPPED $ \ovrlpd -> do - fillBytes ovrlpd (fromIntegral sizeof_OVERLAPPED) 0 + fillBytes ovrlpd 0 sizeof_OVERLAPPED let flags = cmode .|. (if block then 0 else #{const LOCKFILE_FAIL_IMMEDIATELY}) -- We want to lock the whole file without looking up its size to be -- consistent with what flock does. According to documentation of LockFileEx @@ -131,7 +130,7 @@ lockImpl h ctx mode block = do -- not an error", however some versions of Windows seem to have issues with -- large regions and set ERROR_INVALID_LOCK_RANGE in such case for -- mysterious reasons. Work around that by setting only low 32 bits. - fix $ \retry -> c_LockFileEx wh flags 0 0xffffffff 0x0 ovrlpd >>= \case + fix $ \retry -> c_LockFileEx wh flags 0 0xffffffff 0xffffffff ovrlpd >>= \case True -> return True False -> getLastError >>= \err -> if | not block && err == #{const ERROR_LOCK_VIOLATION} -> return False |