summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2017-09-21 06:21:40 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-09-22 03:49:28 (GMT)
commitcc0ea7c9e5c3d3bf9623415737b595c9d26b9b6d (patch)
tree037577f7d315c4f7eb67614f4dcf91e32f38f333
parent30d005c02014680403b5d35ef274047ab91fa5bd (diff)
downloadgit-cc0ea7c9e5c3d3bf9623415737b595c9d26b9b6d.zip
git-cc0ea7c9e5c3d3bf9623415737b595c9d26b9b6d.tar.gz
git-cc0ea7c9e5c3d3bf9623415737b595c9d26b9b6d.tar.bz2
cat-file: handle NULL object_context.path
Commit dc944b65f1 (get_sha1_with_context: dynamically allocate oc->path, 2017-05-19) changed the rules that callers must follow for seeing if we parsed a path in the object name. The rules switched from "check if the oc.path buffer is empty" to "check if the oc.path pointer is NULL". But that commit forgot to update some sites in cat_one_file(), meaning we might dereference a NULL pointer. You can see this by making a path-aware request like --textconv without specifying --path, and giving an object name that doesn't have a path in it. Like: git cat-file --textconv HEAD which will reliably segfault. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/cat-file.c4
-rwxr-xr-xt/t8010-cat-file-filters.sh5
2 files changed, 7 insertions, 2 deletions
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index 4217095..b91b167 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -94,7 +94,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
return !has_object_file(&oid);
case 'w':
- if (!path[0])
+ if (!path)
die("git cat-file --filters %s: <object> must be "
"<sha1:path>", obj_name);
@@ -104,7 +104,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
break;
case 'c':
- if (!path[0])
+ if (!path)
die("git cat-file --textconv %s: <object> must be <sha1:path>",
obj_name);
diff --git a/t/t8010-cat-file-filters.sh b/t/t8010-cat-file-filters.sh
index d8242e4..0f86c19 100755
--- a/t/t8010-cat-file-filters.sh
+++ b/t/t8010-cat-file-filters.sh
@@ -51,6 +51,11 @@ test_expect_success '--path=<path> complains without --textconv/--filters' '
grep "path.*needs.*filters" err
'
+test_expect_success '--textconv/--filters complain without path' '
+ test_must_fail git cat-file --textconv HEAD &&
+ test_must_fail git cat-file --filters HEAD
+'
+
test_expect_success 'cat-file --textconv --batch works' '
sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
test_config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" &&