Make use of ADD_TO_ARRAY
authorVolker Lendecke <vl@samba.org>
Thu, 3 Jul 2008 21:29:49 +0000 (23:29 +0200)
committerVolker Lendecke <vl@samba.org>
Sat, 5 Jul 2008 10:19:13 +0000 (12:19 +0200)
(This used to be commit 81f334bd6da601a040f754c46705cfa2fd4f8c45)

source3/include/proto.h
source3/winbindd/idmap.c
source3/winbindd/idmap_util.c
source3/winbindd/winbindd_idmap.c

index bb10487b545d9620217799f5d76aee2c73b42851..2a954f4efeb7535842e202aef0c87e5e4455881d 100644 (file)
@@ -10485,8 +10485,8 @@ NTSTATUS idmap_allocate_uid(struct unixid *id);
 NTSTATUS idmap_allocate_gid(struct unixid *id);
 NTSTATUS idmap_set_uid_hwm(struct unixid *id);
 NTSTATUS idmap_set_gid_hwm(struct unixid *id);
-NTSTATUS idmap_unixids_to_sids(struct id_map **ids);
-NTSTATUS idmap_sids_to_unixids(struct id_map **ids);
+NTSTATUS idmap_unixids_to_sids(struct id_map **ids, int n_ids);
+NTSTATUS idmap_sids_to_unixids(struct id_map **ids, int n_ids);
 NTSTATUS idmap_set_mapping(const struct id_map *id);
 char *idmap_fetch_secret(const char *backend, bool alloc,
                               const char *domain, const char *identity);
index db17245b9203db0e5e62417ee22b8120149e0896..504be222922d4563a24f6ebeafa47f2a571af029 100644 (file)
@@ -1177,7 +1177,8 @@ done:
        return ret;
 }
 
