summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <bgamari.foss@gmail.com>2017-04-21 12:10:33 -0400
committerBen Gamari <ben@smart-cactus.org>2017-04-21 12:10:42 -0400
commite134af010bdd0d2a94fbfd68e0605dc55e1be3a8 (patch)
tree61632b07212f79e4622b149c64d53ba34ccbdada
parenta1ffd70835fba3aeb5be5c5d526e068cafe277be (diff)
downloadhaskell-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.hsc5
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