Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'jv/merge-nothing-into-void'
"git merge FETCH_HEAD" dereferenced NULL pointer when merging
nothing into an unborn history (which is arguably unusual usage,
which perhaps was the reason why nobody noticed it).

* jv/merge-nothing-into-void:
  merge: fix NULL pointer dereference when merging nothing into void
  • Loading branch information
Junio C Hamano committed Apr 6, 2016
2 parents a6822e4 + b84e65d commit aad627e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 5 deletions.
10 changes: 5 additions & 5 deletions builtin/merge.c
Expand Up @@ -1258,26 +1258,26 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
builtin_merge_options);

if (!head_commit) {
struct commit *remote_head;
/*
* If the merged head is a valid one there is no reason
* to forbid "git merge" into a branch yet to be born.
* We do the same for "git pull".
*/
unsigned char *remote_head_sha1;
if (squash)
die(_("Squash commit into empty head not supported yet"));
if (fast_forward == FF_NO)
die(_("Non-fast-forward commit does not make sense into "
"an empty head"));
remoteheads = collect_parents(head_commit, &head_subsumed,
argc, argv, NULL);
remote_head = remoteheads->item;
if (!remote_head)
if (!remoteheads)
die(_("%s - not something we can merge"), argv[0]);
if (remoteheads->next)
die(_("Can merge only exactly one commit into empty head"));
read_empty(remote_head->object.oid.hash, 0);
update_ref("initial pull", "HEAD", remote_head->object.oid.hash,
remote_head_sha1 = remoteheads->item->object.oid.hash;
read_empty(remote_head_sha1, 0);
update_ref("initial pull", "HEAD", remote_head_sha1,
NULL, 0, UPDATE_REFS_DIE_ON_ERR);
goto done;
}
Expand Down
10 changes: 10 additions & 0 deletions t/t7600-merge.sh
Expand Up @@ -753,4 +753,14 @@ test_expect_success 'merge detects mod-256 conflicts (resolve)' '
test_must_fail git merge -s resolve master
'

test_expect_success 'merge nothing into void' '
git init void &&
(
cd void &&
git remote add up .. &&
git fetch up &&
test_must_fail git merge FETCH_HEAD
)
'

test_done

0 comments on commit aad627e

Please sign in to comment.