From 65881c3118044e101d4b04737c471725802a4e09 Mon Sep 17 00:00:00 2001 From: Atul Kulkarni Date: Wed, 28 Aug 2013 17:19:30 +0200 Subject: idmap_autorid: move the checks from idmap_autorid_initialize to idmap_autorid_saveconfig() Pair-Programmed-With: Michael Adam Signed-off-by: Atul Kulkarni Signed-off-by: Michael Adam Reviewed-by: Volker Lendecke --- source3/winbindd/idmap_autorid.c | 54 ------------------------------- source3/winbindd/idmap_autorid_tdb.c | 63 ++++++++++++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 56 deletions(-) (limited to 'source3/winbindd') diff --git a/source3/winbindd/idmap_autorid.c b/source3/winbindd/idmap_autorid.c index 60ce33c35f..fb0985b9dd 100644 --- a/source3/winbindd/idmap_autorid.c +++ b/source3/winbindd/idmap_autorid.c @@ -595,9 +595,7 @@ static NTSTATUS idmap_autorid_initialize(struct idmap_domain *dom) { struct idmap_tdb_common_context *commonconfig; struct autorid_global_config *config; - struct autorid_global_config *storedconfig = NULL; NTSTATUS status; - uint32_t hwm; if (!strequal(dom->name, "*")) { DEBUG(0, ("idmap_autorid_initialize: Error: autorid configured " @@ -635,12 +633,6 @@ static NTSTATUS idmap_autorid_initialize(struct idmap_domain *dom) config->rangesize = lp_parm_int(-1, "idmap config *", "rangesize", 100000); - if (config->rangesize < 2000) { - DEBUG(1, ("autorid rangesize must be at least 2000\n")); - status = NT_STATUS_INVALID_PARAMETER; - goto error; - } - config->maxranges = (dom->high_id - dom->low_id + 1) / config->rangesize; @@ -660,50 +652,6 @@ static NTSTATUS idmap_autorid_initialize(struct idmap_domain *dom) config->maxranges)); } - DEBUG(10, ("Current configuration in config is " - "minvalue:%d rangesize:%d maxranges:%d\n", - config->minvalue, config->rangesize, config->maxranges)); - - /* read previously stored config and current HWM */ - status = idmap_autorid_loadconfig(autorid_db, talloc_tos(), - &storedconfig); - if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) { - DEBUG(5, ("No configuration found. Storing initial " - "configuration.\n")); - } else if (!NT_STATUS_IS_OK(status)) { - goto error; - } - - status = dbwrap_fetch_uint32_bystring(autorid_db, HWM, &hwm); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(1, ("Fatal error while fetching current " - "HWM value: %s\n", nt_errstr(status))); - status = NT_STATUS_INTERNAL_ERROR; - goto error; - } - - /* did the minimum value or rangesize change? */ - if (storedconfig && - ((storedconfig->minvalue != config->minvalue) || - (storedconfig->rangesize != config->rangesize))) { - DEBUG(1, ("New configuration values for rangesize or " - "minimum uid value conflict with previously " - "used values! Aborting initialization\n")); - status = NT_STATUS_INVALID_PARAMETER; - goto error; - } - - /* - * has the highest uid value been reduced to setting that is not - * sufficient any more for already existing ranges? - */ - if (hwm > config->maxranges) { - DEBUG(1, ("New upper uid limit is too low to cover " - "existing mappings! Aborting initialization\n")); - status = NT_STATUS_INVALID_PARAMETER; - goto error; - } - status = idmap_autorid_saveconfig(autorid_db, config); if (!NT_STATUS_IS_OK(status)) { @@ -738,8 +686,6 @@ error: talloc_free(config); done: - talloc_free(storedconfig); - return status; } diff --git a/source3/winbindd/idmap_autorid_tdb.c b/source3/winbindd/idmap_autorid_tdb.c index 7ded36f847..048c1761a8 100644 --- a/source3/winbindd/idmap_autorid_tdb.c +++ b/source3/winbindd/idmap_autorid_tdb.c @@ -324,9 +324,68 @@ NTSTATUS idmap_autorid_saveconfig(struct db_context *db, struct autorid_global_config *cfg) { - NTSTATUS status; + struct autorid_global_config *storedconfig = NULL; + NTSTATUS status = NT_STATUS_INVALID_PARAMETER; TDB_DATA data; char *cfgstr; + uint32_t hwm; + + DEBUG(10, ("New configuration provided for storing is " + "minvalue:%d rangesize:%d maxranges:%d\n", + cfg->minvalue, cfg->rangesize, cfg->maxranges)); + + if (cfg->rangesize < 2000) { + DEBUG(1, ("autorid rangesize must be at least 2000\n")); + goto done; + } + + if (cfg->maxranges == 0) { + DEBUG(1, ("An autorid maxranges value of 0 is invalid. " + "Must have at least one range available.\n")); + goto done; + } + + status = idmap_autorid_loadconfig(db, talloc_tos(), &storedconfig); + if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) { + DEBUG(5, ("No configuration found. Storing initial " + "configuration.\n")); + } else if (!NT_STATUS_IS_OK(status)) { + goto done; + } + + /* did the minimum value or rangesize change? */ + if (storedconfig && + ((storedconfig->minvalue != cfg->minvalue) || + (storedconfig->rangesize != cfg->rangesize))) + { + DEBUG(1, ("New configuration values for rangesize or " + "minimum uid value conflict with previously " + "used values! Not storing new config.\n")); + TALLOC_FREE(storedconfig); + status = NT_STATUS_INVALID_PARAMETER; + goto done; + } + + TALLOC_FREE(storedconfig); + + status = dbwrap_fetch_uint32_bystring(db, HWM, &hwm); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(1, ("Fatal error while fetching current " + "HWM value: %s\n", nt_errstr(status))); + status = NT_STATUS_INTERNAL_ERROR; + goto done; + } + + /* + * has the highest uid value been reduced to setting that is not + * sufficient any more for already existing ranges? + */ + if (hwm > cfg->maxranges) { + DEBUG(1, ("New upper uid limit is too low to cover " + "existing mappings! Not storing new config.\n")); + status = NT_STATUS_INVALID_PARAMETER; + goto done; + } cfgstr = talloc_asprintf(talloc_tos(), @@ -341,7 +400,7 @@ NTSTATUS idmap_autorid_saveconfig(struct db_context *db, status = dbwrap_trans_store_bystring(db, CONFIGKEY, data, TDB_REPLACE); - talloc_free(cfgstr); + TALLOC_FREE(cfgstr); return status; } -- cgit