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

View file

@ -24,6 +24,7 @@ backend = Backend
{ name = "URL"
, getKey = const $ return Nothing
, fsckKey = Nothing
, canUpgradeKey = Nothing
}
fromUrl :: String -> Maybe Integer -> Key

View file

@ -20,6 +20,7 @@ backend = Backend
{ name = "WORM"
, getKey = keyValue
, fsckKey = Nothing
, canUpgradeKey = Nothing
}
{- The key includes the file size, modification time, and the

View file

@ -11,6 +11,7 @@ import Common.Annex
import Command
import Backend
import qualified Types.Key
import qualified Types.Backend
import Types.KeySource
import Annex.Content
import qualified Command.ReKey
@ -26,7 +27,7 @@ start :: FilePath -> (Key, Backend) -> CommandStart
start file (key, oldbackend) = do
exists <- inAnnex key
newbackend <- choosebackend =<< chooseBackend file
if (newbackend /= oldbackend || upgradableKey key) && exists
if (newbackend /= oldbackend || upgradableKey oldbackend key) && exists
then do
showStart "migrate" file
next $ perform file key oldbackend newbackend
@ -35,10 +36,17 @@ start file (key, oldbackend) = do
choosebackend Nothing = Prelude.head <$> orderedList
choosebackend (Just backend) = return backend
{- Checks if a key is upgradable to a newer representation. -}
{- Ideally, all keys have file size metadata. Old keys may not. -}
upgradableKey :: Key -> Bool
upgradableKey key = isNothing $ Types.Key.keySize key
{- Checks if a key is upgradable to a newer representation.
-
- Reasons for migration:
- - Ideally, all keys have file size metadata. Old keys may not.
- - Something has changed in the backend, such as a bug fix.
-}
upgradableKey :: Backend -> Key -> Bool
upgradableKey backend key = isNothing (Types.Key.keySize key) || backendupgradable
where
backendupgradable = maybe False (\a -> a key)
(Types.Backend.canUpgradeKey backend)
{- Store the old backend's key in the new backend
- The old backend's key is not dropped from it, because there may

View file

@ -16,6 +16,7 @@ data BackendA a = Backend
{ name :: String
, getKey :: KeySource -> a (Maybe Key)
, fsckKey :: Maybe (Key -> FilePath -> a Bool)
, canUpgradeKey :: Maybe (Key -> Bool)
}
instance Show (BackendA a) where

5
debian/changelog vendored
View file

@ -10,6 +10,11 @@ git-annex (3.20121212) UNRELEASED; urgency=low
* Bugfix: Fixed bug parsing transfer info files, where the newline after
the filename was included in it. This was generally benign, but in
the assistant, it caused unexpected dropping of preferred content.
* 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.
-- Joey Hess <joeyh@debian.org> Thu, 13 Dec 2012 14:06:43 -0400