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
This commit is contained in:
Junio C Hamano 2016-04-06 11:39:11 -07:00
commit aad627e3c0
2 changed files with 15 additions and 5 deletions

View file

@ -1258,12 +1258,12 @@ 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)
@ -1271,13 +1271,13 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
"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;
}

View file

@ -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