The branch, master has been updated
       via  8d34f2f docs: update the description of the formulas in the 
idmap_autorid manpage
       via  7bc9563 s3:idmap:autorid: add a comment block explaining the 
calculations
       via  9c6594d s3:idmap:autorid: simplify the id->sid calculation
       via  7b9a567 s3:idmap:autorid: calculate the range's low_id in 
idmap_autorid_get_domainrange()
       via  30a27ba s3:idmap:autorid: make calculation in 
idmap_autorid_sid_to_id much more obvious
       via  a0ea6c2 s3:idmap:autorid: rename range.multiplier to 
domain_range_index
       via  196aa1d s3:idmap:autorid: rename autorid_range_config.sid to 
domsid, along with instances
       via  2a25874 s3:idmap:autorid: rename autorid_domain_config --> 
autorid_range_config and instances to "range"
       via  11b9b7d s3:idmap:autorid: rename domainnum to rangenum
       via  5190e4d docs-xml: manpage update for autorid multirange support
       via  b384c55 s3:winbindd/autorid multiple range support
       via  e0a0280 s3:utils fix wrong usage of PRIu64 in sscanf
       via  24ce31a s3:lib fix wrong usage of PRIu64 in sscanf
       via  a4cc41d lib/replace: add SCNx macros
       via  d68e676 lib/replace: prefer inttypes.h over stdint.h
      from  bbf6221 selftest: do not run doc tests if we don't build manpages

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8d34f2fe1e219a0be28bc6b8ce9f93620d39a5b2
Author: Michael Adam <ob...@samba.org>
Date:   Fri Apr 26 01:06:58 2013 +0200

    docs: update the description of the formulas in the idmap_autorid manpage
    
    Signed-off-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Christian Ambach <a...@samba.org>
    
    Autobuild-User(master): Christian Ambach <a...@samba.org>
    Autobuild-Date(master): Mon May  6 18:23:56 CEST 2013 on sn-devel-104

commit 7bc9563c96c0b91628ec501f8226c1adc24d083d
Author: Michael Adam <ob...@samba.org>
Date:   Fri Apr 26 00:52:49 2013 +0200

    s3:idmap:autorid: add a comment block explaining the calculations
    
    Signed-off-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Christian Ambach <a...@samba.org>

commit 9c6594dadbdd800470d4b217f1351fbba87989ba
Author: Michael Adam <ob...@samba.org>
Date:   Thu Apr 25 20:24:36 2013 +0200

    s3:idmap:autorid: simplify the id->sid calculation
    
    To make it more intutive.
    
    rid = reduced_rid + domain_range_index * range_size
    
    where
    
    reduced_rid = (id - id_low) % range_size
    
    Signed-off-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Christian Ambach <a...@samba.org>

commit 7b9a567b8943e0c3d0b6fa97bea72f1b89aea4ab
Author: Michael Adam <ob...@samba.org>
Date:   Thu Apr 25 20:12:39 2013 +0200

    s3:idmap:autorid: calculate the range's low_id in 
idmap_autorid_get_domainrange()
    
    This way, the calculation needs to be don only in one central place and
    the formulas get simpler.
    
    Signed-off-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Christian Ambach <a...@samba.org>

commit 30a27ba428f346ff2fd56f9727ce0f1fb18a5a41
Author: Michael Adam <ob...@samba.org>
Date:   Thu Apr 25 19:47:00 2013 +0200

    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 <ob...@samba.org>
    Reviewed-by: Christian Ambach <a...@samba.org>

commit a0ea6c2536b6b07f2fee799518b5f84da36e53ba
Author: Michael Adam <ob...@samba.org>
Date:   Thu Apr 25 19:18:27 2013 +0200

    s3:idmap:autorid: rename range.multiplier to domain_range_index
    
    The name multiplier is very confusing (at least for me).
    This is an index that is used to reference the various
    per-domain ranges.
    
    Signed-off-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Christian Ambach <a...@samba.org>

