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 { name = shaName size
, getKey = keyValue size , getKey = keyValue size
, fsckKey = Just $ checkKeyChecksum size , fsckKey = Just $ checkKeyChecksum size
, canUpgradeKey = Just $ needsUpgrade
} }
genBackendE :: SHASize -> Maybe Backend genBackendE :: SHASize -> Maybe Backend
@ -61,6 +62,8 @@ shaN shasize file filesize = do
parse command [] = bad command parse command [] = bad command
parse command (l:_) parse command (l:_)
| null sha = bad command | null sha = bad command
-- sha is prefixed with \ when filename contains certian chars
| "\\" `isPrefixOf` sha = drop 1 sha
| otherwise = sha | otherwise = sha
where where
sha = fst $ separate (== ' ') l sha = fst $ separate (== ' ') l
@ -137,6 +140,17 @@ checkKeyChecksum size key file = do
check <$> shaN size file filesize check <$> shaN size file filesize
_ -> return True _ -> return True
where where
sha = keySha key
check s 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 | 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" { name = "URL"
, getKey = const $ return Nothing , getKey = const $ return Nothing
, fsckKey = Nothing , fsckKey = Nothing
, canUpgradeKey = Nothing
} }
fromUrl :: String -> Maybe Integer -> Key fromUrl :: String -> Maybe Integer -> Key

View file

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

View file

@ -11,6 +11,7 @@ import Common.Annex
import Command import Command
import Backend import Backend
import qualified Types.Key import qualified Types.Key
import qualified Types.Backend
import Types.KeySource import Types.KeySource
import Annex.Content import Annex.Content
import qualified Command.ReKey import qualified Command.ReKey
@ -26,7 +27,7 @@ start :: FilePath -> (Key, Backend) -> CommandStart
start file (key, oldbackend) = do start file (key, oldbackend) = do
exists <- inAnnex key exists <- inAnnex key
newbackend <- choosebackend =<< chooseBackend file newbackend <- choosebackend =<< chooseBackend file
if (newbackend /= oldbackend || upgradableKey key) && exists if (newbackend /= oldbackend || upgradableKey oldbackend key) && exists
then do then do
showStart "migrate" file showStart "migrate" file
next $ perform file key oldbackend newbackend next $ perform file key oldbackend newbackend
@ -35,10 +36,17 @@ start file (key, oldbackend) = do
choosebackend Nothing = Prelude.head <$> orderedList choosebackend Nothing = Prelude.head <$> orderedList
choosebackend (Just backend) = return backend choosebackend (Just backend) = return backend
{- Checks if a key is upgradable to a newer representation. -} {- Checks if a key is upgradable to a newer representation.
{- Ideally, all keys have file size metadata. Old keys may not. -} -
upgradableKey :: Key -> Bool - Reasons for migration:
upgradableKey key = isNothing $ Types.Key.keySize key - - 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 {- Store the old backend's key in the new backend
- The old backend's key is not dropped from it, because there may - 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 { name :: String
, getKey :: KeySource -> a (Maybe Key) , getKey :: KeySource -> a (Maybe Key)
, fsckKey :: Maybe (Key -> FilePath -> a Bool) , fsckKey :: Maybe (Key -> FilePath -> a Bool)
, canUpgradeKey :: Maybe (Key -> Bool)
} }
instance Show (BackendA a) where 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 * Bugfix: Fixed bug parsing transfer info files, where the newline after
the filename was included in it. This was generally benign, but in the filename was included in it. This was generally benign, but in
the assistant, it caused unexpected dropping of preferred content. 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 -- Joey Hess <joeyh@debian.org> Thu, 13 Dec 2012 14:06:43 -0400