Stefan Fuhrmann wrote on Mon, Apr 05, 2021 at 21:17:23 +0200:
> +static svn_error_t *output_processed(
> +  svn_task__t **task,
> +  svn_cancel_func_t cancel_func,
> +  void *cancel_baton,
> +  apr_pool_t *result_pool,
> +  apr_pool_t *scratch_pool)
> +{
> +  svn_task__t *current = *task;
> +  root_t *root = current->root;
> +  apr_pool_t *iterpool = svn_pool_create(scratch_pool);
> +  output_t *output;
> +  callbacks_t *callbacks;
> +  
> +  while (current && is_processed(current))
> +    {
> +      svn_pool_clear(iterpool);
> +      if (current->first_sub)
> +        {
> +          current = current->first_sub;
> +          output = current->output;
> +          callbacks = current->parent->callbacks;
> +          if (output && output->prior_parent_output)
> +            SVN_ERR(callbacks->output_func(
> +                        current->parent, output->prior_parent_output,
> +                        callbacks->output_baton,
> +                        cancel_func, cancel_baton,
> +                        result_pool, iterpool));

FWIW: The pre-order of outputs surprised me.  When I read that in the
docstring in r1888446 I thought it was a typo for "post-order", but it's
not.

> +        }
> +      else
> +        {
> +          output_t *output = current->output;
> +          if (output)
> +            {
> +              svn_error_t *err = output->error;
> +              output->error = SVN_NO_ERROR;
> +              SVN_ERR(err);
> +              
> +              callbacks = current->callbacks;
> +              if (output->output)
> +                SVN_ERR(callbacks->output_func(
> +                            current, output->output,
> +                            callbacks->output_baton,
> +                            cancel_func, cancel_baton,
> +                            result_pool, iterpool));
> +            }
> +
> +          /* The output function may have added additional sub-tasks. */
> +          if (!current->first_sub)
> +            {
> +              svn_task__t *to_delete = current;
> +              current = to_delete->parent;
> +              remove_task(to_delete);

Error leak.  Cf. tools/dev/warn-ignored-err.sh.

> +              if (output)
> +                svn_pool_destroy(output->pool);
> +            }
> +        }
> +    }
> +
> +  svn_pool_destroy(iterpool);
> +  *task = current;
> +
> +  return SVN_NO_ERROR;
> +}

Reply via email to