commit 196aa1dea76b894ebdcf4322bb52edeac57d68ce
Author: Michael Adam <ob...@samba.org>
Date:   Thu Apr 25 19:13:45 2013 +0200

    s3:idmap:autorid: rename autorid_range_config.sid to domsid, along with 
instances
    
    Signed-off-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Christian Ambach <a...@samba.org>

commit 2a258747b6ec67e9e5d4aa97ffeeabeab0e94d6c
Author: Michael Adam <ob...@samba.org>
Date:   Thu Apr 25 19:04:56 2013 +0200

    s3:idmap:autorid: rename autorid_domain_config --> autorid_range_config and 
instances to "range"
    
    This describes it better with the new support for multiple ranges for 
domains.
    
    Signed-off-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Christian Ambach <a...@samba.org>

commit 11b9b7d051575ff5b398c240bd33dadac9c4ed81
Author: Michael Adam <ob...@samba.org>
Date:   Thu Apr 25 13:56:03 2013 +0200

    s3:idmap:autorid: rename domainnum to rangenum
    
    Now ranges don't correspond to domains any more, but
    multiple ranges are associated to a domain. So the name
    is misleading.
    
    Signed-off-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Christian Ambach <a...@samba.org>

commit 5190e4da2b51fdfa6df452a23127add5059cc4ac
Author: Abhidnya Joshi <achir...@in.ibm.com>
Date:   Tue Apr 16 16:41:45 2013 +0530

    docs-xml: manpage update for autorid multirange support
    
    Signed-off-by: Abhidnya Joshi <achir...@in.ibm.com>
    Reviewed-by: Christian Ambach <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit b384c55bf3fa230a945f36c493427f2341051cd1
Author: Abhidnya Joshi <achir...@in.ibm.com>
Date:   Wed Apr 10 16:26:07 2013 +0530

    s3:winbindd/autorid multiple range support
    
    when a mapping request for a RID comes in that is larger
    than the rangesize, allocate an extension range to be able
    to map this one
    
    This is especially important for large installations which
    might have large RIDs being used in a trusted domain that
    the administrator was not aware of when planning for autorid
    usage and so those objects could not be mapped up to now.
    As it is not possible to change the rangesize after the first
    start of autorid, this would lead to big trouble.
    
    Signed-off-by: Abhidnya Joshi <achir...@in.ibm.com>
    Reviewed-by: Christian Ambach <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit e0a0280c4fcf85f28b488d3868be38123910271c
Author: Christian Ambach <a...@samba.org>
Date:   Tue Apr 16 12:39:55 2013 +0200

    s3:utils fix wrong usage of PRIu64 in sscanf
    
    Signed-off-by: Christian Ambach <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 24ce31a33ff15b11e5c5024b911637a46bbd59ea
Author: Christian Ambach <a...@samba.org>
Date:   Tue Apr 16 12:39:39 2013 +0200

    s3:lib fix wrong usage of PRIu64 in sscanf
    
    Signed-off-by: Christian Ambach <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit a4cc41d4d0ef42915694e10cd819462523b92a3b
Author: Christian Ambach <a...@samba.org>
Date:   Tue Apr 16 10:56:29 2013 +0200

    lib/replace: add SCNx macros
    
    we already have PRI*, but the corresponding SCN* were missing
    
    Signed-off-by: Christian Ambach <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit d68e676cacdcd346f0555c80a3389f50079d2e4f
Author: Christian Ambach <a...@samba.org>
Date:   Tue Apr 9 23:10:16 2013 +0200

    lib/replace: prefer inttypes.h over stdint.h
    
    according to C99 7.8, inttypes.h should include stdint.h so prefer 
inttypes.h
    and fall back to stdint.h (and our own definitions of PRI*) only when 
inttypes.h
    could not be found
    
    Signed-off-by: Christian Ambach <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/manpages/idmap_autorid.8.xml |   38 ++++---
 lib/replace/replace.h                 |   47 ++++++++-
 source3/lib/util_str.c                |    2 +-
 source3/utils/smbcquotas.c            |    4 +-
 source3/winbindd/idmap_autorid.c      |  191 +++++++++++++++++++++++----------
 5 files changed, 207 insertions(+), 75 deletions(-)


