The branch, master has been updated
       via  2372bd7 autorid: Add allocation from above in alloc range for well 
known sids
       via  90d9445 autorid: use dbwrap_trans_do() in 
idmap_autorid_sid_to_id_alloc()
       via  0df8988 autorid: add high_id to range config and fill it where we 
also fill range->low_id.
       via  a1adc88 autorid: reserve 500 IDs at the top of the ALLOC range.
       via  57e49d9 autorid: reverse order of arguments of 
idmap_autorid_sid_to_id_alloc()
       via  3f1297f autorid: introduce idmap_autorid_domsid_is_for_alloc()
       via  eaf770a autorid: factor idmap_autorid_sid_to_id() out of 
idmap_autorid_sids_to_unixids()
       via  64e267c autorid: make the checks for bumping num_mapped identical 
for alloc and rid case
       via  5d7b136 autorid: explicitly return NTSTATUS_OK in 
idmap_autorid_sid_to_id_alloc().
       via  79a2458 autorid: more explicitly and reasonably set map->state in 
idmap_autorid_sid_to_id_alloc
       via  e32f6a2 autorid: rename idmap_autorid_sid_to_id() -> 
idmap_autorid_sid_to_id_rid()
       via  31241be autorid: rename idmap_autorid_map_sid_to_id() -> 
idmap_autorid_sid_to_id_alloc()
       via  22f7126 autorid: rename idmap_autorid_map_id_to_sid() -> 
idmap_autorid_id_to_sid_alloc()
       via  5d9d4c7 autorid: factor idmap_autorid_get_alloc_range() out of 
idmap_autorid_allocate_id()
       via  3c706e9 autorid: fix discard-const warning in 
idmap_autorid_init_hwm()
       via  1da7b5b autorid: fix uninitialized return code for successful 
autorid.tdb creation/opening
       via  04a4dc9 autorid: improve a debug message in 
idmap_autorid_map_sid_to_id()
       via  b1cb75a autorid: add debug messages to 
idmap_autorid_get_domainrange()
       via  b2ddea9 autorid: improve wording in a debug message
       via  8408137 autorid: remove a legacy comment from sid_to_id
       via  1eeb4bc idmap_rid: remove a legacy comment from sid_to_id
       via  26062b4 idmap_tdb_common: remove legacy comment.
       via  11b3937 idmap_tdb_common: fix a debug message in 
idmap_tdb_common_set_mapping()
       via  377091a idmap_tdb_common: fix a debug message in 
idmap_tdb_common_unixid_to_sid()
      from  d50c007 s3-rpc_server: Remove ncalrpc_as_system from 
make_server_pipes_struct().

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


- Log -----------------------------------------------------------------
commit 2372bd7d0ce6bfe2ce2cc64c1b368b6cc876c70d
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 19:14:41 2014 +0200

    autorid: Add allocation from above in alloc range for well known sids
    
    This way, we achieve a better determinism for the id mappings
    of the well knowns without wasting a separate range.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>
    
    Autobuild-User(master): Michael Adam <[email protected]>
    Autobuild-Date(master): Fri Apr 25 17:52:10 CEST 2014 on sn-devel-104

commit 90d9445da47f622093b6a18e7c2b4b4888cd26d6
Author: Michael Adam <[email protected]>
Date:   Thu Apr 24 13:34:40 2014 +0200

    autorid: use dbwrap_trans_do() in idmap_autorid_sid_to_id_alloc()
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 0df8988c086fb4d4ea4f683f3a2d399fd6e59f82
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 21:31:48 2014 +0200

    autorid: add high_id to range config and fill it where we also fill 
range->low_id.
    
    This corresponds to low_id for convenience and allows
    for computations without going back to the global config.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit a1adc881cf28643d1936b43c51e9a8839fc914d1
