From ebb2d70a607cf33f3d2084d715c2d9d4329f2e7b Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 11 Jul 2008 17:42:48 +0200 Subject: Revert "Make use of ADD_TO_ARRAY" This reverts commit 81f334bd6da601a040f754c46705cfa2fd4f8c45. (This used to be commit d4d106776af3f475d46a4dd78794b7b48a3572af) --- source3/winbindd/idmap.c | 94 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 21 deletions(-) (limited to 'source3/winbindd/idmap.c') diff --git a/source3/winbindd/idmap.c b/source3/winbindd/idmap.c index 504be22292..db17245b92 100644 --- a/source3/winbindd/idmap.c +++ b/source3/winbindd/idmap.c @@ -1177,8 +1177,7 @@ done: return ret; } -static NTSTATUS idmap_backends_sids_to_unixids(struct id_map **ids, int - num_ids) +static NTSTATUS idmap_backends_sids_to_unixids(struct id_map **ids) { struct id_map ***dom_ids; struct idmap_domain *dom; @@ -1206,7 +1205,7 @@ static NTSTATUS idmap_backends_sids_to_unixids(struct id_map **ids, int /* partition the requests by domain */ - for (i = 0; i < num_ids; i++) { + for (i = 0; ids[i]; i++) { uint32 idx; if ((dom = find_idmap_domain_from_sid(ids[i]->sid)) == NULL) { @@ -1246,7 +1245,7 @@ static NTSTATUS idmap_backends_sids_to_unixids(struct id_map **ids, int /* 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; i < num_ids; i++) { + for (i = 0; ids[i]; 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 || @@ -1279,7 +1278,7 @@ done: idmap interface functions **************************************************************************/ -NTSTATUS idmap_unixids_to_sids(struct id_map **ids, int n_ids) +NTSTATUS idmap_unixids_to_sids(struct id_map **ids) { TALLOC_CTX *ctx; NTSTATUS ret; @@ -1307,7 +1306,7 @@ NTSTATUS idmap_unixids_to_sids(struct id_map **ids, int n_ids) bids = NULL; bi = 0; - for (i = 0; i < n_ids; i++) { + for (i = 0; ids[i]; i++) { bool found, mapped, expired; @@ -1332,12 +1331,38 @@ NTSTATUS idmap_unixids_to_sids(struct id_map **ids, int n_ids) * Need to ask the backend */ - 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; + 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 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; } } @@ -1383,12 +1408,12 @@ done: return ret; } -NTSTATUS idmap_sids_to_unixids(struct id_map **ids, int n_ids) +NTSTATUS idmap_sids_to_unixids(struct id_map **ids) { TALLOC_CTX *ctx; NTSTATUS ret; struct id_map **bids; - int i; + int i, bi; int bn = 0; struct winbindd_domain *our_domain = find_our_domain(); @@ -1409,8 +1434,9 @@ NTSTATUS idmap_sids_to_unixids(struct id_map **ids, int n_ids) /* no ids to be asked to the backends by default */ bids = NULL; + bi = 0; - for (i = 0; i < n_ids; i++) { + for (i = 0; ids[i]; i++) { bool found, mapped, expired; @@ -1435,12 +1461,38 @@ NTSTATUS idmap_sids_to_unixids(struct id_map **ids, int n_ids) * Need to ask the backends */ - 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; + 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; + } } + + /* make sure the last element is NULL */ + bids[bi] = NULL; } } @@ -1453,11 +1505,11 @@ NTSTATUS idmap_sids_to_unixids(struct id_map **ids, int n_ids) goto done; } - ret = idmap_backends_sids_to_unixids(bids, bn); + ret = idmap_backends_sids_to_unixids(bids); IDMAP_CHECK_RET(ret); /* update the cache */ - for (i = 0; i < bn; i++) { + for (i = 0; bids[i]; i++) { if (bids[i]->status == ID_MAPPED) { ret = idmap_cache_set(bids[i]); } else if (bids[i]->status == ID_EXPIRED) { -- cgit