From ceba452ee44439b426b786325db2b4e1b1c8b663 Mon Sep 17 00:00:00 2001 From: Selva Nair Date: Tue, 7 Sep 2021 18:31:25 -0400 Subject: [PATCH] Permit unlimited connection entries and remotes Currently we allow a max of 64 connection entries and remotes. A larger number would allow users with 100's of independent config files for different end points of same provider to consolidate them to connection entries. v2,v3: no change Signed-off-by: Selva Nair Acked-by: Arne Schwabe Message-Id: <20210907223126.8440-2-selva.nair@gmail.com> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg22816.html Signed-off-by: Gert Doering (cherry picked from commit 4954beb618e8bf2dc756019d5a36040d791a8f38) --- Changes.rst | 2 ++ src/openvpn/options.c | 36 ++++++++++++++++++++++++++++++------ src/openvpn/options.h | 6 ++++-- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/Changes.rst b/Changes.rst index 4be3d665b..ab1b9c5f3 100644 --- a/Changes.rst +++ b/Changes.rst @@ -46,6 +46,8 @@ instead: https://github.com/OpenVPN/openvpn/issues New features ------------ +Support unlimited number of connection entries and remote entries + New management commands to enumerate and list remote entries Use ``remote-entry-count`` and ``remote-entry-get`` commands from the management interface to get the number of diff --git a/src/openvpn/options.c b/src/openvpn/options.c index 4442697f8..4e018fb84 100644 --- a/src/openvpn/options.c +++ b/src/openvpn/options.c @@ -916,6 +916,16 @@ init_options(struct options *o, const bool init_gc) void uninit_options(struct options *o) { + if (o->connection_list) + { + free(o->connection_list->array); + CLEAR(*o->connection_list); + } + if (o->remote_list) + { + free(o->remote_list->array); + CLEAR(*o->remote_list); + } if (o->gc_owned) { gc_free(&o->gc); @@ -2160,10 +2170,17 @@ alloc_connection_entry(struct options *options, const int msglevel) struct connection_list *l = alloc_connection_list_if_undef(options); struct connection_entry *e; - if (l->len >= CONNECTION_LIST_SIZE) + if (l->len == l->capacity) { - msg(msglevel, "Maximum number of 'connection' options (%d) exceeded", CONNECTION_LIST_SIZE); - return NULL; + int capacity = l->capacity + CONNECTION_LIST_SIZE; + struct connection_entry **ce = realloc(l->array, capacity*sizeof(struct connection_entry *)); + if (ce == NULL) + { + msg(msglevel, "Unable to process more connection options: out of memory. Number of entries = %d", l->len); + return NULL; + } + l->array = ce; + l->capacity = capacity; } ALLOC_OBJ_GC(e, struct connection_entry, &options->gc); l->array[l->len++] = e; @@ -2186,10 +2203,17 @@ alloc_remote_entry(struct options *options, const int msglevel) struct remote_list *l = alloc_remote_list_if_undef(options); struct remote_entry *e; - if (l->len >= CONNECTION_LIST_SIZE) + if (l->len == l->capacity) { - msg(msglevel, "Maximum number of 'remote' options (%d) exceeded", CONNECTION_LIST_SIZE); - return NULL; + int capacity = l->capacity + CONNECTION_LIST_SIZE; + struct remote_entry **re = realloc(l->array, capacity*sizeof(struct remote_entry *)); + if (re == NULL) + { + msg(msglevel, "Unable to process more remote options: out of memory. Number of entries = %d", l->len); + return NULL; + } + l->array = re; + l->capacity = capacity; } ALLOC_OBJ_GC(e, struct remote_entry, &options->gc); l->array[l->len++] = e; diff --git a/src/openvpn/options.h b/src/openvpn/options.h index 68ad0cacb..04cc2e5c1 100644 --- a/src/openvpn/options.h +++ b/src/openvpn/options.h @@ -183,15 +183,17 @@ struct remote_entry struct connection_list { + int capacity; int len; int current; - struct connection_entry *array[CONNECTION_LIST_SIZE]; + struct connection_entry **array; }; struct remote_list { + int capacity; int len; - struct remote_entry *array[CONNECTION_LIST_SIZE]; + struct remote_entry **array; }; struct provider_list -- 2.47.2