Author: Michael Adam <[email protected]>
Date:   Mon Apr 7 17:24:31 2014 +0200

    autorid: reserve 500 IDs at the top of the ALLOC range.
    
    The wellknowns are now allocated into this sub-range.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 57e49d90f245873883fb3ccc71191032b8d4768f
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 21:06:26 2014 +0200

    autorid: reverse order of arguments of idmap_autorid_sid_to_id_alloc()
    
    for consistency
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 3f1297f363552083397c206d2dcb512e7a5e5f8e
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 18:56:21 2014 +0200

    autorid: introduce idmap_autorid_domsid_is_for_alloc()
    
    Currently, this checks if the sid is a wellknown domain sid.
    But the code reads more nicely and more domains might be added
    in the future.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit eaf770a61191bdc968510b7b216d62fd633ca163
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 18:43:58 2014 +0200

    autorid: factor idmap_autorid_sid_to_id() out of 
idmap_autorid_sids_to_unixids()
    
    - reduces indentation
    - unifies error code paths and bumping counters
    - makes the code more easy to read
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 64e267c2feaecd9c2f0a60d548ccd2ff0ee37879
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 18:25:44 2014 +0200

    autorid: make the checks for bumping num_mapped identical for alloc and rid 
case
    
    in idmap_autorid_sids_to_unixids()
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 5d7b1363f0c31acc7f385f69e7dec028b192e4bd
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 18:20:56 2014 +0200

    autorid: explicitly return NTSTATUS_OK in idmap_autorid_sid_to_id_alloc().
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 79a245808cc61ad3396e246680d9d3ce9d230096
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 18:20:01 2014 +0200

    autorid: more explicitly and reasonably set map->state in 
idmap_autorid_sid_to_id_alloc
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit e32f6a278dccb14991ba8103876d9a98a585150d
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 17:56:37 2014 +0200

    autorid: rename idmap_autorid_sid_to_id() -> idmap_autorid_sid_to_id_rid()
    
    For consistency. This is the function that does the calculation
    if the sid is treated by a rid range.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 31241beec6f27ce69ff967a717d23d851001cb26
Author: Michael Adam <[email protected]>
Date:   Thu Apr 10 18:33:20 2014 +0200

    autorid: rename idmap_autorid_map_sid_to_id() -> 
idmap_autorid_sid_to_id_alloc()
    
    for consistency. this is the sid->id function for the alloc range.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 22f712628b5948352654a29796858ed95ccc14a1
Author: Michael Adam <[email protected]>
Date:   Thu Apr 10 18:20:23 2014 +0200

    autorid: rename idmap_autorid_map_id_to_sid() -> 
idmap_autorid_id_to_sid_alloc()
    
    for consistency. This is the function that maps id to sid
    for the alloc range.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 5d9d4c73d77434d811f8e492c5efc5e7336f30db
Author: Michael Adam <[email protected]>
Date:   Mon Mar 17 12:49:59 2014 +0100

    autorid: factor idmap_autorid_get_alloc_range() out of 
idmap_autorid_allocate_id()
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 3c706e9f014fa1bd06e80c5c81f321dcf90ff58e
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 21:42:43 2014 +0200

    autorid: fix discard-const warning in idmap_autorid_init_hwm()
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 1da7b5b50cfc58550774a82197ff0a27f979b78b
Author: Michael Adam <[email protected]>
Date:   Wed Apr 23 18:19:09 2014 +0200

    autorid: fix uninitialized return code for successful autorid.tdb 
creation/opening
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 04a4dc961e98cb07c9bee16513a96bebe5031153
Author: Michael Adam <[email protected]>
Date:   Mon Mar 17 12:49:19 2014 +0100

    autorid: improve a debug message in idmap_autorid_map_sid_to_id()
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit b1cb75a97232b433ecdf18e50027590238f05a9a
Author: Michael Adam <[email protected]>
Date:   Mon Mar 17 12:43:12 2014 +0100

    autorid: add debug messages to idmap_autorid_get_domainrange()
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit b2ddea94ccf6bd18bc0b8397239270c369293fd7
Author: Michael Adam <[email protected]>
Date:   Mon Mar 17 12:42:41 2014 +0100

    autorid: improve wording in a debug message
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 840813793ab974b1acb1ca803188f18e87ae4dbb
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 20:59:52 2014 +0200

    autorid: remove a legacy comment from sid_to_id
    
    With the introduction of the ID_TYPE_BOTH mapping
    to idmap_autorid, it is not a deficiency but a
    virtue of the autorid backend that it does not
    care about the existence or type of the
    sid to be mapped.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 1eeb4bc0ffb7b470c255ca8888a752122d551d1d
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 21:03:06 2014 +0200

    idmap_rid: remove a legacy comment from sid_to_id
    
    With the introduction of the ID_TYPE_BOTH mapping
    to idmap_rid, it is not a deficiency but a
    virtue of the rid backend that it does not
    care about the existence or type of the
    sid to be mapped.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 26062b4a9d3c8684f8d1d3cf39656cb89f7a959c
