diff --git a/apply.c b/apply.c index 432837a674..e311013bc4 100644 --- a/apply.c +++ b/apply.c @@ -1292,8 +1292,15 @@ static char *git_header_name(int p_value, return NULL; /* no postimage name */ second = skip_tree_prefix(p_value, name + len + 1, line_len - (len + 1)); + /* + * If we are at the SP at the end of a directory, + * skip_tree_prefix() may return NULL as that makes + * it appears as if we have an absolute path. + * Keep going to find another SP. + */ if (!second) - return NULL; + continue; + /* * Does len bytes starting at "name" and "second" * (that are separated by one HT or SP we just diff --git a/t/t4126-apply-empty.sh b/t/t4126-apply-empty.sh index ece9fae207..eaf0c5304a 100755 --- a/t/t4126-apply-empty.sh +++ b/t/t4126-apply-empty.sh @@ -66,4 +66,26 @@ test_expect_success 'apply --index create' ' git diff --exit-code ' +test_expect_success 'apply with no-contents and a funny pathname' ' + mkdir "funny " && + >"funny /empty" && + git add "funny /empty" && + git diff HEAD "funny /" >sample.patch && + git diff -R HEAD "funny /" >elpmas.patch && + git reset --hard && + rm -fr "funny " && + + git apply --stat --check --apply sample.patch && + test_must_be_empty "funny /empty" && + + git apply --stat --check --apply elpmas.patch && + test_path_is_missing "funny /empty" && + + git apply -R --stat --check --apply elpmas.patch && + test_must_be_empty "funny /empty" && + + git apply -R --stat --check --apply sample.patch && + test_path_is_missing "funny /empty" +' + test_done