On Thu, Jan 21, 2016 at 02:18:43PM -0000, [email protected] wrote:
> Author: kotkov
> Date: Thu Jan 21 14:18:43 2016
> New Revision: 1725957
> 
> URL: http://svn.apache.org/viewvc?rev=1725957&view=rev
> Log:
> Allocate the baton for 'svn merge --accept' conflict callback in the pool,
> instead of using a pointer to stack.
> 
> * subversion/svn/merge-cmd.c
>   (svn_cl__merge): Allocate struct conflict_func_merge_cmd_baton in the
>    pool.  Otherwise, the ctx->conflict_baton2 pointer becomes dangling
>    when the stack variable falls out of scope.
> 
> Modified:
>     subversion/trunk/subversion/svn/merge-cmd.c

Not objecting to this change, but I believe we do have a few
batons on the stack in several places and I don't think this
is a problem in general.

The stack memory will be available until the function returns,
which in this case is svn_cl__merge() i.e. the main entry point
to the subcommand.

The scope shouldn't matter since there's no garbage collection in C.

> 
> Modified: subversion/trunk/subversion/svn/merge-cmd.c
> URL: 
> http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/merge-cmd.c?rev=1725957&r1=1725956&r2=1725957&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/svn/merge-cmd.c (original)
> +++ subversion/trunk/subversion/svn/merge-cmd.c Thu Jan 21 14:18:43 2016
> @@ -513,14 +513,14 @@ svn_cl__merge(apr_getopt_t *os,
>     * See the docstring at conflict_func_merge_cmd() for details */
>    if (opt_state->accept_which != svn_cl__accept_unspecified)
>      {
> -      struct conflict_func_merge_cmd_baton b;
> +      struct conflict_func_merge_cmd_baton *b = apr_pcalloc(pool, 
> sizeof(*b));
>  
> -      b.accept_which = opt_state->accept_which;
> -      SVN_ERR(svn_dirent_get_absolute(&b.path_prefix, "", pool));
> -      b.conflict_stats = conflict_stats;
> +      b->accept_which = opt_state->accept_which;
> +      SVN_ERR(svn_dirent_get_absolute(&b->path_prefix, "", pool));
> +      b->conflict_stats = conflict_stats;
>  
>        ctx->conflict_func2 = conflict_func_merge_cmd;
> -      ctx->conflict_baton2 = &b;
> +      ctx->conflict_baton2 = b;
>      }
>  
>    merge_err = run_merge(two_sources_specified,
> 
> 

Reply via email to