base: Check for path separators chars in openTempFile' template string
authorBen Gamari <ben@smart-cactus.org>
Mon, 27 Mar 2017 16:40:42 +0000 (12:40 -0400)
committerBen Gamari <ben@smart-cactus.org>
Wed, 29 Mar 2017 18:23:29 +0000 (14:23 -0400)
This fixes #13489.

libraries/base/System/IO.hs

index d1ed9e3..1796200 100644 (file)
@@ -441,7 +441,8 @@ fixIO k = do
 openTempFile :: FilePath   -- ^ Directory in which to create the file
              -> String     -- ^ File name template. If the template is \"foo.ext\" then
                            -- the created file will be \"fooXXX.ext\" where XXX is some
-                           -- random number.
+                           -- random number. Note that this should not contain any path
+                           -- separator characters.
              -> IO (FilePath, Handle)
 openTempFile tmp_dir template
     = openTempFile' "openTempFile" tmp_dir template False 0o600
@@ -465,7 +466,10 @@ openBinaryTempFileWithDefaultPermissions tmp_dir template
 
 openTempFile' :: String -> FilePath -> String -> Bool -> CMode
               -> IO (FilePath, Handle)
-openTempFile' loc tmp_dir template binary mode = findTempName
+openTempFile' loc tmp_dir template binary mode
+    | pathSeparator `elem` template
+    = fail $ "openTempFile': Template string must not contain path separator characters: "++template
+    | otherwise = findTempName
   where
     -- We split off the last extension, so we can use .foo.ext files
     -- for temporary files (hidden on Unix OSes). Unfortunately we're