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

Attachment: pgpJ35KbIGlex.pgp
Description: PGP signature

Reply via email to