aboutsummaryrefslogtreecommitdiff
path: root/init.c
diff options
context:
space:
mode:
authorjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>2006-11-23 22:05:14 +0000
committerjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>2006-11-23 22:05:14 +0000
commit2a64816b391395d925e0f7ff79d200bbb562fe7e (patch)
tree372e7f53f484b96e9e2b3f129fb516ee51f2b293 /init.c
parentInterim snapshot 2.1_rc1b (diff)
downloadopenvpn-2a64816b391395d925e0f7ff79d200bbb562fe7e.tar.xz
Fixed issue where struct env_set methods that
change the value of an existing name=value pair would delay the freeing of the memory held by the previous name=value pair until the underlying client instance object is closed. This could cause a server that handles long-term client connections, resulting in many periodic calls to verify_callback, to needlessly grow the env_set memory allocation until the underlying client instance object is closed. git-svn-id: http://svn.openvpn.net/projects/openvpn/branches/BETA21/openvpn@1493 e7ae566f-a301-0410-adde-c780ea21d3b5
Diffstat (limited to '')
-rw-r--r--init.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/init.c b/init.c
index 244f03c..2cff87c 100644
--- a/init.c
+++ b/init.c
@@ -2272,10 +2272,22 @@ do_close_ifconfig_pool_persist (struct context *c)
static void
do_inherit_env (struct context *c, const struct env_set *src)
{
- c->c2.es = env_set_create (&c->c2.gc);
+ c->c2.es = env_set_create (NULL);
+ c->c2.es_owned = true;
env_set_inherit (c->c2.es, src);
}
+static void
+do_env_set_destroy (struct context *c)
+{
+ if (c->c2.es && c->c2.es_owned)
+ {
+ env_set_destroy (c->c2.es);
+ c->c2.es = NULL;
+ c->c2.es_owned = false;
+ }
+}
+
/*
* Fast I/O setup. Fast I/O is an optimization which only works
* if all of the following are true:
@@ -2798,6 +2810,9 @@ close_instance (struct context *c)
/* close --ifconfig-pool-persist obj */
do_close_ifconfig_pool_persist (c);
+ /* free up environmental variable store */
+ do_env_set_destroy (c);
+
/* garbage collect */
gc_free (&c->c2.gc);
}
@@ -2922,6 +2937,7 @@ inherit_context_top (struct context *dest,
dest->c2.event_set_owned = false;
dest->c2.link_socket_owned = false;
dest->c2.buffers_owned = false;
+ dest->c2.es_owned = false;
dest->c2.event_set = NULL;
if (src->options.proto == PROTO_UDPv4)