diff options
author | Glen Choo <chooglen@google.com> | 2022-03-01 16:36:13 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-03-01 23:27:09 -0800 |
commit | 8d2eaf649abd28baa083a723d1e041b26d2be83e (patch) | |
tree | ae72cb98b4b15b4b19187a5d96aab76d3bcf9258 | |
parent | Git 2.35.1 (diff) | |
download | tgif-8d2eaf649abd28baa083a723d1e041b26d2be83e.tar.xz |
checkout, clone: die if tree cannot be parsed
When a tree oid is invalid, parse_tree_indirect() can return NULL. Check
for NULL instead of proceeding as though it were a valid pointer and
segfaulting.
Signed-off-by: Glen Choo <chooglen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin/checkout.c | 13 | ||||
-rw-r--r-- | builtin/clone.c | 2 |
2 files changed, 12 insertions, 3 deletions
diff --git a/builtin/checkout.c b/builtin/checkout.c index cc804ba8e1..a2c59dfcae 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -733,6 +733,7 @@ static int merge_working_tree(const struct checkout_opts *opts, struct tree_desc trees[2]; struct tree *tree; struct unpack_trees_options topts; + const struct object_id *old_commit_oid; memset(&topts, 0, sizeof(topts)); topts.head_idx = -1; @@ -760,9 +761,15 @@ static int merge_working_tree(const struct checkout_opts *opts, &new_branch_info->commit->object.oid : &new_branch_info->oid, NULL); topts.preserve_ignored = !opts->overwrite_ignore; - tree = parse_tree_indirect(old_branch_info->commit ? - &old_branch_info->commit->object.oid : - the_hash_algo->empty_tree); + + old_commit_oid = old_branch_info->commit ? + &old_branch_info->commit->object.oid : + the_hash_algo->empty_tree; + tree = parse_tree_indirect(old_commit_oid); + if (!tree) + die(_("unable to parse commit %s"), + oid_to_hex(old_commit_oid)); + init_tree_desc(&trees[0], tree->buffer, tree->size); parse_tree(new_tree); tree = new_tree; diff --git a/builtin/clone.c b/builtin/clone.c index 727e16e0ae..2d04c54d0c 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -695,6 +695,8 @@ static int checkout(int submodule_progress) init_checkout_metadata(&opts.meta, head, &oid, NULL); tree = parse_tree_indirect(&oid); + if (!tree) + die(_("unable to parse commit %s"), oid_to_hex(&oid)); parse_tree(tree); init_tree_desc(&t, tree->buffer, tree->size); if (unpack_trees(1, &t, &opts) < 0) |