diff options
author | Junio C Hamano <gitster@pobox.com> | 2016-04-06 11:39:11 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-04-06 11:39:11 -0700 |
commit | aad627e3c0e7dcf5a59da80cb424e8a4093b0324 (patch) | |
tree | 6de618e5e855a985e42e6020eff41c59123699e1 | |
parent | a6822e4172a8fa889b10a7a363088d2a05932b9b (diff) | |
parent | b84e65d40929ec1146f54dcf4c9dbf8dc58467d0 (diff) | |
download | git-aad627e3c0e7dcf5a59da80cb424e8a4093b0324.tar.gz |
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
-rw-r--r-- | builtin/merge.c | 10 | ||||
-rwxr-xr-x | t/t7600-merge.sh | 10 |
2 files changed, 15 insertions, 5 deletions
diff --git a/builtin/merge.c b/builtin/merge.c index c8154aaf6a..30b7bd54fa 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -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; } diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh index dc9f142f53..85248a14b6 100755 --- a/t/t7600-merge.sh +++ b/t/t7600-merge.sh @@ -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 |