Author: Michael Adam <[email protected]>
Date:   Fri Apr 11 23:52:20 2014 +0200

    idmap_tdb_common: remove legacy comment.
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 11b3937dddae1422fbacff7a0a639f6b40901275
Author: Michael Adam <[email protected]>
Date:   Thu Apr 24 17:18:34 2014 +0200

    idmap_tdb_common: fix a debug message in idmap_tdb_common_set_mapping()
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Michael Adam <[email protected]>

commit 377091a06580616ff5861751fa5eaacc7c08db65
Author: Michael Adam <[email protected]>
Date:   Wed Apr 23 21:52:07 2014 +0200

    idmap_tdb_common: fix a debug message in idmap_tdb_common_unixid_to_sid()
    
    Signed-off-by: Michael Adam <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

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

Summary of changes:
 source3/include/idmap_autorid_tdb.h  |    1 +
 source3/winbindd/idmap_autorid.c     |  364 +++++++++++++++++++++-------------
 source3/winbindd/idmap_autorid_tdb.c |   14 +-
 source3/winbindd/idmap_rid.c         |    4 -
 source3/winbindd/idmap_tdb_common.c  |   10 +-
 5 files changed, 243 insertions(+), 150 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/idmap_autorid_tdb.h 
b/source3/include/idmap_autorid_tdb.h
index 2d2d01a..52bee56 100644
--- a/source3/include/idmap_autorid_tdb.h
+++ b/source3/include/idmap_autorid_tdb.h
@@ -49,6 +49,7 @@ struct autorid_range_config {
        uint32_t rangenum;
        uint32_t domain_range_index;
        uint32_t low_id;
+       uint32_t high_id;
 };
 
 /**
diff --git a/source3/winbindd/idmap_autorid.c b/source3/winbindd/idmap_autorid.c
index a0262fa..37612c2 100644
--- a/source3/winbindd/idmap_autorid.c
+++ b/source3/winbindd/idmap_autorid.c
@@ -82,11 +82,29 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_IDMAP
 
+#define IDMAP_AUTORID_ALLOC_RESERVED 500
+
 /* handle to the tdb storing domain <-> range assignments */
 static struct db_context *autorid_db;
 
 static bool ignore_builtin = false;
 