Changeset truncated at 500 lines:

diff --git a/docs-xml/manpages/idmap_autorid.8.xml 
b/docs-xml/manpages/idmap_autorid.8.xml
index ed698e9..c35f903 100644
--- a/docs-xml/manpages/idmap_autorid.8.xml
+++ b/docs-xml/manpages/idmap_autorid.8.xml
@@ -40,17 +40,21 @@
                <varlistentry>
                <term>rangesize = numberofidsperdomain</term>
                <listitem><para>
-                       Defines the available number of uids/gids per domain. 
The
-                       minimum needed value is 2000. SIDs with RIDs larger 
than this
-                       value cannot be mapped, are ignored and the 
corresponding map
-                       is discarded. Choose this value carefully, as this 
should
-                       not be changed after the first ranges for domains have 
been
-                       defined, otherwise mappings between domains will get 
intermixed
-                       leading to unpredictable results. Please note that RIDs 
in Windows
-                       Domains usually start with 500 for builtin users and 
1000
-                       for regular users. As the parameter cannot be changed 
later, please
-                       plan accordingly for your expected number of users in a 
domain
-                       with safety margins.
+                       Defines the number of uids/gids available per
+                       domain range. The minimum needed value is 2000.
+                       SIDs with RIDs larger than this value will be mapped
+                       into extension ranges depending upon number of available
+                       ranges. If the autorid backend runs out of available
+                       ranges, mapping requests for new domains (or new
+                       extension ranges for domains already known) are ignored
+                       and the corresponding map is discarded.
+                       </para>
+                       <para>
+                       Example: with rangesize set to 10000, users/groups with
+                       a RID up to 10000 will be put into the first range for 
the
+                       domain. When attempting to map the an object with a RID
+                       of 25000, an extension range will be allocated that
+                       will then be used to map all RIDs from 20000-29999.
                        </para>
                        <para>One range will be used for local users and groups 
and for
                        non-domain well-known SIDs like Everyone (S-1-1-0) or 
Creator Owner (S-1-3-0).
@@ -84,15 +88,20 @@
        <para>
                The Unix ID for a RID is calculated this way:
                <programlisting>
-                       ID = IDMAP UID LOW VALUE + DOMAINRANGENUMBER * 
RANGESIZE + RID
+                       ID =  REDUCED RID + IDMAP RANGE LOW VALUE + RANGE 
NUMBER * RANGE SIZE
                </programlisting>
+               where REDUCED RID = RID % RANGE_SIZE
+               and a DOMAIN RANGE INDEX = RID / RANGE_SIZE is used together 
with the
+               domain sid to determine the RANGE NUMBER (stored in the 
database).
        </para>
        <para>
                Correspondingly, the formula for calculating the RID for a
                given Unix ID is this:
                <programlisting>
-                       RID = ID - IDMAP UID LOW VALUE - DOMAINRANGENUMBER * 
RANGESIZE
+                       RID = (ID - LOW ID) % RANGE SIZE + DOMAIN RANGE INDEX * 
RANGE SIZE
                </programlisting>
+               Where the DOMAIN RANGE INDEX is retrieved from the database 
along with the
+               domain sid by the RANGE NUMBER = (ID - LOW ID) / RANGE SIZE .
        </para>
 </refsect1>
 
@@ -100,7 +109,8 @@
        <title>EXAMPLES</title>
        <para>
                This example shows you the minimal configuration that will
-               work for the principial domain and 19 trusted domains.
+               work for the principial domain and 19 trusted domains / range
+               extensions.
        </para>
 
        <programlisting>
diff --git a/lib/replace/replace.h b/lib/replace/replace.h
index 9774da4..c0b7997 100644
--- a/lib/replace/replace.h
+++ b/lib/replace/replace.h
@@ -46,14 +46,14 @@
 #endif
 
 
-#ifdef HAVE_STDINT_H
+#ifdef HAVE_INTTYPES_H
+#define __STDC_FORMAT_MACROS
+#include <inttypes.h>
+#elif HAVE_STDINT_H
 #include <stdint.h>
 /* force off HAVE_INTTYPES_H so that roken doesn't try to include both,
    which causes a warning storm on irix */
 #undef HAVE_INTTYPES_H
