diff options
| -rw-r--r-- | source3/include/proto.h | 4 | ||||
| -rw-r--r-- | source3/winbindd/idmap.c | 94 | ||||
| -rw-r--r-- | source3/winbindd/idmap_util.c | 34 | ||||
| -rw-r--r-- | source3/winbindd/winbindd_idmap.c | 4 | 
4 files changed, 38 insertions, 98 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index bb10487b54..2a954f4efe 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -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); diff --git a/source3/winbindd/idmap.c b/source3/winbindd/idmap.c index db17245b92..504be22292 100644 --- a/source3/winbindd/idmap.c +++ b/source3/winbindd/idmap.c @@ -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) { diff --git a/source3/winbindd/idmap_util.c b/source3/winbindd/idmap_util.c index 78f4d13ec1..9819fe15f0 100644 --- a/source3/winbindd/idmap_util.c +++ b/source3/winbindd/idmap_util.c @@ -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 = ↦ -	maps[0] = ↦ -	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 = ↦ -	maps[0] = ↦ -	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] = ↦ -	maps[1] = NULL; +	map.xid.type = ID_TYPE_UID; +	maps = ↦ -	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 = ↦ -	maps[0] = ↦ -	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))); diff --git a/source3/winbindd/winbindd_idmap.c b/source3/winbindd/winbindd_idmap.c index 3c7aa2d0c2..98f8548083 100644 --- a/source3/winbindd/winbindd_idmap.c +++ b/source3/winbindd/winbindd_idmap.c @@ -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)) {  | 
