aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Lichtenheld <flichtenheld@astaro.com>2009-04-18 16:14:02 +0200
committerJunio C Hamano <gitster@pobox.com>2009-04-18 13:06:40 -0700
commit32d1776b1341c17b99da862e80ddf151a5b558fe (patch)
tree6917dd74528fbc8397edf2a3f9786504bab3430e
parente0b3cc0dffbc965ffa33155cbdcf8d44716c134c (diff)
downloadgit-32d1776b1341c17b99da862e80ddf151a5b558fe.tar.gz
git-32d1776b1341c17b99da862e80ddf151a5b558fe.tar.xz
init: Do not segfault on big GIT_TEMPLATE_DIR environment variable
Signed-off-by: Frank Lichtenheld <flichtenheld@astaro.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-init-db.c4
-rwxr-xr-xt/t0001-init.sh9
2 files changed, 12 insertions, 1 deletions
diff --git a/builtin-init-db.c b/builtin-init-db.c
index d30c3fe2c..6cc945d50 100644
--- a/builtin-init-db.c
+++ b/builtin-init-db.c
@@ -122,8 +122,10 @@ static void copy_templates(const char *template_dir)
template_dir = system_path(DEFAULT_GIT_TEMPLATE_DIR);
if (!template_dir[0])
return;
+ template_len = strlen(template_dir);
+ if (PATH_MAX <= (template_len+strlen("/config")))
+ die("insanely long template path %s", template_dir);
strcpy(template_path, template_dir);
- template_len = strlen(template_path);
if (template_path[template_len-1] != '/') {
template_path[template_len++] = '/';
template_path[template_len] = 0;
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 5ac0a273a..e3d846420 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -199,4 +199,13 @@ test_expect_success 'init honors global core.sharedRepository' '
x`git config -f shared-honor-global/.git/config core.sharedRepository`
'
+test_expect_success 'init rejects insanely long --template' '
+ (
+ insane=$(printf "x%09999dx" 1) &&
+ mkdir test &&
+ cd test &&
+ test_must_fail git init --template=$insane
+ )
+'
+
test_done