diff options
author | Michael Adam <obnox@samba.org> | 2013-04-25 19:47:00 +0200 |
---|---|---|
committer | Christian Ambach <ambi@samba.org> | 2013-05-06 16:33:39 +0200 |
commit | 30a27ba428f346ff2fd56f9727ce0f1fb18a5a41 (patch) | |
tree | 394d3d305760563ca25728fb04e6ee709557ac5e | |
parent | a0ea6c2536b6b07f2fee799518b5f84da36e53ba (diff) | |
download | samba-30a27ba428f346ff2fd56f9727ce0f1fb18a5a41.tar.gz samba-30a27ba428f346ff2fd56f9727ce0f1fb18a5a41.tar.bz2 samba-30a27ba428f346ff2fd56f9727ce0f1fb18a5a41.zip |
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 <obnox@samba.org>
Reviewed-by: Christian Ambach <ambi@samba.org>
-rw-r--r-- | source3/winbindd/idmap_autorid.c | 9 |
1 files changed, 6 insertions, 3 deletions
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 |