#3486: Data.ByteString.elemIndices causes SEGV
-------------------------------+--------------------------------------------
    Reporter:  nwn             |        Owner:  duncan 
        Type:  bug             |       Status:  new    
    Priority:  high            |    Milestone:  6.12.1 
   Component:  libraries/base  |      Version:  6.10.4 
    Severity:  normal          |   Resolution:         
    Keywords:                  |   Difficulty:  Unknown
    Testcase:                  |           Os:  MacOS X
Architecture:  x86             |  
-------------------------------+--------------------------------------------
Changes (by igloo):

  * priority:  normal => high
  * owner:  igloo => duncan

Comment:

 The problem is in `elemIndices`:
 {{{
 elemIndices :: Word8 -> ByteString -> [Int]
 elemIndices w (PS x s l) = inlinePerformIO $ withForeignPtr x $ \p -> do
     let ptr = p `plusPtr` s

         STRICT1(loop)
         loop n = let q = inlinePerformIO $ memchr (ptr `plusPtr` n)
                                                 w (fromIntegral (l - n))
                  in if q == nullPtr
                         then []
                         else let i = q `minusPtr` ptr
                              in i : loop (i+1)
     return $! loop 0
 }}}
 The lazy thunk using `p` escapes from the `withForeignPtr`, so `x` can be
 freed.
 Replacing `[]` with:
 {{{
                              inlinePerformIO $ do touchForeignPtr x
                                                   return []
 }}}
 makes the segfault go away.

 I'm assigning this to duncan so that he or Don can fix it in the upstream
 repo, and also check if any other functions have the same problem.

 I assume that this will also fix #3487.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3486#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to