Skip to content
This repository was archived by the owner on Jan 18, 2020. It is now read-only.
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion OpenSSL/EVP/Internal.hsc
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,12 @@ import qualified Data.ByteString.Char8 as B8
import qualified Data.ByteString.Lazy.Char8 as L8
import qualified Data.ByteString.Lazy.Internal as L8
import Control.Applicative ((<$>))
import Control.Exception (mask, mask_, bracket_, onException)
import Foreign.C.Types (CChar)
#if __GLASGOW_HASKELL__ >= 703
import Control.Exception (mask, mask_, bracket_, onException)
import Foreign.C.Types (CInt(..), CUInt(..), CSize(..))
#else
import Control.Exception (block, unblock, bracket_, onException)
import Foreign.C.Types (CInt, CUInt, CSize)
#endif
import Foreign.Ptr (Ptr, castPtr, FunPtr)
Expand Down Expand Up @@ -104,10 +105,17 @@ foreign import ccall unsafe "HsOpenSSL_EVP_CIPHER_CTX_block_size"
newCipherCtx :: IO CipherCtx
newCipherCtx = do
ctx <- mallocForeignPtrBytes (#size EVP_CIPHER_CTX)
#if __GLASGOW_HASKELL__ >= 703
mask_ $ do
withForeignPtr ctx _cipher_ctx_init
addForeignPtrFinalizer _cipher_ctx_cleanup ctx
return $ CipherCtx ctx
#else
block $ do
withForeignPtr ctx _cipher_ctx_init
addForeignPtrFinalizer _cipher_ctx_cleanup ctx
unblock $ return $ CipherCtx ctx
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need 'unblock' in the last line?

return $ CipherCtx ctx

#endif

withCipherCtxPtr :: CipherCtx -> (Ptr EVP_CIPHER_CTX -> IO a) -> IO a
withCipherCtxPtr (CipherCtx ctx) = withForeignPtr ctx
Expand Down Expand Up @@ -186,10 +194,17 @@ foreign import ccall unsafe "&EVP_MD_CTX_cleanup"
newDigestCtx :: IO DigestCtx
newDigestCtx = do
ctx <- mallocForeignPtrBytes (#size EVP_MD_CTX)
#if __GLASGOW_HASKELL__ >= 703
mask_ $ do
withForeignPtr ctx _md_ctx_init
addForeignPtrFinalizer _md_ctx_cleanup ctx
return $ DigestCtx ctx
#else
block $ do
withForeignPtr ctx _md_ctx_init
addForeignPtrFinalizer _md_ctx_cleanup ctx
unblock $ return $ DigestCtx ctx
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise.

return $ DigestCtx ctx

#endif

withDigestCtxPtr :: DigestCtx -> (Ptr EVP_MD_CTX -> IO a) -> IO a
withDigestCtxPtr (DigestCtx ctx) = withForeignPtr ctx
Expand Down Expand Up @@ -286,10 +301,17 @@ wrapPKeyPtr :: Ptr EVP_PKEY -> IO VaguePKey
wrapPKeyPtr = fmap VaguePKey . newForeignPtr _pkey_free

createPKey :: (Ptr EVP_PKEY -> IO a) -> IO VaguePKey
#if __GLASGOW_HASKELL__ >= 703
createPKey f = mask $ \restore -> do
ptr <- _pkey_new >>= failIfNull
(restore $ f ptr >> return ()) `onException` _pkey_free' ptr
wrapPKeyPtr ptr
#else
createPKey f = block $ do
ptr <- _pkey_new >>= failIfNull
(f ptr >> return ()) `onException` _pkey_free' ptr
unblock $ wrapPKeyPtr ptr
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be something like this?

createPKey f = block $ do
  ptr <- _pkey_new >>= failIfNull
  (unblock $ f ptr >> return ()) `onException` _pkey_free' ptr
  wrapPKeyPtr ptr

#endif

withPKeyPtr :: VaguePKey -> (Ptr EVP_PKEY -> IO a) -> IO a
withPKeyPtr (VaguePKey pkey) = withForeignPtr pkey
Expand Down