-#elif HAVE_INTTYPES_H
-#define __STDC_FORMAT_MACROS
-#include <inttypes.h>
 #endif
 
 #ifdef HAVE_MALLOC_H
@@ -108,6 +108,45 @@
 # define PRIu64                __PRI64_PREFIX "u"
 #endif
 
+#ifndef SCNd8
+# define SCNd8         "hhd"
+#endif
+#ifndef SCNd16
+# define SCNd16                "hd"
+#endif
+#ifndef SCNd32
+# define SCNd32                "d"
+#endif
+#ifndef SCNd64
+# define SCNd64                __PRI64_PREFIX "d"
+#endif
+
+#ifndef SCNi8
+# define SCNi8         "hhi"
+#endif
+#ifndef SCNi16
+# define SCNi16                "hi"
+#endif
+#ifndef SCNi32
+# define SCNi32                "i"
+#endif
+#ifndef SCNi64
+# define SCNi64                __PRI64_PREFIX "i"
+#endif
+
+#ifndef SCNu8
+# define SCNu8         "hhu"
+#endif
+#ifndef SCNu16
+# define SCNu16                "hu"
+#endif
+#ifndef SCNu32
+# define SCNu32                "u"
+#endif
+#ifndef SCNu64
+# define SCNu64                __PRI64_PREFIX "u"
+#endif
+
 #ifdef HAVE_BSD_STRING_H
 #include <bsd/string.h>
 #endif
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
index aa77d75..314c7ea 100644
--- a/source3/lib/util_str.c
+++ b/source3/lib/util_str.c
@@ -852,7 +852,7 @@ uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char 
**entptr)
        while (*p && isspace(*p))
                p++;
 
