Greetings,
The apr_pool_parent_get() when working for NetWare, returns the same
pool pointer passed in when at its highest desired level, which isn't
the real 'top'.
APR_DECLARE(apr_pool_t *) apr_pool_parent_get(apr_pool_t *pool)
{
#ifdef NETWARE
/* On NetWare, don't return the global_pool, return the application pool
as the top most pool */
if (pool->parent == global_pool)
return pool;
else
#endif
return pool->parent;
}
As this pool still has a valid parent pointer there are several places
in the apr source where this causes a server hang due to getting stuck
in a loop. From mod_dbd.c for example:
/* Top level pool scope, need process-scope lifetime */
for (parent = pool; parent; parent = apr_pool_parent_get(pool))
pool = parent;
The 'desirable' solution (I think) would be for apr_pool_parent_get() to
return (in the NetWare-specific case) something that allows these loops
to properly terminate (only 1 file to change), or else (though less
attractive) would be to revise all the loops along the following lines:
/* Top level pool scope, need process-scope lifetime */
parent = pool;
while (parent) {
pool = parent;
parent = apr_pool_parent_get(pool);
#ifdef NETWARE
/* On NetWare, if parent returned == pool, we're at the top */
if (parent == pool)
break;
#endif
}
The loops are in mod_dbd.c, mod_dbm.c, mod_dso.c and mod_crypto.c.
Norm.