On 06.04.21 21:14, Daniel Shahaf wrote:
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.
Actually, it is mainly post-order with optional pre-order outputs. The original docstring is wrong there. r1888523 hopefully clarifies that.
+ } + 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.
Yep. Fixed in r1888520. Thank you for the review! -- Stefan^2.

