@@ -601,6 +601,13 @@
if (mi->context.c2.tls_multi->peer_id != MAX_PEER_ID)
{
m->instances[mi->context.c2.tls_multi->peer_id] = NULL;
+
+ /* Adjust the max_peerid as this might have been the highest
+ * peer id instance */
+ while (m->max_peerid > 0 && m->instances[m->max_peerid] == NULL)
+ {
+ m->max_peerid--;
+ }
}
schedule_remove_entry(m->schedule, (struct schedule_entry *)mi);
@@ -652,7 +659,7 @@
{
if (m->hash)
{
- for (int i = 0; i < m->max_clients; i++)
+ for (uint32_t i = 0; i <= m->max_peerid; i++)
{
struct multi_instance *mi = m->instances[i];
if (mi)
@@ -1326,7 +1333,7 @@
{
int count = 0;
- for (int i = 0; i < m->max_clients; i++)
+ for (uint32_t i = 0; i <= m->max_peerid; i++)
{
struct multi_instance *mi = m->instances[i];
if (mi && mi != new_mi && !mi->halt)
@@ -2885,7 +2892,7 @@
#endif
mb = mbuf_alloc_buf(buf);
- for (int i = 0; i < m->max_clients; i++)
+ for (uint32_t i = 0; i <= m->max_peerid; i++)
{
struct multi_instance *mi = m->instances[i];
@@ -3794,7 +3801,7 @@
multi_push_restart_schedule_exit(struct multi_context *m, bool next_server)
{
/* tell all clients to restart */
- for (int i = 0; i < m->max_clients; i++)
+ for (uint32_t i = 0; i <= m->max_peerid; i++)
{
struct multi_instance *mi = m->instances[i];
if (mi && !mi->halt && proto_is_dgram(mi->context.c2.link_sockets[0]->info.proto))
@@ -3876,7 +3883,7 @@
struct multi_context *m = (struct multi_context *)arg;
int count = 0;
- for (int i = 0; i < m->max_clients; i++)
+ for (uint32_t i = 0; i <= m->max_peerid; i++)
{
struct multi_instance *mi = m->instances[i];
if (mi && !mi->halt)
@@ -3907,7 +3914,7 @@
maddr.proto = proto;
if (mroute_extract_openvpn_sockaddr(&maddr, &saddr, true))
{
- for (int i = 0; i < m->max_clients; i++)
+ for (uint32_t i = 0; i <= m->max_peerid; i++)
{
struct multi_instance *mi = m->instances[i];
if (mi && !mi->halt && mroute_addr_equal(&maddr, &mi->real))
@@ -4100,8 +4107,14 @@
}
/* should not really end up here, since multi_create_instance returns null
- * if amount of clients exceeds max_clients */
+ * if amount of clients exceeds max_clients and this method would then
+ * also not have been called */
ASSERT(mi->context.c2.tls_multi->peer_id < m->max_clients);
+
+ if (mi->context.c2.tls_multi->peer_id > m->max_peerid)
+ {
+ m->max_peerid = mi->context.c2.tls_multi->peer_id;
+ }
}
#if defined(__GNUC__) || defined(__clang__)
@@ -160,9 +160,12 @@
*/
struct multi_context
{
- struct multi_instance **instances; /**< Array of multi_instances. An instance can be
+ struct multi_instance **instances; /**< Array of multi_instances with the size of
+ * max_clients. An instance can be
* accessed using peer-id as an index. */
-
+ uint32_t max_peerid; /**< currently highest allocated peerid and
+ * maximum allocated/valid index in
+ * instances */
struct hash *hash; /**< VPN tunnel instances indexed by real
* address of the remote peer. */
struct hash *vhash; /**< VPN tunnel instances indexed by
@@ -317,7 +317,7 @@
int count = 0;
- for (int i = 0; i < m->max_clients; i++)
+ for (uint32_t i = 0; i <= m->max_peerid; i++)
{
struct multi_instance *curr_mi = m->instances[i];