git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Added code to handleIncludes to avoid inf loops.

e.g. when one file includes another which includes it.

commitda87837318cf035be407136b39c5ec6a0009adb4 authorJohn MacFarlane <fiddlosopher@gmail.com> dateThu 1 Nov 2012, 10:17 (14 years ago) parent6dff7dc
1 file changed+14−8
src/Text/Pandoc/Readers/LaTeX.hs+14−8
src/Text/Pandoc/Readers/LaTeX.hs+14−8
@@ -681,16 +681,22 @@ rawEnv name = do
681681
682682-- | Replace "include" commands with file contents.
683683handleIncludes :: String -> IO String
684−handleIncludes [] = return []
685−handleIncludes ('\\':xs) =
684+handleIncludes = handleIncludes' []
685+
686+-- parents parameter prevents infinite include loops
687+handleIncludes' :: [FilePath] -> String -> IO String
688+handleIncludes' _ [] = return []
689+handleIncludes' parents ('\\':xs) =
686690 case runParser include defaultParserState "input" ('\\':xs) of
687− Right (fs, rest) -> do yss <- mapM readTeXFile fs
688− handleIncludes $ intercalate "\n" yss ++ rest
691+ Right (fs, rest) -> do yss <- mapM readTeXFile
692+ [f | f <- fs, f `notElem` parents]
693+ handleIncludes' (parents ++ fs) $
694+ intercalate "\n" yss ++ rest
689695 _ -> case runParser (verbCmd <|> verbatimEnv) defaultParserState
690− "input" ('\\':xs) of
691− Right (r, rest) -> (r ++) `fmap` handleIncludes rest
692− _ -> ('\\':) `fmap` handleIncludes xs
693−handleIncludes (x:xs) = (x:) `fmap` handleIncludes xs
696+ "input" ('\\':xs) of
697+ Right (r, rest) -> (r ++) `fmap` handleIncludes' parents rest
698+ _ -> ('\\':) `fmap` handleIncludes' parents xs
699+handleIncludes' parents (x:xs) = (x:) `fmap` handleIncludes' parents xs
694700
695701readTeXFile :: FilePath -> IO String
696702readTeXFile f = do