Hi, On Wed, Oct 23, 2013 at 04:18:29PM +0200, Gert Doering wrote: > - each further renegotiation leaks "a few kbyte" of memory per client, > which should also be fully returned when the client disconnects - this > is the issue I discovered earlier, with the GC handling of the per-client > environment set, and I'll send a patch for that "soon" (as soon as I > have fully understood the code involved).
Yeah... Fosdem 2012 rearing it's ugly head. Please try the following patch to git master, it should bring back 2.1-behaviour here. gert -- USENET is *not* the non-clickable part of WWW! //www.muc.de/~gert/ Gert Doering - Munich, Germany g...@greenie.muc.de fax: +49-89-35655025 g...@net.informatik.tu-muenchen.de
From b56e50638f436ca7e4bcffbb0025ee9efa4244d6 Mon Sep 17 00:00:00 2001 From: Gert Doering <g...@greenie.muc.de> List-Post: openvpn-devel@lists.sourceforge.net Date: Wed, 23 Oct 2013 17:54:05 +0200 Subject: [PATCH] Fix slow memory drain on each client renegotiation. This reverts commit bee92b479414d12035b0422f81ac5fcfe14fa645 and parts of commit dc7be6d078ba106f9b0de12f3e879c3561c3c537, as these introduced a subtle memory drain on client renegotiations (es->gc got initialized, which led to "unused" gc_entry records accumulating while a client is connected). Setting es->gc=NULL causes env_set_add_nolock() / remove_env_item() to free() allocated and no longer used strings in the es, while an active gc would leave them for cleanup with gc_free() at client disconnect time. Signed-off-by: Gert Doering <g...@greenie.muc.de> Conflicts: src/openvpn/buffer.c --- src/openvpn/buffer.c | 29 +++++++++++++++++++---------- src/openvpn/init.c | 2 +- src/openvpn/openvpn.c | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/openvpn/buffer.c b/src/openvpn/buffer.c index 56d14b1..fb3b52d 100644 --- a/src/openvpn/buffer.c +++ b/src/openvpn/buffer.c @@ -327,19 +327,28 @@ gc_malloc (size_t size, bool clear, struct gc_arena *a) #endif { void *ret; - struct gc_entry *e; - ASSERT (NULL != a); - + if (a) + { + struct gc_entry *e; #ifdef DMALLOC - e = (struct gc_entry *) openvpn_dmalloc (file, line, size + sizeof (struct gc_entry)); + e = (struct gc_entry *) openvpn_dmalloc (file, line, size + sizeof (struct gc_entry)); #else - e = (struct gc_entry *) malloc (size + sizeof (struct gc_entry)); + e = (struct gc_entry *) malloc (size + sizeof (struct gc_entry)); #endif - check_malloc_return (e); - ret = (char *) e + sizeof (struct gc_entry); - e->next = a->list; - a->list = e; - + check_malloc_return (e); + ret = (char *) e + sizeof (struct gc_entry); + e->next = a->list; + a->list = e; + } + else + { +#ifdef DMALLOC + ret = openvpn_dmalloc (file, line, size); +#else + ret = malloc (size); +#endif + check_malloc_return (ret); + } #ifndef ZERO_BUFFER_ON_ALLOC if (clear) #endif diff --git a/src/openvpn/init.c b/src/openvpn/init.c index 031fb20..ba15fe3 100644 --- a/src/openvpn/init.c +++ b/src/openvpn/init.c @@ -3030,7 +3030,7 @@ 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); } diff --git a/src/openvpn/openvpn.c b/src/openvpn/openvpn.c index 104c9e9..5125eae 100644 --- a/src/openvpn/openvpn.c +++ b/src/openvpn/openvpn.c @@ -171,7 +171,7 @@ openvpn_main (int argc, char *argv[]) gc_init (&c.gc); /* initialize environmental variable store */ - c.es = env_set_create (&c.gc); + c.es = env_set_create (NULL); #ifdef WIN32 set_win_sys_path_via_env (c.es); #endif -- 1.8.1.5
pgpJ35KbIGlex.pgp
Description: PGP signature