You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by yl...@apache.org on 2020/11/23 15:06:05 UTC
svn commit: r1883750 - /apr/apr/trunk/memory/unix/apr_pools.c
Author: ylavic
Date: Mon Nov 23 15:06:05 2020
New Revision: 1883750
URL: http://svn.apache.org/viewvc?rev=1883750&view=rev
Log:
apr_pools: lock parent pool in pool_destroy_debug().
By using apr_pool_clear_debug() instead of pool_clear_debug() in
pool_destroy_debug() we gain the locking provided by the former and thus
protection from concurrent access from apr_pool_walk_tree(), which is
undefined behaviour.
While pool_destroy_debug()=>apr_pool_clear_debug()=>pool_clear_debug() calls
pool_destroy_debug() for all the children pools, this does not cause a deadlock
because apr_pool_clear_debug() locks the parent pool only (not the pool itself)
and thus pool_destroy_debug(pool->child) locks the current pool with no issue.
Modified:
apr/apr/trunk/memory/unix/apr_pools.c
Modified: apr/apr/trunk/memory/unix/apr_pools.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/memory/unix/apr_pools.c?rev=1883750&r1=1883749&r2=1883750&view=diff
==============================================================================
--- apr/apr/trunk/memory/unix/apr_pools.c (original)
+++ apr/apr/trunk/memory/unix/apr_pools.c Mon Nov 23 15:06:05 2020
@@ -1951,9 +1951,7 @@ APR_DECLARE(void) apr_pool_clear_debug(a
static void pool_destroy_debug(apr_pool_t *pool, const char *file_line)
{
- apr_pool_check_lifetime(pool);
-
- pool_clear_debug(pool, file_line);
+ apr_pool_clear_debug(pool, file_line);
#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE)
apr_pool_log_event(pool, "DESTROY", file_line, 1);