Merge branch 'rs/pull-signed-tag' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 9 Sep 2016 04:35:54 +0000 (21:35 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 9 Sep 2016 04:35:54 +0000 (21:35 -0700)
When "git merge-recursive" works on history with many criss-cross
merges in "verbose" mode, the names the command assigns to the
virtual merge bases could have overwritten each other by unintended
reuse of the same piece of memory.

* rs/pull-signed-tag:
commit: use FLEX_ARRAY in struct merge_remote_desc
merge-recursive: fix verbose output for multiple base trees
commit: factor out set_merge_remote_desc()
commit: use xstrdup() in get_merge_parent()

1  2 
merge-recursive.c
diff --combined merge-recursive.c
index 9748bafd3073b431c9c8574b721dab41233ecb09,a4250778804f79d78bb788c9486db3649ae816e8..e7178bcdccc2776947f463bfd9e53000e9d2e0ba
@@@ -42,12 -42,9 +42,9 @@@ static struct tree *shift_tree_object(s
  static struct commit *make_virtual_commit(struct tree *tree, const char *comment)
  {
        struct commit *commit = alloc_commit_node();
-       struct merge_remote_desc *desc = xmalloc(sizeof(*desc));
  
-       desc->name = comment;
-       desc->obj = (struct object *)commit;
+       set_merge_remote_desc(commit, comment, (struct object *)commit);
        commit->tree = tree;
-       commit->util = desc;
        commit->object.parsed = 1;
        return commit;
  }
@@@ -202,21 -199,12 +199,21 @@@ static int add_cacheinfo(unsigned int m
                const char *path, int stage, int refresh, int options)
  {
        struct cache_entry *ce;
 -      ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage,
 -                            (refresh ? (CE_MATCH_REFRESH |
 -                                        CE_MATCH_IGNORE_MISSING) : 0 ));
 +      int ret;
 +
 +      ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage, 0);
        if (!ce)
                return error(_("addinfo_cache failed for path '%s'"), path);
 -      return add_cache_entry(ce, options);
 +
 +      ret = add_cache_entry(ce, options);
 +      if (refresh) {
 +              struct cache_entry *nce;
 +
 +              nce = refresh_cache_entry(ce, CE_MATCH_REFRESH | CE_MATCH_IGNORE_MISSING);
 +              if (nce != ce)
 +                      ret = add_cache_entry(nce, options);
 +      }
 +      return ret;
  }
  
  static void init_tree_desc_from_tree(struct tree_desc *desc, struct tree *tree)