diff options
author | Junio C Hamano <gitster@pobox.com> | 2009-12-16 10:50:09 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-12-16 12:45:25 -0800 |
commit | b3100fd5557dbaad4eeb5690336758ef21bb08bb (patch) | |
tree | d2c55bbd6a9bf4f6152638a63149911715e1ba67 | |
parent | ignore unknown color configuration (diff) | |
download | tgif-b3100fd5557dbaad4eeb5690336758ef21bb08bb.tar.xz |
worktree: don't segfault with an absolute pathspec without a work tree
If a command is run with an absolute path as a pathspec inside a bare
repository, e.g. "rev-list HEAD -- /home", the code tried to run strlen()
on NULL, which is the result of get_git_work_tree(), and segfaulted. It
should just fail instead.
Currently the function returns NULL even inside .git/ in a repository
with a work tree, but that is a separate issue.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | setup.c | 7 | ||||
-rwxr-xr-x | t/t1501-worktree.sh | 15 |
2 files changed, 20 insertions, 2 deletions
@@ -18,9 +18,12 @@ const char *prefix_path(const char *prefix, int len, const char *path) if (normalize_path_copy(sanitized, sanitized)) goto error_out; if (is_absolute_path(orig)) { + size_t len, total; const char *work_tree = get_git_work_tree(); - size_t len = strlen(work_tree); - size_t total = strlen(sanitized) + 1; + if (!work_tree) + goto error_out; + len = strlen(work_tree); + total = strlen(sanitized) + 1; if (strncmp(sanitized, work_tree, len) || (sanitized[len] != '\0' && sanitized[len] != '/')) { error_out: diff --git a/t/t1501-worktree.sh b/t/t1501-worktree.sh index f6a6f839a1..74e6443664 100755 --- a/t/t1501-worktree.sh +++ b/t/t1501-worktree.sh @@ -174,4 +174,19 @@ test_expect_success 'git grep' ' GIT_DIR=../.. GIT_WORK_TREE=.. git grep -l changed | grep dir/tracked) ' +test_expect_success 'git commit' ' + ( + cd repo.git && + GIT_DIR=. GIT_WORK_TREE=work git commit -a -m done + ) +' + +test_expect_success 'absolute pathspec should fail gracefully' ' + ( + cd repo.git || exit 1 + git config --unset core.worktree + test_must_fail git log HEAD -- /home + ) +' + test_done |