You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2014/12/08 14:15:22 UTC
svn commit: r1643810 - /subversion/trunk/subversion/mod_dav_svn/repos.c
Author: rhuijben
Date: Mon Dec 8 13:15:22 2014
New Revision: 1643810
URL: http://svn.apache.org/r1643810
Log:
Apply tweaked version of stsp's patch resolving issue #4531. This patch adds
proper scratch pool handling over the recursive resource walking in mod_dav.
This walker is used for many recursive operations initiated by mod_dav, most
importantly for testing authz and locks. Before this patch the entries of all
directories walked were stored in the single request pool.
* subversion/mod_dav_svn/repos.c
(do_walk): Add scratch_pool argument. Use this to store temporary data.
Pass iterpool as scratch pool on recursion.
(walk): Update caller.
Modified:
subversion/trunk/subversion/mod_dav_svn/repos.c
Modified: subversion/trunk/subversion/mod_dav_svn/repos.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/repos.c?rev=1643810&r1=1643809&r2=1643810&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/repos.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/repos.c Mon Dec 8 13:15:22 2014
@@ -4186,7 +4186,9 @@ typedef struct walker_ctx_t {
static dav_error *
-do_walk(walker_ctx_t *ctx, int depth)
+do_walk(walker_ctx_t *ctx,
+ int depth,
+ apr_pool_t *scratch_pool)
{
const dav_walk_params *params = ctx->params;
int isdir = ctx->res.collection;
@@ -4259,19 +4261,19 @@ do_walk(walker_ctx_t *ctx, int depth)
svn_log__get_dir(ctx->info.repos_path,
ctx->info.root.rev,
TRUE, FALSE, SVN_DIRENT_ALL,
- params->pool));
+ scratch_pool));
/* fetch this collection's children */
serr = svn_fs_dir_entries(&children, ctx->info.root.root,
- ctx->info.repos_path, params->pool);
+ ctx->info.repos_path, scratch_pool);
if (serr != NULL)
return dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"could not fetch collection members",
params->pool);
/* iterate over the children in this collection */
- iterpool = svn_pool_create(params->pool);
- for (hi = apr_hash_first(params->pool, children); hi; hi = apr_hash_next(hi))
+ iterpool = svn_pool_create(scratch_pool);
+ for (hi = apr_hash_first(scratch_pool, children); hi; hi = apr_hash_next(hi))
{
const void *key;
apr_ssize_t klen;
@@ -4324,7 +4326,7 @@ do_walk(walker_ctx_t *ctx, int depth)
ctx->res.uri = ctx->uri->data;
/* recurse on this collection */
- err = do_walk(ctx, depth - 1);
+ err = do_walk(ctx, depth - 1, iterpool);
if (err != NULL)
return err;
@@ -4406,7 +4408,7 @@ walk(const dav_walk_params *params, int
/* ### is the root already/always open? need to verify */
/* always return the error, and any/all multistatus responses */
- err = do_walk(&ctx, depth);
+ err = do_walk(&ctx, depth, params->pool);
*response = ctx.wres.response;
return err;