summaryrefslogtreecommitdiff
path: root/source3/winbindd/winbindd_sid_to_gid.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/winbindd/winbindd_sid_to_gid.c')
-rw-r--r--source3/winbindd/winbindd_sid_to_gid.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/source3/winbindd/winbindd_sid_to_gid.c b/source3/winbindd/winbindd_sid_to_gid.c
index df44ed8d6b..46ca903cd3 100644
--- a/source3/winbindd/winbindd_sid_to_gid.c
+++ b/source3/winbindd/winbindd_sid_to_gid.c
@@ -54,7 +54,7 @@ struct tevent_req *winbindd_sid_to_gid_send(TALLOC_CTX *mem_ctx,
return tevent_req_post(req, ev);
}
- subreq = wb_sid2gid_send(state, ev, &state->sid);
+ subreq = wb_sids2xids_send(state, ev, &state->sid, 1);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
@@ -69,12 +69,26 @@ static void winbindd_sid_to_gid_done(struct tevent_req *subreq)
struct winbindd_sid_to_gid_state *state = tevent_req_data(
req, struct winbindd_sid_to_gid_state);
NTSTATUS status;
+ struct unixid xid;
- status = wb_sid2gid_recv(subreq, &state->gid);
+ status = wb_sids2xids_recv(subreq, &xid);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;
}
+
+ /*
+ * We are filtering further down in sids2xids, but that filtering
+ * depends on the actual type of the sid handed in (as determined
+ * by lookupsids). Here we need to filter for the type of object
+ * actually requested, in this case gid.
+ */
+ if (!(xid.type == ID_TYPE_GID || xid.type == ID_TYPE_BOTH)) {
+ tevent_req_nterror(req, NT_STATUS_NONE_MAPPED);
+ return;
+ }
+
+ state->gid = (gid_t)xid.id;
tevent_req_done(req);
}