Skip to content

Commit

Permalink
worktree: don't segfault with an absolute pathspec without a work tree
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
gitster committed Dec 16, 2009
1 parent 8b8e862 commit b3100fd
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
7 changes: 5 additions & 2 deletions setup.c
Expand Up @@ -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:
Expand Down
15 changes: 15 additions & 0 deletions t/t1501-worktree.sh
Expand Up @@ -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

0 comments on commit b3100fd

Please sign in to comment.