#44, isValid \0 now returns False
authorNeil Mitchell <ndmitchell@gmail.com>
Thu, 23 Apr 2015 14:19:35 +0000 (15:19 +0100)
committerNeil Mitchell <ndmitchell@gmail.com>
Thu, 23 Apr 2015 14:19:35 +0000 (15:19 +0100)
System/FilePath/Internal.hs
changelog.md
tests/TestGen.hs

index 051e44c..42bc19b 100644 (file)
@@ -843,6 +843,7 @@ badElements = ["CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5
 -- | Is a FilePath valid, i.e. could you create a file like it?
 --
 -- >          isValid "" == False
+-- >          isValid "\0" == False
 -- > Posix:   isValid "/random_ path:*" == True
 -- > Posix:   isValid x == not (null x)
 -- > Windows: isValid "c:\\test" == True
@@ -856,6 +857,7 @@ badElements = ["CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5
 -- > Windows: isValid "\\\\?\\D:file" == False
 isValid :: FilePath -> Bool
 isValid "" = False
+isValid x | '\0' `elem` x = False
 isValid _ | isPosix = True
 isValid path =
         not (any (`elem` badCharacters) x2) &&
@@ -872,6 +874,7 @@ isValid path =
 -- > isValid (makeValid x)
 -- > isValid x ==> makeValid x == x
 -- > makeValid "" == "_"
+-- > makeValid "file\0name" == "file_name"
 -- > Windows: makeValid "c:\\already\\/valid" == "c:\\already\\/valid"
 -- > Windows: makeValid "c:\\test:of_test" == "c:\\test_of_test"
 -- > Windows: makeValid "test*" == "test_"
@@ -884,7 +887,7 @@ isValid path =
 makeValid :: FilePath -> FilePath
 makeValid "" = "_"
 makeValid path
-        | isPosix = path
+        | isPosix = map (\x -> if x == '\0' then '_' else x) path
         | isJust (readDriveShare drv) && all isPathSeparator drv = take 2 drv ++ "drive"
         | isJust (readDriveUNC drv) && not (hasTrailingPathSeparator drv) =
             makeValid (drv ++ [pathSeparator] ++ pth)
@@ -893,7 +896,7 @@ makeValid path
         (drv,pth) = splitDrive path
 
         validChars = map f
-        f x | x `elem` badCharacters = '_'
+        f x | x `elem` badCharacters || x == '\0' = '_'
             | otherwise = x
 
         validElements x = joinPath $ map g $ splitPath x
index 6c36406..902754e 100644 (file)
@@ -2,6 +2,8 @@
 
 _Note: below all `FilePath` values are unquoted, so `\\` really means two backslashes._
 
+ * Bug fix: `isValid "\0"` now returns `False`, instead of `True`
+
 ## 1.4.0.0  *Mar 2015*
 
   * Bundled with GHC 7.10.1
index a96ad54..9bb3ebe 100755 (executable)
@@ -369,6 +369,8 @@ tests =
     ,("P.normalise \"//home\" == \"/home\"", test $ P.normalise "//home" == "/home")
     ,("P.isValid \"\" == False", test $ P.isValid "" == False)
     ,("W.isValid \"\" == False", test $ W.isValid "" == False)
+    ,("P.isValid \"\\0\" == False", test $ P.isValid "\0" == False)
+    ,("W.isValid \"\\0\" == False", test $ W.isValid "\0" == False)
     ,("P.isValid \"/random_ path:*\" == True", test $ P.isValid "/random_ path:*" == True)
     ,("P.isValid x == not (null x)", test $ \(QFilePath x) -> P.isValid x == not (null x))
     ,("W.isValid \"c:\\\\test\" == True", test $ W.isValid "c:\\test" == True)
@@ -386,6 +388,8 @@ tests =
     ,("W.isValid x ==> W.makeValid x == x", test $ \(QFilePath x) -> W.isValid x ==> W.makeValid x == x)
     ,("P.makeValid \"\" == \"_\"", test $ P.makeValid "" == "_")
     ,("W.makeValid \"\" == \"_\"", test $ W.makeValid "" == "_")
+    ,("P.makeValid \"file\\0name\" == \"file_name\"", test $ P.makeValid "file\0name" == "file_name")
+    ,("W.makeValid \"file\\0name\" == \"file_name\"", test $ W.makeValid "file\0name" == "file_name")
     ,("W.makeValid \"c:\\\\already\\\\/valid\" == \"c:\\\\already\\\\/valid\"", test $ W.makeValid "c:\\already\\/valid" == "c:\\already\\/valid")
     ,("W.makeValid \"c:\\\\test:of_test\" == \"c:\\\\test_of_test\"", test $ W.makeValid "c:\\test:of_test" == "c:\\test_of_test")
     ,("W.makeValid \"test*\" == \"test_\"", test $ W.makeValid "test*" == "test_")