@@ -3633,15 +3633,16 @@ static int merge_trees_internal(struct merge_options *opt,
36333633static int merge_recursive_internal (struct merge_options * opt ,
36343634 struct commit * h1 ,
36353635 struct commit * h2 ,
3636- struct commit_list * merge_bases ,
3636+ const struct commit_list * _merge_bases ,
36373637 struct commit * * result )
36383638{
3639+ struct commit_list * merge_bases = copy_commit_list (_merge_bases );
36393640 struct commit_list * iter ;
36403641 struct commit * merged_merge_bases ;
36413642 struct tree * result_tree ;
3642- int clean ;
36433643 const char * ancestor_name ;
36443644 struct strbuf merge_base_abbrev = STRBUF_INIT ;
3645+ int ret ;
36453646
36463647 if (show (opt , 4 )) {
36473648 output (opt , 4 , _ ("Merging:" ));
@@ -3651,8 +3652,10 @@ static int merge_recursive_internal(struct merge_options *opt,
36513652
36523653 if (!merge_bases ) {
36533654 if (repo_get_merge_bases (the_repository , h1 , h2 ,
3654- & merge_bases ) < 0 )
3655- return -1 ;
3655+ & merge_bases ) < 0 ) {
3656+ ret = -1 ;
3657+ goto out ;
3658+ }
36563659 merge_bases = reverse_commit_list (merge_bases );
36573660 }
36583661
@@ -3702,14 +3705,18 @@ static int merge_recursive_internal(struct merge_options *opt,
37023705 opt -> branch1 = "Temporary merge branch 1" ;
37033706 opt -> branch2 = "Temporary merge branch 2" ;
37043707 if (merge_recursive_internal (opt , merged_merge_bases , iter -> item ,
3705- NULL , & merged_merge_bases ) < 0 )
3706- return -1 ;
3708+ NULL , & merged_merge_bases ) < 0 ) {
3709+ ret = -1 ;
3710+ goto out ;
3711+ }
37073712 opt -> branch1 = saved_b1 ;
37083713 opt -> branch2 = saved_b2 ;
37093714 opt -> priv -> call_depth -- ;
37103715
3711- if (!merged_merge_bases )
3712- return err (opt , _ ("merge returned no commit" ));
3716+ if (!merged_merge_bases ) {
3717+ ret = err (opt , _ ("merge returned no commit" ));
3718+ goto out ;
3719+ }
37133720 }
37143721
37153722 /*
@@ -3726,17 +3733,16 @@ static int merge_recursive_internal(struct merge_options *opt,
37263733 repo_read_index (opt -> repo );
37273734
37283735 opt -> ancestor = ancestor_name ;
3729- clean = merge_trees_internal (opt ,
3730- repo_get_commit_tree (opt -> repo , h1 ),
3731- repo_get_commit_tree (opt -> repo , h2 ),
3732- repo_get_commit_tree (opt -> repo ,
3733- merged_merge_bases ),
3734- & result_tree );
3735- strbuf_release (& merge_base_abbrev );
3736+ ret = merge_trees_internal (opt ,
3737+ repo_get_commit_tree (opt -> repo , h1 ),
3738+ repo_get_commit_tree (opt -> repo , h2 ),
3739+ repo_get_commit_tree (opt -> repo ,
3740+ merged_merge_bases ),
3741+ & result_tree );
37363742 opt -> ancestor = NULL ; /* avoid accidental re-use of opt->ancestor */
3737- if (clean < 0 ) {
3743+ if (ret < 0 ) {
37383744 flush_output (opt );
3739- return clean ;
3745+ goto out ;
37403746 }
37413747
37423748 if (opt -> priv -> call_depth ) {
@@ -3745,7 +3751,11 @@ static int merge_recursive_internal(struct merge_options *opt,
37453751 commit_list_insert (h1 , & (* result )-> parents );
37463752 commit_list_insert (h2 , & (* result )-> parents -> next );
37473753 }
3748- return clean ;
3754+
3755+ out :
3756+ strbuf_release (& merge_base_abbrev );
3757+ free_commit_list (merge_bases );
3758+ return ret ;
37493759}
37503760
37513761static int merge_start (struct merge_options * opt , struct tree * head )
@@ -3827,7 +3837,7 @@ int merge_trees(struct merge_options *opt,
38273837int merge_recursive (struct merge_options * opt ,
38283838 struct commit * h1 ,
38293839 struct commit * h2 ,
3830- struct commit_list * merge_bases ,
3840+ const struct commit_list * merge_bases ,
38313841 struct commit * * result )
38323842{
38333843 int clean ;
@@ -3895,6 +3905,7 @@ int merge_recursive_generic(struct merge_options *opt,
38953905 repo_hold_locked_index (opt -> repo , & lock , LOCK_DIE_ON_ERROR );
38963906 clean = merge_recursive (opt , head_commit , next_commit , ca ,
38973907 result );
3908+ free_commit_list (ca );
38983909 if (clean < 0 ) {
38993910 rollback_lock_file (& lock );
39003911 return clean ;
0 commit comments