From 30a27ba428f346ff2fd56f9727ce0f1fb18a5a41 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 25 Apr 2013 19:47:00 +0200 Subject: s3:idmap:autorid: make calculation in idmap_autorid_sid_to_id much more obvious This is my attempt to make the sid->unix-id calculation much more obvious. Especially with the introduction of the multi-range support an the originally named "multiplier", the calculation id = low_id + range_size * domain_number + rid - range_size * multiplier was rather opaque to me. What really happens here is this: The rid is split into a reduced_rid part that is < rangesize and a multiple of rangesize. This is given by the formula rid = rid % range_size + (rid / range_size) * range_size We define reduced_rid := rid % range_size and domain_range_index := rid / range_size ( == the original multiplier) and the original formula is equivalent to: id = reduced_rid + low_id + range_number * range_size; and reads id = reduced_rid + range_minvalue if we set range_minvalue := low_id + range_number * range_size. Signed-off-by: Michael Adam Reviewed-by: Christian Ambach --- source3/winbindd/idmap_autorid.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'source3') diff --git a/source3/winbindd/idmap_autorid.c b/source3/winbindd/idmap_autorid.c index ce55af97b6..d0a7b675e3 100644 --- a/source3/winbindd/idmap_autorid.c +++ b/source3/winbindd/idmap_autorid.c @@ -351,12 +351,15 @@ static NTSTATUS idmap_autorid_sid_to_id(struct autorid_global_config *global, struct id_map *map) { uint32_t rid; + uint32_t reduced_rid; + uint32_t range_start; sid_peek_rid(map->sid, &rid); - map->xid.id = global->minvalue + - (global->rangesize * range->rangenum) + rid - - (global->rangesize * range->domain_range_index); + reduced_rid = rid % global->rangesize; + range_start = global->minvalue + range->rangenum * global->rangesize; + + map->xid.id = reduced_rid + range_start; map->xid.type = ID_TYPE_BOTH; /* We **really** should have some way of validating -- cgit