diff options
-rw-r--r-- | source3/winbindd/idmap_autorid.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/source3/winbindd/idmap_autorid.c b/source3/winbindd/idmap_autorid.c index 45a9d353fb..503f8748b7 100644 --- a/source3/winbindd/idmap_autorid.c +++ b/source3/winbindd/idmap_autorid.c @@ -330,12 +330,35 @@ static NTSTATUS idmap_autorid_sids_to_unixids(struct idmap_domain *dom, } +/* initialize the given HWM to 0 if it does not exist yet */ +static NTSTATUS idmap_autorid_init_hwm(const char *hwm) { + + NTSTATUS status; + uint32_t hwmval; + + status = dbwrap_fetch_uint32(autorid_db, hwm, &hwmval); + if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) { + status = dbwrap_trans_store_int32(autorid_db, hwm, 0); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, + ("Unable to initialise HWM (%s) in autorid " + "database: %s\n", hwm, nt_errstr(status))); + return NT_STATUS_INTERNAL_DB_ERROR; + } + } else if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("unable to fetch HWM (%s) from autorid " + "database: %s\n", hwm, nt_errstr(status))); + return status; + } + + return NT_STATUS_OK; +} + /* * open and initialize the database which stores the ranges for the domains */ static NTSTATUS idmap_autorid_db_init(void) { - int32_t hwm; NTSTATUS status; if (autorid_db) { @@ -354,22 +377,9 @@ static NTSTATUS idmap_autorid_db_init(void) } /* Initialize high water mark for the currently used range to 0 */ - status = dbwrap_fetch_int32(autorid_db, HWM, &hwm); - if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND) || - (NT_STATUS_IS_OK(status) && (hwm < 0))) - { - status = dbwrap_trans_store_int32(autorid_db, HWM, 0); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, - ("Unable to initialise HWM in autorid " - "database: %s\n", nt_errstr(status))); - return NT_STATUS_INTERNAL_DB_ERROR; - } - } else if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("unable to fetch HWM from autorid database: %s\n", - nt_errstr(status))); - return status; - } + + status = idmap_autorid_init_hwm(HWM); + NT_STATUS_NOT_OK_RETURN(status); return NT_STATUS_OK; } |