summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 8b8e862)
raw | patch | inline | side by side (parent: 8b8e862)
author | Junio C Hamano <gitster@pobox.com> | |
Wed, 16 Dec 2009 18:50:09 +0000 (10:50 -0800) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Wed, 16 Dec 2009 20:45:25 +0000 (12:45 -0800) |
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>
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>
setup.c | patch | blob | history | |
t/t1501-worktree.sh | patch | blob | history |
index 029371e5844a1069d62456c6bb51028efbb671c4..4272ec0ef2fd833923a5303286a0dd237ec6eab8 100644 (file)
--- a/setup.c
+++ b/setup.c
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 f6a6f839a18de4c3775ea965f164d0d20f2bbe9b..74e6443664010196f2694304179917fdadc53c01 100755 (executable)
--- a/t/t1501-worktree.sh
+++ b/t/t1501-worktree.sh
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