mirror of
https://github.com/samba-team/samba.git
synced 2025-08-04 08:22:08 +03:00
winbind: Make wb_sids2xids_recv work on an array
The trigger for this is that Coverity got confused by the dual use of &xid as an array with the implicit length equality between wb_sids2xids_send and the array passed in to wb_sids2xids_recv for the result. I don't want to start doing things just for the Coverity scan, but this makes the code clearer to me by removing this implicit expected array length equality. Signed-off-by: Volker Lendecke <vl@samba.org> Signed-off-by: David Disseldorp <ddiss@samba.org> Reviewed-by: Volker Lendecke <vl@samba.org> Reviewed-by: David Disseldorp <ddiss@samba.org> Autobuild-User(master): Volker Lendecke <vl@samba.org> Autobuild-Date(master): Sat Mar 7 15:28:59 CET 2015 on sn-devel-104
This commit is contained in:
@ -70,9 +70,9 @@ static void wb_fill_pwent_sid2uid_done(struct tevent_req *subreq)
|
|||||||
struct wb_fill_pwent_state *state = tevent_req_data(
|
struct wb_fill_pwent_state *state = tevent_req_data(
|
||||||
req, struct wb_fill_pwent_state);
|
req, struct wb_fill_pwent_state);
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
struct unixid xid;
|
struct unixid xids[1];
|
||||||
|
|
||||||
status = wb_sids2xids_recv(subreq, &xid);
|
status = wb_sids2xids_recv(subreq, xids, ARRAY_SIZE(xids));
|
||||||
TALLOC_FREE(subreq);
|
TALLOC_FREE(subreq);
|
||||||
if (tevent_req_nterror(req, status)) {
|
if (tevent_req_nterror(req, status)) {
|
||||||
return;
|
return;
|
||||||
@ -84,12 +84,12 @@ static void wb_fill_pwent_sid2uid_done(struct tevent_req *subreq)
|
|||||||
* by lookupsids). Here we need to filter for the type of object
|
* by lookupsids). Here we need to filter for the type of object
|
||||||
* actually requested, in this case uid.
|
* actually requested, in this case uid.
|
||||||
*/
|
*/
|
||||||
if (!(xid.type == ID_TYPE_UID || xid.type == ID_TYPE_BOTH)) {
|
if (!(xids[0].type == ID_TYPE_UID || xids[0].type == ID_TYPE_BOTH)) {
|
||||||
tevent_req_nterror(req, NT_STATUS_NONE_MAPPED);
|
tevent_req_nterror(req, NT_STATUS_NONE_MAPPED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state->pw->pw_uid = (uid_t)xid.id;
|
state->pw->pw_uid = (uid_t)xids[0].id;
|
||||||
|
|
||||||
subreq = wb_getgrsid_send(state, state->ev, &state->info->group_sid, 0);
|
subreq = wb_getgrsid_send(state, state->ev, &state->info->group_sid, 0);
|
||||||
if (tevent_req_nomem(subreq, req)) {
|
if (tevent_req_nomem(subreq, req)) {
|
||||||
|
@ -116,9 +116,9 @@ static void wb_getgrsid_sid2gid_done(struct tevent_req *subreq)
|
|||||||
struct wb_getgrsid_state *state = tevent_req_data(
|
struct wb_getgrsid_state *state = tevent_req_data(
|
||||||
req, struct wb_getgrsid_state);
|
req, struct wb_getgrsid_state);
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
struct unixid xid;
|
struct unixid xids[1];
|
||||||
|
|
||||||
status = wb_sids2xids_recv(subreq, &xid);
|
status = wb_sids2xids_recv(subreq, xids, ARRAY_SIZE(xids));
|
||||||
TALLOC_FREE(subreq);
|
TALLOC_FREE(subreq);
|
||||||
if (tevent_req_nterror(req, status)) {
|
if (tevent_req_nterror(req, status)) {
|
||||||
return;
|
return;
|
||||||
@ -130,12 +130,12 @@ static void wb_getgrsid_sid2gid_done(struct tevent_req *subreq)
|
|||||||
* by lookupsids). Here we need to filter for the type of object
|
* by lookupsids). Here we need to filter for the type of object
|
||||||
* actually requested, in this case uid.
|
* actually requested, in this case uid.
|
||||||
*/
|
*/
|
||||||
if (!(xid.type == ID_TYPE_GID || xid.type == ID_TYPE_BOTH)) {
|
if (!(xids[0].type == ID_TYPE_GID || xids[0].type == ID_TYPE_BOTH)) {
|
||||||
tevent_req_nterror(req, NT_STATUS_NONE_MAPPED);
|
tevent_req_nterror(req, NT_STATUS_NONE_MAPPED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state->gid = (gid_t)xid.id;
|
state->gid = (gid_t)xids[0].id;
|
||||||
|
|
||||||
if (state->type == SID_NAME_USER || state->type == SID_NAME_COMPUTER) {
|
if (state->type == SID_NAME_USER || state->type == SID_NAME_COMPUTER) {
|
||||||
/*
|
/*
|
||||||
@ -145,7 +145,7 @@ static void wb_getgrsid_sid2gid_done(struct tevent_req *subreq)
|
|||||||
*/
|
*/
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
if (xid.type != ID_TYPE_BOTH) {
|
if (xids[0].type != ID_TYPE_BOTH) {
|
||||||
tevent_req_nterror(req, NT_STATUS_NO_SUCH_GROUP);
|
tevent_req_nterror(req, NT_STATUS_NO_SUCH_GROUP);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -253,7 +253,7 @@ static void wb_sids2xids_done(struct tevent_req *subreq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS wb_sids2xids_recv(struct tevent_req *req,
|
NTSTATUS wb_sids2xids_recv(struct tevent_req *req,
|
||||||
struct unixid *xids)
|
struct unixid xids[], uint32_t num_xids)
|
||||||
{
|
{
|
||||||
struct wb_sids2xids_state *state = tevent_req_data(
|
struct wb_sids2xids_state *state = tevent_req_data(
|
||||||
req, struct wb_sids2xids_state);
|
req, struct wb_sids2xids_state);
|
||||||
@ -265,6 +265,12 @@ NTSTATUS wb_sids2xids_recv(struct tevent_req *req,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (num_xids != state->num_sids) {
|
||||||
|
DEBUG(1, ("%s: Have %u xids, caller wants %u\n", __func__,
|
||||||
|
(unsigned)state->num_sids, num_xids));
|
||||||
|
return NT_STATUS_INTERNAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
num_non_cached = 0;
|
num_non_cached = 0;
|
||||||
|
|
||||||
for (i=0; i<state->num_sids; i++) {
|
for (i=0; i<state->num_sids; i++) {
|
||||||
|
@ -155,7 +155,7 @@ static void winbindd_getgroups_sid2gid_done(struct tevent_req *subreq)
|
|||||||
xids[i].id = UINT32_MAX;
|
xids[i].id = UINT32_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = wb_sids2xids_recv(subreq, xids);
|
status = wb_sids2xids_recv(subreq, xids, state->num_sids);
|
||||||
TALLOC_FREE(subreq);
|
TALLOC_FREE(subreq);
|
||||||
if (NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED) ||
|
if (NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED) ||
|
||||||
NT_STATUS_EQUAL(status, STATUS_SOME_UNMAPPED))
|
NT_STATUS_EQUAL(status, STATUS_SOME_UNMAPPED))
|
||||||
|
@ -884,7 +884,7 @@ struct tevent_req *wb_sids2xids_send(TALLOC_CTX *mem_ctx,
|
|||||||
const struct dom_sid *sids,
|
const struct dom_sid *sids,
|
||||||
const uint32_t num_sids);
|
const uint32_t num_sids);
|
||||||
NTSTATUS wb_sids2xids_recv(struct tevent_req *req,
|
NTSTATUS wb_sids2xids_recv(struct tevent_req *req,
|
||||||
struct unixid *xids);
|
struct unixid xids[], uint32_t num_xids);
|
||||||
struct tevent_req *winbindd_sids_to_xids_send(TALLOC_CTX *mem_ctx,
|
struct tevent_req *winbindd_sids_to_xids_send(TALLOC_CTX *mem_ctx,
|
||||||
struct tevent_context *ev,
|
struct tevent_context *ev,
|
||||||
struct winbindd_cli_state *cli,
|
struct winbindd_cli_state *cli,
|
||||||
|
@ -69,9 +69,9 @@ static void winbindd_sid_to_gid_done(struct tevent_req *subreq)
|
|||||||
struct winbindd_sid_to_gid_state *state = tevent_req_data(
|
struct winbindd_sid_to_gid_state *state = tevent_req_data(
|
||||||
req, struct winbindd_sid_to_gid_state);
|
req, struct winbindd_sid_to_gid_state);
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
struct unixid xid;
|
struct unixid xids[1];
|
||||||
|
|
||||||
status = wb_sids2xids_recv(subreq, &xid);
|
status = wb_sids2xids_recv(subreq, xids, ARRAY_SIZE(xids));
|
||||||
TALLOC_FREE(subreq);
|
TALLOC_FREE(subreq);
|
||||||
if (tevent_req_nterror(req, status)) {
|
if (tevent_req_nterror(req, status)) {
|
||||||
return;
|
return;
|
||||||
@ -83,12 +83,12 @@ static void winbindd_sid_to_gid_done(struct tevent_req *subreq)
|
|||||||
* by lookupsids). Here we need to filter for the type of object
|
* by lookupsids). Here we need to filter for the type of object
|
||||||
* actually requested, in this case gid.
|
* actually requested, in this case gid.
|
||||||
*/
|
*/
|
||||||
if (!(xid.type == ID_TYPE_GID || xid.type == ID_TYPE_BOTH)) {
|
if (!(xids[0].type == ID_TYPE_GID || xids[0].type == ID_TYPE_BOTH)) {
|
||||||
tevent_req_nterror(req, NT_STATUS_NONE_MAPPED);
|
tevent_req_nterror(req, NT_STATUS_NONE_MAPPED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state->gid = (gid_t)xid.id;
|
state->gid = (gid_t)xids[0].id;
|
||||||
tevent_req_done(req);
|
tevent_req_done(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,9 +69,9 @@ static void winbindd_sid_to_uid_done(struct tevent_req *subreq)
|
|||||||
struct winbindd_sid_to_uid_state *state = tevent_req_data(
|
struct winbindd_sid_to_uid_state *state = tevent_req_data(
|
||||||
req, struct winbindd_sid_to_uid_state);
|
req, struct winbindd_sid_to_uid_state);
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
struct unixid xid;
|
struct unixid xids[1];
|
||||||
|
|
||||||
status = wb_sids2xids_recv(subreq, &xid);
|
status = wb_sids2xids_recv(subreq, xids, ARRAY_SIZE(xids));
|
||||||
TALLOC_FREE(subreq);
|
TALLOC_FREE(subreq);
|
||||||
if (tevent_req_nterror(req, status)) {
|
if (tevent_req_nterror(req, status)) {
|
||||||
return;
|
return;
|
||||||
@ -83,12 +83,12 @@ static void winbindd_sid_to_uid_done(struct tevent_req *subreq)
|
|||||||
* by lookupsids). Here we need to filter for the type of object
|
* by lookupsids). Here we need to filter for the type of object
|
||||||
* actually requested, in this case uid.
|
* actually requested, in this case uid.
|
||||||
*/
|
*/
|
||||||
if (!(xid.type == ID_TYPE_UID || xid.type == ID_TYPE_BOTH)) {
|
if (!(xids[0].type == ID_TYPE_UID || xids[0].type == ID_TYPE_BOTH)) {
|
||||||
tevent_req_nterror(req, NT_STATUS_NONE_MAPPED);
|
tevent_req_nterror(req, NT_STATUS_NONE_MAPPED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state->uid = (uid_t)xid.id;
|
state->uid = (uid_t)xids[0].id;
|
||||||
tevent_req_done(req);
|
tevent_req_done(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ static void winbindd_sids_to_xids_done(struct tevent_req *subreq)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = wb_sids2xids_recv(subreq, state->xids);
|
status = wb_sids2xids_recv(subreq, state->xids, state->num_sids);
|
||||||
TALLOC_FREE(subreq);
|
TALLOC_FREE(subreq);
|
||||||
if (tevent_req_nterror(req, status)) {
|
if (tevent_req_nterror(req, status)) {
|
||||||
return;
|
return;
|
||||||
|
Reference in New Issue
Block a user