handle sha*sum's leading \ in checksum with certian unsual filenames

* Bugfix: Remove leading \ from checksums output by sha*sum commands,
  when the filename contains \ or a newline. Closes: #696384
* fsck: Still accept checksums with a leading \ as valid, now that
  above bug is fixed.
* migrate: Remove leading \ in checksums
This commit is contained in:
Joey Hess 2012-12-20 15:43:14 -04:00
parent 071adb0709
commit e71f85645e
6 changed files with 36 additions and 6 deletions

View file

@ -34,6 +34,7 @@ genBackend size = Just $ Backend
{ name = shaName size
, getKey = keyValue size
, fsckKey = Just $ checkKeyChecksum size
, canUpgradeKey = Just $ needsUpgrade
}
genBackendE :: SHASize -> Maybe Backend
@ -61,6 +62,8 @@ shaN shasize file filesize = do
parse command [] = bad command
parse command (l:_)
| null sha = bad command
-- sha is prefixed with \ when filename contains certian chars
| "\\" `isPrefixOf` sha = drop 1 sha
| otherwise = sha
where
sha = fst $ separate (== ' ') l
@ -137,6 +140,17 @@ checkKeyChecksum size key file = do
check <$> shaN size file filesize
_ -> return True
where
sha = keySha key
check s
| s == dropExtensions (keyName key) = True
| s == sha = True
{- A bug caused checksums to be prefixed with \ in some
- cases; still accept these as legal now that the bug has been
- fixed. -}
| '\\' : s == sha = True
| otherwise = False
keySha :: Key -> String
keySha key = dropExtensions (keyName key)
needsUpgrade :: Key -> Bool
needsUpgrade key = "\\" `isPrefixOf` keySha key