+static NTSTATUS idmap_autorid_get_alloc_range(struct idmap_domain *dom,
+                                       struct autorid_range_config *range)
+{
+       NTSTATUS status;
+
+       ZERO_STRUCT(*range);
+
+       fstrcpy(range->domsid, ALLOC_RANGE);
+
+       status = idmap_autorid_get_domainrange(autorid_db,
+                                              range,
+                                              dom->read_only);
+
+       return status;
+}
+
 static NTSTATUS idmap_autorid_allocate_id(struct idmap_domain *dom,
                                          struct unixid *xid) {
 
@@ -101,12 +119,7 @@ static NTSTATUS idmap_autorid_allocate_id(struct 
idmap_domain *dom,
 
        /* fetch the range for the allocation pool */
 
-       ZERO_STRUCT(range);
-
-       fstrcpy(range.domsid, ALLOC_RANGE);
-
-       ret = idmap_autorid_get_domainrange(autorid_db, &range, dom->read_only);
-
+       ret = idmap_autorid_get_alloc_range(dom, &range);
        if (!NT_STATUS_IS_OK(ret)) {
                DEBUG(3, ("Could not determine range for allocation pool, "
                          "check previous messages for reason\n"));
@@ -131,8 +144,8 @@ static NTSTATUS idmap_autorid_allocate_id(struct 
idmap_domain *dom,
 /*
  * map a SID to xid using the idmap_tdb like pool
  */
-static NTSTATUS idmap_autorid_map_id_to_sid(struct idmap_domain *dom,
-                                           struct id_map *map)
+static NTSTATUS idmap_autorid_id_to_sid_alloc(struct idmap_domain *dom,
+                                             struct id_map *map)
 {
        NTSTATUS ret;
 
@@ -214,7 +227,7 @@ static NTSTATUS idmap_autorid_id_to_sid(struct 
autorid_global_config *cfg,
                          "checking for mapping\n",
                          map->xid.id));
                TALLOC_FREE(data.dptr);
-               return idmap_autorid_map_id_to_sid(dom, map);
+               return idmap_autorid_id_to_sid_alloc(dom, map);
        }
 
        ok = dom_sid_parse_endp((const char *)data.dptr, &domsid, &q);
@@ -250,7 +263,8 @@ static NTSTATUS idmap_autorid_id_to_sid(struct 
autorid_global_config *cfg,
  Single sid to id lookup function.
 **********************************/
 
-static NTSTATUS idmap_autorid_sid_to_id(struct autorid_global_config *global,
+static NTSTATUS idmap_autorid_sid_to_id_rid(
+                                       struct autorid_global_config *global,
                                        struct autorid_range_config *range,
                                        struct id_map *map)
 {
@@ -263,11 +277,6 @@ static NTSTATUS idmap_autorid_sid_to_id(struct 
autorid_global_config *global,
 
        map->xid.id = reduced_rid + range->low_id;
        map->xid.type = ID_TYPE_BOTH;
-
-       /* We **really** should have some way of validating
-          the SID exists and is the correct type here.  But
-          that is a deficiency in the idmap_rid design. */
-
        map->status = ID_MAPPED;
 
        return NT_STATUS_OK;
@@ -331,15 +340,120 @@ static NTSTATUS idmap_autorid_unixids_to_sids(struct 
idmap_domain *dom,
        return ret;
 }
 
+static bool idmap_autorid_sid_is_special(struct dom_sid *sid)
+{
+       bool match;
+
+       match = sid_check_is_in_wellknown_domain(sid);
+       if (match) {
+               return true;
+       }
+
+       return false;
+}
+
+static NTSTATUS idmap_autorid_sid_to_id_special(struct idmap_domain *dom,
+                                               struct id_map *map)
+{
+       struct idmap_tdb_common_context *common =
+               talloc_get_type_abort(dom->private_data,
+                                     struct idmap_tdb_common_context);
+       uint32_t count;
+       struct autorid_range_config range;
+       NTSTATUS status;
+       uint32_t free_id;
+
+       status = idmap_autorid_get_alloc_range(dom, &range);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       /* Take the next free ID, counting from the top */
+       free_id = 0;
+       for (count = 0; count < IDMAP_AUTORID_ALLOC_RESERVED; count++) {
+               struct id_map test_map;
+               struct dom_sid sid;
+
+               test_map.sid = &sid;
+               test_map.xid.type = map->xid.type;
+               test_map.xid.id = range.high_id - count;
+               test_map.status = ID_UNKNOWN;
+
+               status = idmap_tdb_common_unixid_to_sid(dom, &test_map);
+               if (NT_STATUS_EQUAL(NT_STATUS_NONE_MAPPED, status)) {
+                       free_id = test_map.xid.id;
+                       break;
+               }
+
+               if (!NT_STATUS_IS_OK(status)) {
+                       /* error - get out */
+                       return status;
+               }
+
+               /* mapping exists - try next ID */
+       }
+
+       if (free_id == 0) {
+               return NT_STATUS_NONE_MAPPED;
+       }
+
+       map->status = ID_MAPPED;
+       map->xid.id = free_id;
+
+       status = common->rw_ops->set_mapping(dom, map);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(2, ("Error storing new mapping: %s\n",
+                         nt_errstr(status)));
+               return status;
+       }
+
+       return NT_STATUS_OK;
+}
+
+struct idmap_autorid_sid_to_id_alloc_ctx {
+       struct idmap_domain *dom;
+       struct id_map *map;
+};
+
+static NTSTATUS idmap_autorid_sid_to_id_alloc_action(
+                               struct db_context *db,
+                               void *private_data)
+{
+       struct idmap_autorid_sid_to_id_alloc_ctx *ctx;
+
+       ctx = (struct idmap_autorid_sid_to_id_alloc_ctx *)private_data;
+
+       if (idmap_autorid_sid_is_special(ctx->map->sid)) {
+               NTSTATUS ret;
+
+               ret = idmap_autorid_sid_to_id_special(ctx->dom, ctx->map);
+               if (NT_STATUS_IS_OK(ret)) {
+                       return NT_STATUS_OK;
+               }
+               if (!NT_STATUS_EQUAL(NT_STATUS_NONE_MAPPED, ret)) {
+                       return ret;
+               }
+
+               DEBUG(10, ("Sepecial sid %s not mapped. falling back to "
+                          "regular allocation\n",
+                          sid_string_dbg(ctx->map->sid)));
+       }
+
+       return idmap_tdb_common_new_mapping(ctx->dom, ctx->map);
+}
+
 /*
  * map a SID to xid using the idmap_tdb like pool
  */
-static NTSTATUS idmap_autorid_map_sid_to_id(struct idmap_domain *dom,
-                                           struct id_map *map,
-                                           struct idmap_tdb_common_context 
*ctx)
+static NTSTATUS idmap_autorid_sid_to_id_alloc(
+                                       struct idmap_tdb_common_context *ctx,
+                                       struct idmap_domain *dom,
+                                       struct id_map *map)
 {
        NTSTATUS ret;
-       int res;
+       struct idmap_autorid_sid_to_id_alloc_ctx alloc_ctx;
+
+       map->status = ID_UNKNOWN;
 
        /* see if we already have a mapping */
        ret = idmap_tdb_common_sid_to_unixid(dom, map);
@@ -351,46 +465,120 @@ static NTSTATUS idmap_autorid_map_sid_to_id(struct 
idmap_domain *dom,
 
        /* bad things happened */
        if (!NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED)) {
-               DEBUG(1, ("Looking up SID->ID mapping for %s failed\n",
-                         sid_string_dbg(map->sid)));
+               DEBUG(1, ("Looking up SID->ID mapping for %s failed: %s\n",
+                         sid_string_dbg(map->sid), nt_errstr(ret)));
                return ret;
        }
 
        if (dom->read_only) {
                DEBUG(3, ("Not allocating new mapping for %s, because backend "
                          "is read-only\n", sid_string_dbg(map->sid)));
+               map->status = ID_UNMAPPED;
                return NT_STATUS_NONE_MAPPED;
        }
 
        DEBUG(10, ("Creating new mapping in pool for %s\n",
                   sid_string_dbg(map->sid)));
 
-       /* create new mapping */
-       res = dbwrap_transaction_start(ctx->db);
-       if (res != 0) {
-               DEBUG(2, ("transaction_start failed\n"));
+       alloc_ctx.dom = dom;
+       alloc_ctx.map = map;
+
+       ret = dbwrap_trans_do(ctx->db, idmap_autorid_sid_to_id_alloc_action,
+                             &alloc_ctx);
+       if (!NT_STATUS_IS_OK(ret)) {
+               DEBUG(1, ("Failed to create a new mapping in alloc range: %s\n",
+                         nt_errstr(ret)));
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
 
-       ret = idmap_tdb_common_new_mapping(dom, map);
+       map->status = ID_MAPPED;
+       return NT_STATUS_OK;
+}
 
-       map->status = (NT_STATUS_IS_OK(ret))?ID_MAPPED:ID_UNMAPPED;
+static bool idmap_autorid_domsid_is_for_alloc(struct dom_sid *sid)
+{
+       bool match;
 
-       if (!NT_STATUS_IS_OK(ret)) {
-               if (dbwrap_transaction_cancel(ctx->db) != 0) {
-                       smb_panic("Cancelling transaction failed");
-               }
-               return ret;
+       match = sid_check_is_wellknown_domain(sid, NULL);
+       if (match) {
+               return true;
        }
 
-       res = dbwrap_transaction_commit(ctx->db);
-       if (res == 0) {
-               return ret;
+       return false;
+}
+
+static NTSTATUS idmap_autorid_sid_to_id(struct idmap_tdb_common_context 
*common,
+                                       struct idmap_domain *dom,
+                                       struct id_map *map)
+{
+       struct autorid_global_config *global =
+               talloc_get_type_abort(common->private_data,
+                                     struct autorid_global_config);
+       struct winbindd_tdc_domain *domain;
+       struct autorid_range_config range;
+       uint32_t rid;
+       struct dom_sid domainsid;
+       NTSTATUS ret;
+
+       ZERO_STRUCT(range);
+       map->status = ID_UNKNOWN;
+
+       DEBUG(10, ("Trying to map %s\n", sid_string_dbg(map->sid)));
+
+       sid_copy(&domainsid, map->sid);
+       if (!sid_split_rid(&domainsid, &rid)) {
+               DEBUG(4, ("Could not determine domain SID from %s, "
+                         "ignoring mapping request\n",
+                         sid_string_dbg(map->sid)));
+               map->status = ID_UNMAPPED;
+               return NT_STATUS_NONE_MAPPED;
+       }
+
+       if (idmap_autorid_domsid_is_for_alloc(&domainsid)) {
+               DEBUG(10, ("SID %s is for ALLOC range.\n",
+                          sid_string_dbg(map->sid)));
+
+               return idmap_autorid_sid_to_id_alloc(common, dom, map);
        }
 
-       DEBUG(2, ("transaction_commit failed\n"));
-       return NT_STATUS_INTERNAL_DB_CORRUPTION;
+       if (dom_sid_equal(&domainsid, &global_sid_Builtin) && ignore_builtin) {
+               DEBUG(10, ("Ignoring request for BUILTIN domain\n"));
+               map->status = ID_UNMAPPED;
+               return NT_STATUS_NONE_MAPPED;
+       }
+
+       /*
+        * Check if the domain is around
+        */
+       domain = wcache_tdc_fetch_domainbysid(talloc_tos(),
+                                             &domainsid);
+       if (domain == NULL) {
+               DEBUG(10, ("Ignoring unknown domain sid %s\n",
+                          sid_string_dbg(&domainsid)));
+               map->status = ID_UNMAPPED;
+               return NT_STATUS_NONE_MAPPED;
+       }
+       TALLOC_FREE(domain);
+
+       sid_to_fstring(range.domsid, &domainsid);
+
+       range.domain_range_index = rid / (global->rangesize);
+
+       ret = idmap_autorid_get_domainrange(autorid_db, &range, dom->read_only);
+       if (NT_STATUS_EQUAL(ret, NT_STATUS_NOT_FOUND) && dom->read_only) {
+               DEBUG(10, ("read-only is enabled, did not allocate "
+                          "new range for domain %s\n",
+                          sid_string_dbg(&domainsid)));
+               map->status = ID_UNMAPPED;
+               return NT_STATUS_NONE_MAPPED;
+       }
+       if (!NT_STATUS_IS_OK(ret)) {
+               DEBUG(3, ("Could not determine range for domain, "
+                         "check previous messages for reason\n"));
+               return ret;
+       }
 
+       return idmap_autorid_sid_to_id_rid(global, &range, map);
 }
 
 /**********************************
@@ -401,7 +589,6 @@ static NTSTATUS idmap_autorid_sids_to_unixids(struct 
idmap_domain *dom,
                                              struct id_map **ids)
 {
        struct idmap_tdb_common_context *commoncfg;
-       struct autorid_global_config *global;
        NTSTATUS ret;
        int i;
        int num_tomap = 0;
@@ -417,105 +604,17 @@ static NTSTATUS idmap_autorid_sids_to_unixids(struct 
idmap_domain *dom,
            talloc_get_type_abort(dom->private_data,
                                  struct idmap_tdb_common_context);
 
-       global = talloc_get_type(commoncfg->private_data,
-                                struct autorid_global_config);
-
        for (i = 0; ids[i]; i++) {
-               struct winbindd_tdc_domain *domain;
-               struct autorid_range_config range;
-               uint32_t rid;
-               struct dom_sid domainsid;
-
-               ZERO_STRUCT(range);
-
-               DEBUG(10, ("Trying to map %s\n", sid_string_dbg(ids[i]->sid)));
-
-               sid_copy(&domainsid, ids[i]->sid);
-               if (!sid_split_rid(&domainsid, &rid)) {
-                       DEBUG(4, ("Could not determine domain SID from %s, "
-                                 "ignoring mapping request\n",
-                                 sid_string_dbg(ids[i]->sid)));
-                       continue;
-               }
-
-               /* is this a well-known SID? */
-
-               if (sid_check_is_wellknown_domain(&domainsid, NULL)) {
-
-                       DEBUG(10, ("SID %s is well-known, using pool\n",
-                                  sid_string_dbg(ids[i]->sid)));
-
-                       ret = idmap_autorid_map_sid_to_id(dom, ids[i],
-                                                         commoncfg);
-
-                       if (!NT_STATUS_IS_OK(ret) &&
-                           !NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED)) {
-                               DEBUG(3, ("Unexpected error resolving "
-                                         "SID (%s)\n",
-                                         sid_string_dbg(ids[i]->sid)));
-                               goto failure;
-                       }
-
-                       if (ids[i]->status == ID_MAPPED) {
-                               num_mapped++;
-                       }
-
-                       continue;
-               }
-
-               /* BUILTIN is passdb's job */
-               if (dom_sid_equal(&domainsid, &global_sid_Builtin) &&
-                   ignore_builtin) {
-                       DEBUG(10, ("Ignoring request for BUILTIN domain\n"));
-                       continue;
-               }
-
-               /*
-                * Check if the domain is around
-                */
-               domain = wcache_tdc_fetch_domainbysid(talloc_tos(),
-                                                     &domainsid);
-               if (domain == NULL) {
-                       DEBUG(10, ("Ignoring unknown domain sid %s\n",
-                                  sid_string_dbg(&domainsid)));
-                       continue;
-               }
-               TALLOC_FREE(domain);
-
-               sid_to_fstring(range.domsid, &domainsid);
-
-               /* Calculate domain_range_index for multi-range support */
-               range.domain_range_index = rid / (global->rangesize);
-
-               ret = idmap_autorid_get_domainrange(autorid_db, &range,
-                                                   dom->read_only);
-
-               /* read-only mode and a new domain range would be required? */
-               if (NT_STATUS_EQUAL(ret, NT_STATUS_NOT_FOUND) &&
-                   dom->read_only) {
-                       DEBUG(10, ("read-only is enabled, did not allocate "
-                                  "new range for domain %s\n",
-                                  sid_string_dbg(&domainsid)));
-                       continue;
-               }
-
-               if (!NT_STATUS_IS_OK(ret)) {
-                       DEBUG(3, ("Could not determine range for domain, "
-                                 "check previous messages for reason\n"));
-                       goto failure;
-               }
-
-               ret = idmap_autorid_sid_to_id(global, &range, ids[i]);
-
+               ret = idmap_autorid_sid_to_id(commoncfg, dom, ids[i]);
                if ((!NT_STATUS_IS_OK(ret)) &&
                    (!NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED))) {
                        /* some fatal error occurred, log it */
                        DEBUG(3, ("Unexpected error resolving a SID (%s)\n",
                                  sid_string_dbg(ids[i]->sid)));
-                       goto failure;
+                       return ret;
                }
 
-               if (NT_STATUS_IS_OK(ret)) {
+               if (NT_STATUS_IS_OK(ret) && ids[i]->status == ID_MAPPED) {
                        num_mapped++;
                }
        }
@@ -527,10 +626,6 @@ static NTSTATUS idmap_autorid_sids_to_unixids(struct 
idmap_domain *dom,
        }
 
        return STATUS_SOME_UNMAPPED;
-
-      failure:
-       return ret;
-
 }
 
 static NTSTATUS idmap_autorid_preallocate_wellknown(struct idmap_domain *dom)
@@ -677,7 +772,8 @@ static NTSTATUS idmap_autorid_initialize(struct 
idmap_domain *dom)
 
        /* fill the TDB common configuration */
 
-       commonconfig->max_id = config->rangesize -1;
+       commonconfig->max_id = config->rangesize - 1


-- 
Samba Shared Repository

Reply via email to