From d40236805d287003d49fedce1475ac4dd83e575d Mon Sep 17 00:00:00 2001 From: John MacFarlane <jgm@berkeley.edu> Date: Fri, 4 Feb 2022 09:47:07 -0800 Subject: [PATCH] MediaBag: improve detection of absolute paths. Previously we used System.FilePath's isRelative to determine when paths are relative (since absolute paths need to get a new name based on the sha1 hash). But this has an OS-specific behavior and actually returns True on Windows for paths like `/media/file.png`. This ought to fix #7881. --- src/Text/Pandoc/Class/IO.hs | 3 ++- src/Text/Pandoc/MediaBag.hs | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Text/Pandoc/Class/IO.hs b/src/Text/Pandoc/Class/IO.hs index 5d4dbc715..816d71048 100644 --- a/src/Text/Pandoc/Class/IO.hs +++ b/src/Text/Pandoc/Class/IO.hs @@ -53,6 +53,7 @@ import Network.URI (unEscapeString) import System.Directory (createDirectoryIfMissing) import System.Environment (getEnv) import System.FilePath ((</>), takeDirectory, normalise) +import qualified System.FilePath.Posix as Posix import System.IO (stderr) import System.IO.Error import System.Random (StdGen) @@ -234,6 +235,6 @@ adjustImagePath dir mediabag (Image attr lab (src, tit)) = case lookupMedia (T.unpack src) mediabag of Nothing -> Image attr lab (src, tit) Just item -> - let fullpath = dir <> "/" <> mediaPath item + let fullpath = dir Posix.</> mediaPath item in Image attr lab (T.pack fullpath, tit) adjustImagePath _ _ x = x diff --git a/src/Text/Pandoc/MediaBag.hs b/src/Text/Pandoc/MediaBag.hs index df71ff813..e10124664 100644 --- a/src/Text/Pandoc/MediaBag.hs +++ b/src/Text/Pandoc/MediaBag.hs @@ -29,6 +29,8 @@ import qualified Data.Map as M import Data.Maybe (fromMaybe, isNothing) import Data.Typeable (Typeable) import System.FilePath +import qualified System.FilePath.Posix as Posix +import qualified System.FilePath.Windows as Windows import Text.Pandoc.MIME (MimeType, getMimeTypeDef, extensionFromMimeType) import Data.Text (Text) import qualified Data.Text as T @@ -78,7 +80,8 @@ insertMedia fp mbMime contents (MediaBag mediamap) = , mediaMimeType = mt } fp' = canonicalize fp uri = parseURI fp - newpath = if isRelative fp + newpath = if Posix.isRelative fp + && Windows.isRelative fp && isNothing uri && ".." `notElem` splitDirectories fp then T.unpack fp'