From: Timo Sirainen Date: Sun, 5 Oct 2025 17:23:16 +0000 (+0300) Subject: lib-settings: Fix settings history when plugins have registered settings X-Git-Tag: 2.4.2~113 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=112f72f7ce18af3bec48edfa4b77ab3048d3f7dd;p=thirdparty%2Fdovecot%2Fcore.git lib-settings: Fix settings history when plugins have registered settings The settings are expected to be sorted by the version number. --- diff --git a/src/lib-settings/settings-history.c b/src/lib-settings/settings-history.c index e3d50ea64f..428f496c92 100644 --- a/src/lib-settings/settings-history.c +++ b/src/lib-settings/settings-history.c @@ -2,19 +2,34 @@ #include "lib.h" #include "array.h" +#include "version.h" #include "settings-history.h" #include "settings-history-core.h" static struct settings_history history; +static int +settings_history_default_cmp(const struct setting_history_default *d1, + const struct setting_history_default *d2) +{ + return version_cmp(d1->version, d2->version); +} + +static int +settings_history_rename_cmp(const struct setting_history_rename *r1, + const struct setting_history_rename *r2) +{ + return version_cmp(r1->version, r2->version); +} + static void settings_history_free(void) { array_free(&history.defaults); array_free(&history.renames); } -struct settings_history *settings_history_get(void) +static struct settings_history *settings_history_get_unsorted(void) { if (array_is_created(&history.defaults)) return &history; @@ -34,18 +49,33 @@ struct settings_history *settings_history_get(void) return &history; } +struct settings_history *settings_history_get(void) +{ + struct settings_history *history = settings_history_get_unsorted(); + if (history->sort_pending) { + array_sort(&history->defaults, + settings_history_default_cmp); + array_sort(&history->renames, + settings_history_rename_cmp); + history->sort_pending = FALSE; + } + return history; +} + void settings_history_register_defaults( const struct setting_history_default *defaults, unsigned int count) { - struct settings_history *history = settings_history_get(); + struct settings_history *history = settings_history_get_unsorted(); array_append(&history->defaults, defaults, count); + history->sort_pending = TRUE; } void settings_history_register_renames( const struct setting_history_rename *renames, unsigned int count) { - struct settings_history *history = settings_history_get(); + struct settings_history *history = settings_history_get_unsorted(); array_append(&history->renames, renames, count); + history->sort_pending = TRUE; } diff --git a/src/lib-settings/settings-history.h b/src/lib-settings/settings-history.h index 5379387bd2..e3b2a9a8b5 100644 --- a/src/lib-settings/settings-history.h +++ b/src/lib-settings/settings-history.h @@ -15,6 +15,7 @@ struct setting_history_rename { struct settings_history { ARRAY(struct setting_history_default) defaults; ARRAY(struct setting_history_rename) renames; + bool sort_pending; }; struct settings_history *settings_history_get(void);