diff options
author | Stefan Metzmacher <metze@samba.org> | 2019-03-21 14:05:13 +0100 |
---|---|---|
committer | Jule Anger <janger@samba.org> | 2023-04-05 10:40:13 +0000 |
commit | 31cedf58e695128509215e5e5e5e0bec53531832 (patch) | |
tree | b8cce6f16f22672f018b46420aedf0760f24ca78 | |
parent | 54e872cdf051e718b6ba186ab80b4e7974cd13cf (diff) | |
download | samba-31cedf58e695128509215e5e5e5e0bec53531832.tar.gz |
idmap_hash: split out a idmap_hash_id_to_sid() helper function
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15319
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
(cherry picked from commit 57150b463fb8e27c048670f7b4902bd091ee3ae9)
-rw-r--r-- | source3/winbindd/idmap_hash/idmap_hash.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/source3/winbindd/idmap_hash/idmap_hash.c b/source3/winbindd/idmap_hash/idmap_hash.c index ff9f86b6676..1f353c331d5 100644 --- a/source3/winbindd/idmap_hash/idmap_hash.c +++ b/source3/winbindd/idmap_hash/idmap_hash.c @@ -183,6 +183,32 @@ done: /********************************************************************* ********************************************************************/ +static NTSTATUS idmap_hash_id_to_sid(struct sid_hash_table *hashed_domains, + struct idmap_domain *dom, + struct id_map *id) +{ + uint32_t h_domain = 0, h_rid = 0; + + id->status = ID_UNMAPPED; + + separate_hashes(id->xid.id, &h_domain, &h_rid); + + /* + * If the domain hash doesn't find a SID in the table, + * skip it + */ + if (hashed_domains[h_domain].sid == NULL) { + /* keep ID_UNMAPPED */ + return NT_STATUS_OK; + } + + id->xid.type = ID_TYPE_BOTH; + sid_compose(id->sid, hashed_domains[h_domain].sid, h_rid); + id->status = ID_MAPPED; + + return NT_STATUS_OK; +} + static NTSTATUS unixids_to_sids(struct idmap_domain *dom, struct id_map **ids) { @@ -199,22 +225,20 @@ static NTSTATUS unixids_to_sids(struct idmap_domain *dom, } for (i=0; ids[i]; i++) { - uint32_t h_domain, h_rid; - - ids[i]->status = ID_UNMAPPED; - - separate_hashes(ids[i]->xid.id, &h_domain, &h_rid); - - /* If the domain hash doesn't find a SID in the table, - skip it */ - - if (!hashed_domains[h_domain].sid) - continue; + NTSTATUS ret; + + ret = idmap_hash_id_to_sid(hashed_domains, dom, ids[i]); + if (!NT_STATUS_IS_OK(ret)) { + /* some fatal error occurred, log it */ + DBG_NOTICE("Unexpected error resolving an ID " + "(%d): %s\n", ids[i]->xid.id, + nt_errstr(ret)); + return ret; + } - ids[i]->xid.type = ID_TYPE_BOTH; - sid_compose(ids[i]->sid, hashed_domains[h_domain].sid, h_rid); - ids[i]->status = ID_MAPPED; - num_mapped++; + if (ids[i]->status == ID_MAPPED) { + num_mapped++; + } } if (num_tomap == num_mapped) { |