summaryrefslogtreecommitdiff
path: root/setup.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2009-12-16 10:50:09 -0800
committerJunio C Hamano <gitster@pobox.com>2009-12-16 12:45:25 -0800
commitb3100fd5557dbaad4eeb5690336758ef21bb08bb (patch)
treed2c55bbd6a9bf4f6152638a63149911715e1ba67 /setup.c
parent8b8e862490bba040299905cc0541560f24a11c41 (diff)
downloadgit-b3100fd5557dbaad4eeb5690336758ef21bb08bb.tar.gz
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>
Diffstat (limited to 'setup.c')
-rw-r--r--setup.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/setup.c b/setup.c
index 029371e584..4272ec0ef2 100644
--- a/setup.c
+++ b/setup.c
@@ -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: