@@ -1041,8 +1041,20 @@ inlinesBetween start end =
1041 where inner = innerSpace <|> (notFollowedBy' whitespace >> inline)
1041 where inner = innerSpace <|> (notFollowedBy' whitespace >> inline)
1042 innerSpace = try $ whitespace >>~ notFollowedBy' end
1042 innerSpace = try $ whitespace >>~ notFollowedBy' end
1044+-- This is used to prevent exponential blowups for things like:
1045+-- a**a*a**a*a**a*a**a*a**a*a**a*a**
1046+nested :: GenParser Char ParserState a
1047+ -> GenParser Char ParserState a
1049+ nestlevel <- stateMaxNestingLevel `fmap` getState
1050+ guard $ nestlevel > 0
1051+ updateState $ \st -> st{ stateMaxNestingLevel = stateMaxNestingLevel st - 1 }
1053+ updateState $ \st -> st{ stateMaxNestingLevel = nestlevel }
1044emph :: GenParser Char ParserState Inline
1056emph :: GenParser Char ParserState Inline
1045−emph = Emph `liftM`
1057+emph = Emph `fmap` nested
1046 (inlinesBetween starStart starEnd <|> inlinesBetween ulStart ulEnd)
1058 (inlinesBetween starStart starEnd <|> inlinesBetween ulStart ulEnd)
1047 where starStart = char '*' >> lookAhead nonspaceChar
1059 where starStart = char '*' >> lookAhead nonspaceChar
1048 starEnd = notFollowedBy' strong >> char '*'
1060 starEnd = notFollowedBy' strong >> char '*'
@@ -1050,7 +1062,7 @@ emph = Emph `liftM`
1050 ulEnd = notFollowedBy' strong >> char '_'
1062 ulEnd = notFollowedBy' strong >> char '_'
1052strong :: GenParser Char ParserState Inline
1064strong :: GenParser Char ParserState Inline
1053−strong = Strong `liftM`
1065+strong = Strong `liftM` nested
1054 (inlinesBetween starStart starEnd <|> inlinesBetween ulStart ulEnd)
1066 (inlinesBetween starStart starEnd <|> inlinesBetween ulStart ulEnd)
1055 where starStart = string "**" >> lookAhead nonspaceChar
1067 where starStart = string "**" >> lookAhead nonspaceChar
1056 starEnd = try $ string "**"
1068 starEnd = try $ string "**"