diff options
author | james <james@e7ae566f-a301-0410-adde-c780ea21d3b5> | 2006-11-23 22:05:14 +0000 |
---|---|---|
committer | james <james@e7ae566f-a301-0410-adde-c780ea21d3b5> | 2006-11-23 22:05:14 +0000 |
commit | 2a64816b391395d925e0f7ff79d200bbb562fe7e (patch) | |
tree | 372e7f53f484b96e9e2b3f129fb516ee51f2b293 /init.c | |
parent | Interim snapshot 2.1_rc1b (diff) | |
download | openvpn-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 'init.c')
-rw-r--r-- | init.c | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -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) |