[GHC] #13599: Something is fishy in Windows hLock implementation

GHC ghc-devs at haskell.org
Thu Apr 20 22:21:28 UTC 2017


#13599: Something is fishy in Windows hLock implementation
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.2.1
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by arybczak):

 Well, this is embarrassing. I just took a look at the definition of
 `fillBytes` and it looks like the arguments in `lockImpl` are passed
 backwards, so instead of filling sizeof_OVERLAPPED bytes with value 0 it
 fills 0 bytes with value sizeof_OVERLAPPED, leaving it effectively
 uninitialized.

 I believe the following should do the trick:
 {{{#!diff
 diff --git a/libraries/base/GHC/IO/Handle/Lock.hsc
 b/libraries/base/GHC/IO/Handle/Lock.hsc
 index 5608c1810c..3e790a233a 100644
 --- a/libraries/base/GHC/IO/Handle/Lock.hsc
 +++ b/libraries/base/GHC/IO/Handle/Lock.hsc
 @@ -123,7 +123,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 +131,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
 }}}

 Should I make a Phab patch or you can do it?

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13599#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list