-static NTSTATUS idmap_backends_sids_to_unixids(struct id_map **ids)
+static NTSTATUS idmap_backends_sids_to_unixids(struct id_map **ids, int
+                                              num_ids)
 {
        struct id_map ***dom_ids;
        struct idmap_domain *dom;
@@ -1205,7 +1206,7 @@ static NTSTATUS idmap_backends_sids_to_unixids(struct id_map **ids)
 
        /* partition the requests by domain */
 
-       for (i = 0; ids[i]; i++) {
+       for (i = 0; i < num_ids; i++) {
                uint32 idx;
 
                if ((dom = find_idmap_domain_from_sid(ids[i]->sid)) == NULL) {
@@ -1245,7 +1246,7 @@ static NTSTATUS idmap_backends_sids_to_unixids(struct id_map **ids)
        /* ok all the backends have been contacted at this point */
        /* let's see if we have any unmapped SID left and act accordingly */
 
-       for (i = 0; ids[i]; i++) {
+       for (i = 0; i < num_ids; i++) {
                /* NOTE: this will NOT touch ID_EXPIRED entries that the backend
                 * was not able to confirm/deny (offline mode) */
                if (ids[i]->status == ID_UNKNOWN ||
@@ -1278,7 +1279,7 @@ done:
  idmap interface functions
 **************************************************************************/
 
-NTSTATUS idmap_unixids_to_sids(struct id_map **ids)
+NTSTATUS idmap_unixids_to_sids(struct id_map **ids, int n_ids)
 {
        TALLOC_CTX *ctx;
        NTSTATUS ret;
@@ -1306,7 +1307,7 @@ NTSTATUS idmap_unixids_to_sids(struct id_map **ids)
        bids = NULL;
        bi = 0;
 
-       for (i = 0; ids[i]; i++) {
+       for (i = 0; i < n_ids; i++) {
 
                bool found, mapped, expired;
 
@@ -1331,38 +1332,12 @@ NTSTATUS idmap_unixids_to_sids(struct id_map **ids)
                         * Need to ask the backend
                         */
 
-                       if ( ! bids) {
-                               /* alloc space for ids to be resolved by
-                                * backends (realloc ten by ten) */
-                               bids = TALLOC_ARRAY(ctx, struct id_map *, 10);
-                               if ( ! bids) {
-                                       DEBUG(1, ("Out of memory!\n"));
-                                       talloc_free(ctx);
-                                       return NT_STATUS_NO_MEMORY;
-                               }
-                               bn = 10;
+                       ADD_TO_ARRAY(ctx, struct id_map *, ids[i], &bids, &bn);
+                       if (bids == NULL) {
+                               DEBUG(1, ("Out of memory!\n"));
+                               talloc_free(ctx);
+                               return NT_STATUS_NO_MEMORY;
                        }
-
-                       /* add this id to the ones to be retrieved
-                        * from the backends */
-                       bids[bi] = ids[i];
-                       bi++;
-
-                       /* check if we need to allocate new space
-                        *  on the rids array */
-                       if (bi == bn) {
-                               bn += 10;
-                               bids = talloc_realloc(ctx, bids,
-                                                     struct id_map *, bn);
-                               if ( ! bids) {
-                                       DEBUG(1, ("Out of memory!\n"));
-                                       talloc_free(ctx);
-                                       return NT_STATUS_NO_MEMORY;
-                               }
-                       }
-
-                       /* make sure the last element is NULL */
-                       bids[bi] = NULL;
                }
        }
 
@@ -1408,12 +1383,12 @@ done:
        return ret;
 }
 
-NTSTATUS idmap_sids_to_unixids(struct id_map **ids)
+NTSTATUS idmap_sids_to_unixids(struct id_map **ids, int n_ids)
 {
        TALLOC_CTX *ctx;
        NTSTATUS ret;
        struct id_map **bids;
-       int i, bi;
+       int i;
        int bn = 0;
        struct winbindd_domain *our_domain = find_our_domain();
 
@@ -1434,9 +1409,8 @@ NTSTATUS idmap_sids_to_unixids(struct id_map **ids)
 
        /* no ids to be asked to the backends by default */
        bids = NULL;
-       bi = 0;
 
-       for (i = 0; ids[i]; i++) {
+       for (i = 0; i < n_ids; i++) {
 
                bool found, mapped, expired;
 
@@ -1461,38 +1435,12 @@ NTSTATUS idmap_sids_to_unixids(struct id_map **ids)
                         * Need to ask the backends
                         */
 
-                       if ( ! bids) {
-                               /* alloc space for ids to be resolved
-                                  by backends (realloc ten by ten) */
-                               bids = TALLOC_ARRAY(ctx, struct id_map *, 10);
-                               if ( ! bids) {
-                                       DEBUG(1, ("Out of memory!\n"));
-                                       talloc_free(ctx);
-                                       return NT_STATUS_NO_MEMORY;
-                               }
-                               bn = 10;
-                       }
-
-                       /* add this id to the ones to be retrieved
-                        * from the backends */
-                       bids[bi] = ids[i];
-                       bi++;
-
-                       /* check if we need to allocate new space
-                        * on the ids array */
-                       if (bi == bn) {
-                               bn += 10;
-                               bids = talloc_realloc(ctx, bids,
-                                                     struct id_map *, bn);
-                               if ( ! bids) {
-                                       DEBUG(1, ("Out of memory!\n"));
-                                       talloc_free(ctx);
-                                       return NT_STATUS_NO_MEMORY;
-                               }
+                       ADD_TO_ARRAY(ctx, struct id_map *, ids[i], &bids, &bn);
+                       if (bids == NULL) {
+                               DEBUG(1, ("Out of memory!\n"));
+                               talloc_free(ctx);
+                               return NT_STATUS_NO_MEMORY;
                        }
-
-                       /* make sure the last element is NULL */
-                       bids[bi] = NULL;
                }
        }
 
@@ -1505,11 +1453,11 @@ NTSTATUS idmap_sids_to_unixids(struct id_map **ids)
                        goto done;
                }
 
-               ret = idmap_backends_sids_to_unixids(bids);
+               ret = idmap_backends_sids_to_unixids(bids, bn);
                IDMAP_CHECK_RET(ret);
 
                /* update the cache */
-               for (i = 0; bids[i]; i++) {
+               for (i = 0; i < bn; i++) {
                        if (bids[i]->status == ID_MAPPED) {
                                ret = idmap_cache_set(bids[i]);
                        } else if (bids[i]->status == ID_EXPIRED) {
index 78f4d13ec1ed9fecd6feec737c3c2e254a9ddcdc..9819fe15f0a8550f122fec1b8e40bd628ce8c79a 100644 (file)
@@ -31,18 +31,16 @@ NTSTATUS idmap_uid_to_sid(DOM_SID *sid, uid_t uid)
 {
        NTSTATUS ret;
        struct id_map map;
-       struct id_map *maps[2];
+       struct id_map *maps;
 
        DEBUG(10,("uid = [%lu]\n", (unsigned long)uid));
 
        map.sid = sid;
        map.xid.type = ID_TYPE_UID;
        map.xid.id = uid;
+       maps = &map;
 
-       maps[0] = &map;
-       maps[1] = NULL;
-
-       ret = idmap_unixids_to_sids(maps);
+       ret = idmap_unixids_to_sids(&maps, 1);
        if ( ! NT_STATUS_IS_OK(ret)) {
                DEBUG(10, ("error mapping uid [%lu]\n", (unsigned long)uid));
                return ret;
@@ -65,18 +63,16 @@ NTSTATUS idmap_gid_to_sid(DOM_SID *sid, gid_t gid)
 {
        NTSTATUS ret;
        struct id_map map;
-       struct id_map *maps[2];
+       struct id_map *maps;
 
        DEBUG(10,("gid = [%lu]\n", (unsigned long)gid));
 
        map.sid = sid;
        map.xid.type = ID_TYPE_GID;
        map.xid.id = gid;
+       maps = &map;
 
-       maps[0] = &map;
-       maps[1] = NULL;
-
-       ret = idmap_unixids_to_sids(maps);
+       ret = idmap_unixids_to_sids(&maps, 1);
        if ( ! NT_STATUS_IS_OK(ret)) {
                DEBUG(10, ("error mapping gid [%lu]\n", (unsigned long)gid));
                return ret;
@@ -99,17 +95,15 @@ NTSTATUS idmap_sid_to_uid(DOM_SID *sid, uid_t *uid)
 {
        NTSTATUS ret;
        struct id_map map;
-       struct id_map *maps[2];
+       struct id_map *maps;
 
        DEBUG(10,("idmap_sid_to_uid: sid = [%s]\n", sid_string_dbg(sid)));
 
        map.sid = sid;
-       map.xid.type = ID_TYPE_UID;     
-
-       maps[0] = &map;
-       maps[1] = NULL;
+       map.xid.type = ID_TYPE_UID;
+       maps = &map;
 
-       ret = idmap_sids_to_unixids(maps);
+       ret = idmap_sids_to_unixids(&maps, 1);
        if ( ! NT_STATUS_IS_OK(ret)) {
                DEBUG(10, ("error mapping sid [%s] to uid\n", 
                           sid_string_dbg(sid)));
@@ -139,17 +133,15 @@ NTSTATUS idmap_sid_to_gid(DOM_SID *sid, gid_t *gid)
 {
        NTSTATUS ret;
        struct id_map map;
-       struct id_map *maps[2];
+       struct id_map *maps;
 
        DEBUG(10,("idmap_sid_to_gid: sid = [%s]\n", sid_string_dbg(sid)));
 
        map.sid = sid;
        map.xid.type = ID_TYPE_GID;
+       maps = &map;
 
-       maps[0] = &map;
-       maps[1] = NULL;
-
-       ret = idmap_sids_to_unixids(maps);
+       ret = idmap_sids_to_unixids(&maps, 1);
        if ( ! NT_STATUS_IS_OK(ret)) {
                DEBUG(10, ("error mapping sid [%s] to gid\n", 
                           sid_string_dbg(sid)));
index 3c7aa2d0c22d173df0f912a5ba208e1bce3fce4e..98f8548083dd2e19cce7b2c6e77bf9b2b87c978c 100644 (file)
@@ -224,7 +224,7 @@ enum winbindd_result winbindd_dual_sids2xids(struct winbindd_domain *domain,
        sids = (DOM_SID *)state->request.extra_data.data;
        num = state->request.extra_len / sizeof(DOM_SID);
 
-       ids = TALLOC_ZERO_ARRAY(state->mem_ctx, struct id_map *, num + 1);
+       ids = TALLOC_ARRAY(state->mem_ctx, struct id_map *, num);
        if ( ! ids) {
                DEBUG(0, ("Out of memory!\n"));
                return WINBINDD_ERROR;
@@ -239,7 +239,7 @@ enum winbindd_result winbindd_dual_sids2xids(struct winbindd_domain *domain,
                ids[i]->sid = &sids[i];
        }
 
-       result = idmap_sids_to_unixids(ids);
+       result = idmap_sids_to_unixids(ids, num);
 
        if (NT_STATUS_IS_OK(result)) {