underlying (broad) bug. dav_add_response() was assuming the walk params were
a dav_walker_ctx. During the walker cleanup in Nov00, that assumption was
removed, so response errors that occurred in the cleaned sections (such as
dav_fs_delete_resource) could trigger a segfault.
Solution: add a pool to dav_walk_resource and alter dav_add_response to use
that, rather than assume the ctx is a dav_walker_ctx.
[ note there is also a pool in dav_walk_resource.resource, but that pool is
associated with the *resource* rather than the process of walking, so we
introduced another field. currently they are the same, however. ]
Found by: Ryan Bloom
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@87670
13f79535-47bb-0310-9956-
ffa450edef68
fsctx.params = params;
fsctx.wres.walk_ctx = params->walk_ctx;
+ fsctx.wres.pool = params->pool;
/* ### zero out versioned, working, baselined? */
DAV_DECLARE(void) dav_add_response(dav_walk_resource *wres,
int status, dav_get_props_result *propstats)
{
- dav_walker_ctx *ctx = wres->walk_ctx;
dav_response *resp;
/* just drop some data into an dav_response */
- resp = apr_pcalloc(ctx->w.pool, sizeof(*resp));
- resp->href = apr_pstrdup(ctx->w.pool, wres->resource->uri);
+ resp = apr_pcalloc(wres->pool, sizeof(*resp));
+ resp->href = apr_pstrdup(wres->pool, wres->resource->uri);
resp->status = status;
if (propstats) {
resp->propresult = *propstats;
/* the client-provided context */
void *walk_ctx;
+ /* pool to use for allocations in the callback */
+ apr_pool_t *pool;
+
/* the current resource */
const dav_resource *resource;