cmark 0.5.6 → 0.5.6.1
raw patch · 3 files changed
+37/−24 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- CMark: Node :: (Maybe PosInfo) -> NodeType -> [Node] -> Node
+ CMark: Node :: Maybe PosInfo -> NodeType -> [Node] -> Node
Files
- CMark.hsc +21/−22
- changelog +15/−1
- cmark.cabal +1/−1
CMark.hsc view
@@ -40,8 +40,8 @@ import Data.Typeable (Typeable) import Data.Text (Text, empty) import qualified Data.Text.Foreign as TF-import qualified Data.ByteString as B-import Data.Text.Encoding (encodeUtf8)+import Data.ByteString.Unsafe (unsafePackMallocCString)+import Data.Text.Encoding (decodeUtf8) import Control.Applicative ((<$>), (<*>)) #include <cmark.h>@@ -102,7 +102,7 @@ fptr <- newForeignPtr c_cmark_node_free nptr withForeignPtr fptr $ \ptr -> do cstr <- renderer ptr (combineOptions opts) (fromMaybe 0 mbWidth)- TF.peekCStringLen (cstr, c_strlen cstr)+ decodeUtf8 <$> unsafePackMallocCString cstr commonmarkToX :: Renderer -> [CMarkOption]@@ -116,8 +116,7 @@ fptr <- newForeignPtr c_cmark_node_free nptr withForeignPtr fptr $ \p -> do str <- renderer p opts' (fromMaybe 0 mbWidth)- t <- TF.peekCStringLen $! (str, c_strlen str)- return t+ decodeUtf8 <$> unsafePackMallocCString str type NodePtr = Ptr () @@ -255,7 +254,7 @@ -> return SOFTBREAK #const CMARK_NODE_LINEBREAK -> return LINEBREAK- _ -> error "Unknown node type"+ _ -> error $ "Unknown node type: " ++ show nodeType where literal = c_cmark_node_get_literal ptr >>= totext level = c_cmark_node_get_heading_level ptr onEnter = c_cmark_node_get_on_enter ptr >>= totext@@ -317,17 +316,17 @@ BLOCK_QUOTE -> c_cmark_node_new (#const CMARK_NODE_BLOCK_QUOTE) HTML_BLOCK literal -> do n <- c_cmark_node_new (#const CMARK_NODE_HTML_BLOCK)- c_cmark_node_set_literal n =<< fromtext literal+ withtext literal (c_cmark_node_set_literal n) return n CUSTOM_BLOCK onEnter onExit -> do n <- c_cmark_node_new (#const CMARK_NODE_CUSTOM_BLOCK)- c_cmark_node_set_on_enter n =<< fromtext onEnter- c_cmark_node_set_on_exit n =<< fromtext onExit+ withtext onEnter (c_cmark_node_set_on_enter n)+ withtext onExit (c_cmark_node_set_on_exit n) return n CODE_BLOCK info literal -> do n <- c_cmark_node_new (#const CMARK_NODE_CODE_BLOCK)- c_cmark_node_set_literal n =<< fromtext literal- c_cmark_node_set_fence_info n =<< fromtext info+ withtext literal (c_cmark_node_set_literal n)+ withtext info (c_cmark_node_set_fence_info n) return n LIST attr -> do n <- c_cmark_node_new (#const CMARK_NODE_LIST)@@ -349,30 +348,30 @@ STRONG -> c_cmark_node_new (#const CMARK_NODE_STRONG) LINK url title -> do n <- c_cmark_node_new (#const CMARK_NODE_LINK)- c_cmark_node_set_url n =<< fromtext url- c_cmark_node_set_title n =<< fromtext title+ withtext url (c_cmark_node_set_url n)+ withtext title (c_cmark_node_set_title n) return n IMAGE url title -> do n <- c_cmark_node_new (#const CMARK_NODE_IMAGE)- c_cmark_node_set_url n =<< fromtext url- c_cmark_node_set_title n =<< fromtext title+ withtext url (c_cmark_node_set_url n)+ withtext title (c_cmark_node_set_title n) return n TEXT literal -> do n <- c_cmark_node_new (#const CMARK_NODE_TEXT)- c_cmark_node_set_literal n =<< fromtext literal+ withtext literal (c_cmark_node_set_literal n) return n CODE literal -> do n <- c_cmark_node_new (#const CMARK_NODE_CODE)- c_cmark_node_set_literal n =<< fromtext literal+ withtext literal (c_cmark_node_set_literal n) return n HTML_INLINE literal -> do n <- c_cmark_node_new (#const CMARK_NODE_HTML_INLINE)- c_cmark_node_set_literal n =<< fromtext literal+ withtext literal (c_cmark_node_set_literal n) return n CUSTOM_INLINE onEnter onExit -> do n <- c_cmark_node_new (#const CMARK_NODE_CUSTOM_INLINE)- c_cmark_node_set_on_enter n =<< fromtext onEnter- c_cmark_node_set_on_exit n =<< fromtext onExit+ withtext onEnter (c_cmark_node_set_on_enter n)+ withtext onExit (c_cmark_node_set_on_exit n) return n SOFTBREAK -> c_cmark_node_new (#const CMARK_NODE_SOFTBREAK) LINEBREAK -> c_cmark_node_new (#const CMARK_NODE_LINEBREAK)@@ -384,8 +383,8 @@ | str == nullPtr = return empty | otherwise = TF.peekCStringLen (str, c_strlen str) -fromtext :: Text -> IO CString-fromtext t = B.useAsCString (encodeUtf8 t) return+withtext :: Text -> (CString -> IO a) -> IO a+withtext t f = TF.withCStringLen t (f . fst) foreign import ccall "string.h strlen" c_strlen :: CString -> Int
changelog view
@@ -1,4 +1,18 @@-cmark 0.5.5.1 (02 Aug 2017)+cmark 0.5.6.1 (11 Mar 2019)++ * Fix CString memory leaks (Anders Kaseorg). The renderer functions return+ a malloc’d string which the caller is expected to free.++ * Fix use-after-free bugs (Anders Kaseorg). `useAsCString` frees the+ CString after the IO action finishes executing, so passing `return` as that+ action can never be correct. To make sure the CString gets freed at the+ right time, we need a “with”-style abstraction, not just a conversion+ function. While we’re here replace this with `withCStringLen`, which also+ makes fewer copies.++ * Show node type on error for unknown node type.++cmark 0.5.6 (02 Aug 2017) * Update to cmark 0.28.0.
cmark.cabal view
@@ -1,5 +1,5 @@ name: cmark-version: 0.5.6+version: 0.5.6.1 synopsis: Fast, accurate CommonMark (Markdown) parser and renderer description: This package provides Haskell bindings for