summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/winbind/idmap.c50
-rw-r--r--source4/winbind/wb_sids2xids.c20
-rw-r--r--source4/winbind/wb_xids2sids.c20
3 files changed, 62 insertions, 28 deletions
diff --git a/source4/winbind/idmap.c b/source4/winbind/idmap.c
index 1b2d358b8b..b5a01ae6a1 100644
--- a/source4/winbind/idmap.c
+++ b/source4/winbind/idmap.c
@@ -613,31 +613,31 @@ failed:
*/
NTSTATUS idmap_xids_to_sids(struct idmap_context *idmap_ctx,
- TALLOC_CTX *mem_ctx, int count,
- struct id_map *id)
+ TALLOC_CTX *mem_ctx,
+ struct id_map **id)
{
- int i;
- int error_count = 0;
+ unsigned int i, error_count = 0;
NTSTATUS status;
- for (i = 0; i < count; ++i) {
+ for (i = 0; id && id[i]; i++) {
status = idmap_xid_to_sid(idmap_ctx, mem_ctx,
- &id[i].xid, &id[i].sid);
+ &id[i]->xid, &id[i]->sid);
if (NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) {
status = idmap_xid_to_sid(idmap_ctx, mem_ctx,
- &id[i].xid,
- &id[i].sid);
+ &id[i]->xid,
+ &id[i]->sid);
}
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(1, ("idmapping xid_to_sid failed for id[%d]\n", i));
+ DEBUG(1, ("idmapping xid_to_sid failed for id[%d]=%lu: %s\n",
+ i, (unsigned long)id[i]->xid.id, nt_errstr(status)));
error_count++;
- id[i].status = ID_UNMAPPED;
+ id[i]->status = ID_UNMAPPED;
} else {
- id[i].status = ID_MAPPED;
+ id[i]->status = ID_MAPPED;
}
}
- if (error_count == count) {
+ if (error_count == i) {
/* Mapping did not work at all. */
return NT_STATUS_NONE_MAPPED;
} else if (error_count > 0) {
@@ -662,31 +662,33 @@ NTSTATUS idmap_xids_to_sids(struct idmap_context *idmap_ctx,
*/
NTSTATUS idmap_sids_to_xids(struct idmap_context *idmap_ctx,
- TALLOC_CTX *mem_ctx, int count,
- struct id_map *id)
+ TALLOC_CTX *mem_ctx,
+ struct id_map **id)
{
- int i;
- int error_count = 0;
+ unsigned int i, error_count = 0;
NTSTATUS status;
- for (i = 0; i < count; ++i) {
+ for (i = 0; id && id[i]; i++) {
status = idmap_sid_to_xid(idmap_ctx, mem_ctx,
- id[i].sid, &id[i].xid);
+ id[i]->sid, &id[i]->xid);
if (NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) {
status = idmap_sid_to_xid(idmap_ctx, mem_ctx,
- id[i].sid,
- &id[i].xid);
+ id[i]->sid,
+ &id[i]->xid);
}
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(1, ("idmapping sid_to_xid failed for id[%d]\n", i));
+ char *str = dom_sid_string(mem_ctx, id[i]->sid);
+ DEBUG(1, ("idmapping sid_to_xid failed for id[%d]=%s: %s\n",
+ i, str, nt_errstr(status)));
+ talloc_free(str);
error_count++;
- id[i].status = ID_UNMAPPED;
+ id[i]->status = ID_UNMAPPED;
} else {
- id[i].status = ID_MAPPED;
+ id[i]->status = ID_MAPPED;
}
}
- if (error_count == count) {
+ if (error_count == i) {
/* Mapping did not work at all. */
return NT_STATUS_NONE_MAPPED;
} else if (error_count > 0) {
diff --git a/source4/winbind/wb_sids2xids.c b/source4/winbind/wb_sids2xids.c
index 617318ce52..c966c40dc0 100644
--- a/source4/winbind/wb_sids2xids.c
+++ b/source4/winbind/wb_sids2xids.c
@@ -33,10 +33,12 @@ struct sids2xids_state {
struct composite_context *wb_sids2xids_send(TALLOC_CTX *mem_ctx,
struct wbsrv_service *service,
- int count, struct id_map *ids)
+ unsigned int count, struct id_map *ids)
{
struct composite_context *result;
struct sids2xids_state *state;
+ struct id_map **pointer_array;
+ unsigned int i;
DEBUG(5, ("wb_sids2xids_send called\n"));
@@ -52,8 +54,19 @@ struct composite_context *wb_sids2xids_send(TALLOC_CTX *mem_ctx,
state->count = count;
state->ids = ids;
+ /* We need to convert between calling conventions here - the
+ * values are filled in by reference, so we just need to
+ * provide pointers to them */
+ pointer_array = talloc_array(state, struct id_map *, count+1);
+ if (composite_nomem(pointer_array, result)) return result;
+
+ for (i=0; i < count; i++) {
+ pointer_array[i] = &ids[i];
+ }
+ pointer_array[i] = NULL;
+
state->ctx->status = idmap_sids_to_xids(service->idmap_ctx, mem_ctx,
- count, state->ids);
+ pointer_array);
if (!composite_is_ok(state->ctx)) return result;
composite_done(state->ctx);
@@ -69,6 +82,9 @@ NTSTATUS wb_sids2xids_recv(struct composite_context *ctx,
DEBUG(5, ("wb_sids2xids_recv called\n"));
+ /* We don't have to mess with pointer_array on the way out, as
+ * the results are filled into the pointers the caller
+ * supplied */
*ids = state->ids;
talloc_free(ctx);
diff --git a/source4/winbind/wb_xids2sids.c b/source4/winbind/wb_xids2sids.c
index 9d95ac012c..aeec2ee5be 100644
--- a/source4/winbind/wb_xids2sids.c
+++ b/source4/winbind/wb_xids2sids.c
@@ -33,10 +33,12 @@ struct xids2sids_state {
struct composite_context *wb_xids2sids_send(TALLOC_CTX *mem_ctx,
struct wbsrv_service *service,
- int count, struct id_map *ids)
+ unsigned int count, struct id_map *ids)
{
struct composite_context *result;
struct xids2sids_state *state;
+ struct id_map **pointer_array;
+ unsigned int i;
DEBUG(5, ("wb_xids2sids_send called\n"));
@@ -52,8 +54,19 @@ struct composite_context *wb_xids2sids_send(TALLOC_CTX *mem_ctx,
state->count = count;
state->ids = ids;
+ /* We need to convert between calling conventions here - the
+ * values are filled in by reference, so we just need to
+ * provide pointers to them */
+ pointer_array = talloc_array(state, struct id_map *, count+1);
+ if (composite_nomem(pointer_array, result)) return result;
+
+ for (i=0; i < count; i++) {
+ pointer_array[i] = &ids[i];
+ }
+ pointer_array[i] = NULL;
+
state->ctx->status = idmap_xids_to_sids(service->idmap_ctx, mem_ctx,
- count, state->ids);
+ pointer_array);
if (!composite_is_ok(state->ctx)) return result;
composite_done(state->ctx);
@@ -69,6 +82,9 @@ NTSTATUS wb_xids2sids_recv(struct composite_context *ctx,
DEBUG(5, ("wb_xids2sids_recv called.\n"));
+ /* We don't have to mess with pointer_array on the way out, as
+ * the results are filled into the pointers the caller
+ * supplied */
*ids = state->ids;
talloc_free(ctx);