@@ -1041,8 +1041,20 @@ inlinesBetween start end =
10411041 where inner = innerSpace <|> (notFollowedBy' whitespace >> inline)
10421042 innerSpace = try $ whitespace >>~ notFollowedBy' end
10431043
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
1048+nested p = do
1049+ nestlevel <- stateMaxNestingLevel `fmap` getState
1050+ guard $ nestlevel > 0
1051+ updateState $ \st -> st{ stateMaxNestingLevel = stateMaxNestingLevel st - 1 }
1052+ res <- p
1053+ updateState $ \st -> st{ stateMaxNestingLevel = nestlevel }
1054+ return res
1055+
10441056emph :: GenParser Char ParserState Inline
1045−emph = Emph `liftM`
1057+emph = Emph `fmap` nested
10461058 (inlinesBetween starStart starEnd <|> inlinesBetween ulStart ulEnd)
10471059 where starStart = char '*' >> lookAhead nonspaceChar
10481060 starEnd = notFollowedBy' strong >> char '*'
@@ -1050,7 +1062,7 @@ emph = Emph `liftM`
10501062 ulEnd = notFollowedBy' strong >> char '_'
10511063
10521064strong :: GenParser Char ParserState Inline
1053−strong = Strong `liftM`
1065+strong = Strong `liftM` nested
10541066 (inlinesBetween starStart starEnd <|> inlinesBetween ulStart ulEnd)
10551067 where starStart = string "**" >> lookAhead nonspaceChar
10561068 starEnd = try $ string "**"