aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-12-06 13:02:50 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-12-06 13:03:09 -0400
commit480495beb4a3422f006ee529df807a20cc944727 (patch)
treef20bb15a91ba0e44e45d2776fc6cdd61e3327d3f
parentcf5353acb4746cd0c2e736eecd066bd505555af3 (diff)
Prevent key names from containing newlines.
There are several places where it's assumed a key can be written on one line. One is in the format of the .git/annex/unused files. The difficult one is that filenames derived from keys are fed into git cat-file --batch, which has a line based input. (And no -z option.) So, for now it's best to block such keys being created.
-rw-r--r--Backend.hs8
-rw-r--r--Backend/SHA.hs10
-rw-r--r--debian/changelog1
-rw-r--r--doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn2
4 files changed, 16 insertions, 5 deletions
diff --git a/Backend.hs b/Backend.hs
index f7990c22c..136c2eb7a 100644
--- a/Backend.hs
+++ b/Backend.hs
@@ -64,7 +64,13 @@ genKey' (b:bs) file = do
r <- (B.getKey b) file
case r of
Nothing -> genKey' bs file
- Just k -> return $ Just (k, b)
+ Just k -> return $ Just (makesane k, b)
+ where
+ -- keyNames should not contain newline characters.
+ makesane k = k { keyName = map fixbadchar (keyName k) }
+ fixbadchar c
+ | c == '\n' = '_'
+ | otherwise = c
{- Looks up the key and backend corresponding to an annexed file,
- by examining what the file symlinks to. -}
diff --git a/Backend/SHA.hs b/Backend/SHA.hs
index 2ae0cfcf4..7935b6d26 100644
--- a/Backend/SHA.hs
+++ b/Backend/SHA.hs
@@ -90,10 +90,12 @@ keyValueE size file = keyValue size file >>= maybe (return Nothing) addE
, keyBackendName = shaNameE size
}
naiveextension = takeExtension file
- extension =
- if length naiveextension > 6
- then "" -- probably not really an extension
- else naiveextension
+ extension
+ -- long or newline containing extensions are
+ -- probably not really an extension
+ | length naiveextension > 6 ||
+ '\n' `elem` naiveextension = ""
+ | otherwise = naiveextension
{- A key's checksum is checked during fsck. -}
checkKeyChecksum :: SHASize -> Key -> Annex Bool
diff --git a/debian/changelog b/debian/changelog
index 7feb8f8ca..a4d3a6492 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,7 @@ git-annex (3.20111204) UNRELEASED; urgency=low
* map: Fix a failure to detect a loop when both repositories are local
and refer to each other with relative paths.
+ * Prevent key names from containing newlines.
-- Joey Hess <joeyh@debian.org> Sun, 04 Dec 2011 12:22:37 -0400
diff --git a/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn
index 5673d8060..530a8da5d 100644
--- a/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn
+++ b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn
@@ -1,3 +1,5 @@
Found this out the hard way. See the comment in the below post for what happens.
[[/forum/git_annex_add_crash_and_subsequent_recovery/]]
+
+> [[fixed|done]] --[[Joey]]