-       sscanf(p,"%"PRIu64,&val);
+       sscanf(p,"%"SCNu64,&val);
        if (entptr) {
                while (*p && isdigit(*p))
                        p++;
diff --git a/source3/utils/smbcquotas.c b/source3/utils/smbcquotas.c
index 7363d6b..b875b1e 100644
--- a/source3/utils/smbcquotas.c
+++ b/source3/utils/smbcquotas.c
@@ -187,7 +187,9 @@ static int parse_quota_set(TALLOC_CTX *ctx,
 
        switch (todo) {
                case PARSE_LIM:
-                       if 
(sscanf(p,"%"PRIu64"/%"PRIu64,&pqt->softlim,&pqt->hardlim)!=2) {
+                       if (sscanf(p,"%"SCNu64"/%"SCNu64,&pqt->softlim,
+                           &pqt->hardlim) != 2)
+                       {
                                return -1;
                        }
 
diff --git a/source3/winbindd/idmap_autorid.c b/source3/winbindd/idmap_autorid.c
index 0747916..391a314 100644
--- a/source3/winbindd/idmap_autorid.c
+++ b/source3/winbindd/idmap_autorid.c
@@ -22,6 +22,57 @@
  *
  */
 
+/*
+ * This module allocates ranges for domains to be used in a
+ * algorithmic mode like idmap_rid. Multiple ranges are supported
+ * for a single domain: If a rid exceeds the range size, a matching
+ * range is allocated to hold the rid's id.
+ *
+ * Here are the formulas applied:
+ *
+ *
+ * For a sid of the form domain_sid-rid, we have
+ *
+ *   rid = reduced_rid + domain_range_index * range_size
+ *
+ * with
+ *   reduced_rid := rid % range_size
+ *   domain_range_index := rid / range_size
+ *
+ * And reduced_rid fits into a range.
+ *
+ * In the database, we associate a range_number to
+ * the pair domain_sid,domain_range_index.
+ *
+ * Now the unix id for the given sid calculates as:
+ *
+ *   id = reduced_rid + range_low_id
+ *
+ * with
+ *
+ *   range_low_id = low_id + range_number * range_size
+ *
+ *
+ * The inverse calculation goes like this:
+ *
+ * Given a unix id, let
+ *
+ *   normalized_id := id - low_id
+ *   reduced_rid := normalized_id % range_size
+ *   range_number = normalized_id / range_size
+ *
+ * Then we have
+ *
+ *   id = reduced_rid + low_id + range_number * range_size
+ *
+ * From the database, get the domain_sid,domain_range_index pair
+ * belonging to the range_number (if there is already one).
+ *
+ * Then the rid for the unix id calculates as:
+ *
+ *   rid = reduced_rid + domain_range_index * range_size
+ */
+
 #include "includes.h"
 #include "system/filesys.h"
 #include "winbindd.h"
@@ -49,9 +100,12 @@ struct autorid_global_config {
        bool ignore_builtin;
 };
 
-struct autorid_domain_config {
-       fstring sid;
-       uint32_t domainnum;
+struct autorid_range_config {
+       fstring domsid;
+       fstring keystr;
+       uint32_t rangenum;
+       uint32_t domain_range_index;
+       uint32_t low_id;
        struct autorid_global_config *globalcfg;
 };
 
@@ -62,20 +116,23 @@ static NTSTATUS 
idmap_autorid_get_domainrange_action(struct db_context *db,
                                              void *private_data)
 {
        NTSTATUS ret;
-       uint32_t domainnum, hwm;
+       uint32_t rangenum, hwm;
        char *numstr;
-       struct autorid_domain_config *cfg;
+       struct autorid_range_config *range;
 
-       cfg = (struct autorid_domain_config *)private_data;
+       range = (struct autorid_range_config *)private_data;
 
-       ret = dbwrap_fetch_uint32_bystring(db, cfg->sid, &(cfg->domainnum));
+       ret = dbwrap_fetch_uint32_bystring(db, range->keystr,
+                                          &(range->rangenum));
 
        if (NT_STATUS_IS_OK(ret)) {
                /* entry is already present*/
                return ret;
        }
 
-       DEBUG(10, ("Acquiring new range for domain %s\n", cfg->sid));
+       DEBUG(10, ("Acquiring new range for domain %s "
+                  "(domain_range_index=%"PRIu32")\n",
+                  range->domsid, range->domain_range_index));
 
        /* fetch the current HWM */
        ret = dbwrap_fetch_uint32_bystring(db, HWM, &hwm);
@@ -87,14 +144,14 @@ static NTSTATUS 
idmap_autorid_get_domainrange_action(struct db_context *db,
        }
 
        /* do we have a range left? */
-       if (hwm >= cfg->globalcfg->maxranges) {
+       if (hwm >= range->globalcfg->maxranges) {
                DEBUG(1, ("No more domain ranges available!\n"));
                ret = NT_STATUS_NO_MEMORY;
                goto error;
        }
 
        /* increase the HWM */
-       ret = dbwrap_change_uint32_atomic_bystring(db, HWM, &domainnum, 1);
+       ret = dbwrap_change_uint32_atomic_bystring(db, HWM, &rangenum, 1);
        if (!NT_STATUS_IS_OK(ret)) {
                DEBUG(1, ("Fatal error while fetching a new "
                          "domain range value!\n"));
@@ -102,21 +159,21 @@ static NTSTATUS 
idmap_autorid_get_domainrange_action(struct db_context *db,
        }
 
        /* store away the new mapping in both directions */
-       ret = dbwrap_store_uint32_bystring(db, cfg->sid, domainnum);
+       ret = dbwrap_store_uint32_bystring(db, range->keystr, rangenum);
        if (!NT_STATUS_IS_OK(ret)) {
                DEBUG(1, ("Fatal error while storing new "
                          "domain->range assignment!\n"));
                goto error;
        }
 
-       numstr = talloc_asprintf(db, "%u", domainnum);
+       numstr = talloc_asprintf(db, "%u", rangenum);
        if (!numstr) {
                ret = NT_STATUS_NO_MEMORY;
                goto error;
        }
 
        ret = dbwrap_store_bystring(db, numstr,
-                       string_term_tdb_data(cfg->sid), TDB_INSERT);
+                       string_term_tdb_data(range->keystr), TDB_INSERT);
 
        talloc_free(numstr);
        if (!NT_STATUS_IS_OK(ret)) {
@@ -124,10 +181,11 @@ static NTSTATUS 
idmap_autorid_get_domainrange_action(struct db_context *db,
                          "new domain->range assignment!\n"));
                goto error;
        }
-       DEBUG(5, ("Acquired new range #%d for domain %s\n",
-                 domainnum, cfg->sid));
+       DEBUG(5, ("Acquired new range #%d for domain %s "
+                 "(domain_range_index=%"PRIu32")\n", rangenum, range->keystr,
+                 range->domain_range_index));
 
-       cfg->domainnum = domainnum;
+       range->rangenum = rangenum;
 
        return NT_STATUS_OK;
 
@@ -136,7 +194,7 @@ error:
 
 }
 
-static NTSTATUS idmap_autorid_get_domainrange(struct autorid_domain_config 
*dom,
+static NTSTATUS idmap_autorid_get_domainrange(struct autorid_range_config 
*range,
                                              bool read_only)
 {
        NTSTATUS ret;
@@ -146,19 +204,31 @@ static NTSTATUS idmap_autorid_get_domainrange(struct 
autorid_domain_config *dom,
         * if it is not found create a mapping in a transaction unless
         * read-only mode has been set
         */
-       ret = dbwrap_fetch_uint32_bystring(autorid_db, dom->sid,
-                                          &(dom->domainnum));
+       if (range->domain_range_index > 0) {
+               snprintf(range->keystr, FSTRING_LEN, "%s#%"PRIu32,
+                        range->domsid, range->domain_range_index);
+       } else {
+               fstrcpy(range->keystr, range->domsid);
+       }
+
+       ret = dbwrap_fetch_uint32_bystring(autorid_db, range->keystr,
+                                          &(range->rangenum));
 
        if (!NT_STATUS_IS_OK(ret)) {
                if (read_only) {
                        return NT_STATUS_NOT_FOUND;
                }
                ret = dbwrap_trans_do(autorid_db,
-                             idmap_autorid_get_domainrange_action, dom);
+                             idmap_autorid_get_domainrange_action, range);
        }
 
-       DEBUG(10, ("Using range #%d for domain %s\n", dom->domainnum,
-                  dom->sid));
+       range->low_id = range->globalcfg->minvalue
+                     + range->rangenum * range->globalcfg->rangesize;
+
+       DEBUG(10, ("Using range #%d for domain %s "
+                  "(domain_range_index=%"PRIu32", low_id=%"PRIu32")\n",
+                  range->rangenum, range->domsid, range->domain_range_index,
+                  range->low_id));
 
        return ret;
 }
@@ -169,7 +239,7 @@ static NTSTATUS idmap_autorid_allocate_id(struct 
idmap_domain *dom,
        NTSTATUS ret;
        struct idmap_tdb_common_context *commoncfg;
        struct autorid_global_config *globalcfg;
-       struct autorid_domain_config domaincfg;
+       struct autorid_range_config range;
 
        commoncfg =
            talloc_get_type_abort(dom->private_data,
@@ -186,12 +256,12 @@ static NTSTATUS idmap_autorid_allocate_id(struct 
idmap_domain *dom,
 
        /* fetch the range for the allocation pool */
 
-       ZERO_STRUCT(domaincfg);
+       ZERO_STRUCT(range);
 
-       domaincfg.globalcfg = globalcfg;
-       fstrcpy(domaincfg.sid, ALLOC_RANGE);
+       range.globalcfg = globalcfg;
+       fstrcpy(range.domsid, ALLOC_RANGE);
 
-       ret = idmap_autorid_get_domainrange(&domaincfg, dom->read_only);
+       ret = idmap_autorid_get_domainrange(&range, dom->read_only);
 
        if (!NT_STATUS_IS_OK(ret)) {
                DEBUG(3, ("Could not determine range for allocation pool, "
@@ -206,9 +276,7 @@ static NTSTATUS idmap_autorid_allocate_id(struct 
idmap_domain *dom,
                return ret;
        }
 
-       xid->id = globalcfg->minvalue +
-                 globalcfg->rangesize * domaincfg.domainnum +
-                 xid->id;
+       xid->id = xid->id + range.low_id;
 
        DEBUG(10, ("Returned new %s %d from allocation range\n",
                   (xid->type==ID_TYPE_UID)?"uid":"gid", xid->id));
@@ -243,12 +311,17 @@ static NTSTATUS idmap_autorid_id_to_sid(struct 
autorid_global_config *cfg,
                                        struct idmap_domain *dom,
                                        struct id_map *map)
 {
-       uint32_t range;
+       uint32_t range_number;
+       uint32_t domain_range_index = 0;
+       uint32_t normalized_id;
+       uint32_t reduced_rid;
+       uint32_t rid;
        TDB_DATA data = tdb_null;
        char *keystr;
-       struct dom_sid sid;
+       struct dom_sid domsid;
        NTSTATUS status;
        bool ok;
+       const char *q = NULL;
 
        /* can this be one of our ids? */
        if (map->xid.id < cfg->minvalue) {
@@ -266,9 +339,11 @@ static NTSTATUS idmap_autorid_id_to_sid(struct 
autorid_global_config *cfg,
        }
 
        /* determine the range of this uid */
-       range = ((map->xid.id - cfg->minvalue) / cfg->rangesize);
 
-       keystr = talloc_asprintf(talloc_tos(), "%u", range);
+       normalized_id = map->xid.id - cfg->minvalue;
+       range_number = normalized_id / cfg->rangesize;
+
+       keystr = talloc_asprintf(talloc_tos(), "%u", range_number);
        if (!keystr) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -279,7 +354,7 @@ static NTSTATUS idmap_autorid_id_to_sid(struct 
autorid_global_config *cfg,
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(4, ("id %d belongs to range %d which does not have "
                          "domain mapping, ignoring mapping request\n",
-                         map->xid.id, range));
+                         map->xid.id, range_number));
                TALLOC_FREE(data.dptr);
                map->status = ID_UNKNOWN;
                return NT_STATUS_OK;
@@ -298,16 +373,24 @@ static NTSTATUS idmap_autorid_id_to_sid(struct 
autorid_global_config *cfg,
                return idmap_autorid_map_id_to_sid(dom, map);
        }
 
-       ok = string_to_sid(&sid, (const char *)data.dptr);
+       ok = dom_sid_parse_endp((const char *)data.dptr, &domsid, &q);
        TALLOC_FREE(data.dptr);
        if (!ok) {
                map->status = ID_UNKNOWN;
                return NT_STATUS_OK;
        }
+       if (q != NULL)
+               if (sscanf(q+1, "%"SCNu32, &domain_range_index) != 1) {
+                       DEBUG(10, ("Domain range index not found, "
+                                  "ignoring mapping request\n"));
+                       map->status = ID_UNKNOWN;
+                       return NT_STATUS_OK;
+               }
 
-       sid_compose(map->sid, &sid,
-                   (map->xid.id - cfg->minvalue -
-                    range * cfg->rangesize));
+       reduced_rid = normalized_id % cfg->rangesize;
+       rid = reduced_rid + domain_range_index * cfg->rangesize;
+
+       sid_compose(map->sid, &domsid, rid);
 
        /* We **really** should have some way of validating
           the SID exists and is the correct type here.  But
@@ -324,22 +407,17 @@ static NTSTATUS idmap_autorid_id_to_sid(struct 
autorid_global_config *cfg,
 **********************************/
 
 static NTSTATUS idmap_autorid_sid_to_id(struct autorid_global_config *global,
-                                       struct autorid_domain_config *domain,
+                                       struct autorid_range_config *range,
                                        struct id_map *map)
 {
        uint32_t rid;
+       uint32_t reduced_rid;
 
        sid_peek_rid(map->sid, &rid);
 
-       /* if the rid is higher than the size of the range, we cannot map it */


-- 
Samba Shared Repository

Reply via email to