diff options
author | Junio C Hamano <gitster@pobox.com> | 2012-03-16 08:19:18 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-03-16 08:19:18 -0700 |
commit | 5087aace2d5467046c7204e038009b30fdebbca6 (patch) | |
tree | 4a52d848cf86e97556676b89ff726bfcb7f1cddd | |
parent | a99c5e5921fcb4fd003fd3424be4db649393731f (diff) | |
parent | 178e1deaae33f879ea687e85ac72455b3072b0d8 (diff) | |
download | git-5087aace2d5467046c7204e038009b30fdebbca6.tar.gz git-5087aace2d5467046c7204e038009b30fdebbca6.tar.xz |
Merge "two fixes for fast-import's 'ls' command" from Jonathan
Andrew Sayers noticed that the svn-fe | git fast-import pipeline
mishandles a subversion history that copies the root directory to a
sub-directory (e.g. doing `svn cp . trunk` to standardise your
layout). As David Barr explained, the bug arises when the following
command is sent to git fast-import:
'ls' SP ':1' SP LF
Instead of reading back what is at the root of r1, it unconditionally
reports the path as missing.
After sleeping on it, here are two patches for 'maint'. One plugs a
memory leak. The other ensures that trying to pass an empty path to
the 'ls' command results in an error message that can help the
frontend author instead of the silently broken conversion Andrew
found.
Then we can carefully add 'ls ""' support in 1.7.11.
* commit 'refs/pull-request-tags/jn/maint-fast-import-empty-ls':
fast-import: don't allow 'ls' of path with empty components
fast-import: leakfix for 'ls' of dirty trees
-rw-r--r-- | fast-import.c | 4 | ||||
-rwxr-xr-x | t/t9300-fast-import.sh | 39 |
2 files changed, 43 insertions, 0 deletions
diff --git a/fast-import.c b/fast-import.c index c1486cabb..a85275dc6 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1641,6 +1641,8 @@ static int tree_content_get( n = slash1 - p; else n = strlen(p); + if (!n) + die("Empty path component found in input"); if (!root->tree) load_tree(root); @@ -3028,6 +3030,8 @@ static void parse_ls(struct branch *b) store_tree(&leaf); print_ls(leaf.versions[1].mode, leaf.versions[1].sha1, p); + if (leaf.tree) + release_tree_content_recursive(leaf.tree); if (!b || root != &b->branch_tree) release_tree_entry(root); } diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 438aaf6b1..0f5b5e596 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -1307,6 +1307,45 @@ test_expect_success \ INPUT_END' test_expect_success \ + 'N: reject foo/ syntax in copy source' \ + 'test_must_fail git fast-import <<-INPUT_END + commit refs/heads/N5C + committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE + data <<COMMIT + copy with invalid syntax + COMMIT + + from refs/heads/branch^0 + C file2/ file3 + INPUT_END' + +test_expect_success \ + 'N: reject foo/ syntax in rename source' \ + 'test_must_fail git fast-import <<-INPUT_END + commit refs/heads/N5D + committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE + data <<COMMIT + rename with invalid syntax + COMMIT + + from refs/heads/branch^0 + R file2/ file3 + INPUT_END' + +test_expect_success \ + 'N: reject foo/ syntax in ls argument' \ + 'test_must_fail git fast-import <<-INPUT_END + commit refs/heads/N5E + committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE + data <<COMMIT + copy with invalid syntax + COMMIT + + from refs/heads/branch^0 + ls "file2/" + INPUT_END' + +test_expect_success \ 'N: copy to root by id and modify' \ 'echo "hello, world" >expect.foo && echo hello >expect.bar && |