diff options
author | Stefan Fritsch <sf@apache.org> | 2011-11-07 20:42:08 +0000 |
---|---|---|
committer | Stefan Fritsch <sf@apache.org> | 2011-11-07 20:42:08 +0000 |
commit | 77f97d3e8290430aa37922f22b86190f0873d2ae (patch) | |
tree | bf9ab8bebe2f0a9c7bd11c70a2422459df35d76c /random | |
parent | 72062d84633b8996646a83c6c254cfed8455c90a (diff) | |
download | apr-77f97d3e8290430aa37922f22b86190f0873d2ae.tar.gz |
Clean up references to rng struct when pool is destroyed
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1198921 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'random')
-rw-r--r-- | random/unix/apr_random.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/random/unix/apr_random.c b/random/unix/apr_random.c index 852cfd6e3..b042b66bd 100644 --- a/random/unix/apr_random.c +++ b/random/unix/apr_random.c @@ -86,6 +86,23 @@ struct apr_random_t { static apr_random_t *all_random; +static apr_status_t random_cleanup(void *data) +{ + apr_random_t *remove_this = data, + *cur = all_random, + **prev_ptr = &all_random; + while (cur) { + if (cur == remove_this) { + *prev_ptr = cur->next; + break; + } + prev_ptr = &cur->next; + cur = cur->next; + } + return APR_SUCCESS; +} + + APR_DECLARE(void) apr_random_init(apr_random_t *g,apr_pool_t *p, apr_crypto_hash_t *pool_hash, apr_crypto_hash_t *key_hash, @@ -128,6 +145,7 @@ APR_DECLARE(void) apr_random_init(apr_random_t *g,apr_pool_t *p, g->next = all_random; all_random = g; + apr_pool_cleanup_register(p, g, random_cleanup, apr_pool_cleanup_null); } static void mix_pid(apr_random_t *g,unsigned char *H,pid_t pid) |