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>
This commit is contained in:
7
setup.c
7
setup.c
@ -18,9 +18,12 @@ const char *prefix_path(const char *prefix, int len, const char *path)
|
|||||||
if (normalize_path_copy(sanitized, sanitized))
|
if (normalize_path_copy(sanitized, sanitized))
|
||||||
goto error_out;
|
goto error_out;
|
||||||
if (is_absolute_path(orig)) {
|
if (is_absolute_path(orig)) {
|
||||||
|
size_t len, total;
|
||||||
const char *work_tree = get_git_work_tree();
|
const char *work_tree = get_git_work_tree();
|
||||||
size_t len = strlen(work_tree);
|
if (!work_tree)
|
||||||
size_t total = strlen(sanitized) + 1;
|
goto error_out;
|
||||||
|
len = strlen(work_tree);
|
||||||
|
total = strlen(sanitized) + 1;
|
||||||
if (strncmp(sanitized, work_tree, len) ||
|
if (strncmp(sanitized, work_tree, len) ||
|
||||||
(sanitized[len] != '\0' && sanitized[len] != '/')) {
|
(sanitized[len] != '\0' && sanitized[len] != '/')) {
|
||||||
error_out:
|
error_out:
|
||||||
|
@ -174,4 +174,19 @@ test_expect_success 'git grep' '
|
|||||||
GIT_DIR=../.. GIT_WORK_TREE=.. git grep -l changed | grep dir/tracked)
|
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
|
test_done
|
||||||
|
Reference in New Issue
Block a user