From: Selva Nair Date: Tue, 7 Sep 2021 22:31:25 +0000 (-0400) Subject: Permit unlimited connection entries and remotes X-Git-Tag: v2.7_alpha1~619 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4954beb618e8bf2dc756019d5a36040d791a8f38;p=thirdparty%2Fopenvpn.git 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 --- diff --git a/Changes.rst b/Changes.rst index c9a63a041..47933ae09 100644 --- a/Changes.rst +++ b/Changes.rst @@ -10,6 +10,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