summaryrefslogtreecommitdiff
path: root/conf/conf.c
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2023-02-19 03:59:10 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2023-02-19 04:08:31 +0100
commiteefb29679957fed3724e6d5db2ddf112e28f646f (patch)
treeea58d6d1dc8548a09d6b18c200bf8a1f854d82ba /conf/conf.c
parentee919658948772105d0bd3b4535ba28883484f2c (diff)
Conf: Fix too early free of old configuration
The change 371eb49043d225d2bab8149187b813a14b4b86d2 introduced early free of old_config. Unfortunately, it did not properly check whether it is not still in use (blocked by obstacle during reconfiguration). Fix that. It also means that we still could have a short peak when three configs are in use (when a new reconfig is requeste while the previous one is still active).
Diffstat (limited to 'conf/conf.c')
-rw-r--r--conf/conf.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/conf/conf.c b/conf/conf.c
index 4e31de29..7ef729b3 100644
--- a/conf/conf.c
+++ b/conf/conf.c
@@ -197,8 +197,12 @@ cleanup:
void
config_free(struct config *c)
{
- if (c)
- rfree(c->pool);
+ if (!c)
+ return;
+
+ ASSERT(!c->obstacle_count);
+
+ rfree(c->pool);
}
/**
@@ -207,10 +211,14 @@ config_free(struct config *c)
* This function frees the old configuration (%old_config) that is saved for the
* purpose of undo. It is useful before parsing a new config when reconfig is
* requested, to avoid keeping three (perhaps memory-heavy) configs together.
+ * Configuration is not freed when it is still active during reconfiguration.
*/
void
config_free_old(void)
{
+ if (!old_config || old_config->obstacle_count)
+ return;
+
tm_stop(config_timer);
undo_available = 0;