summaryrefslogtreecommitdiffstats
path: root/source3
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2015-03-05 20:59:16 +0100
committerVolker Lendecke <vl@samba.org>2015-03-07 15:28:59 +0100
commit5ba377f3df61647e259d40a6fa24dc8445618cda (patch)
tree502687a456fd99015041a1225665035db6a85536 /source3
parent91ff65b2f63061fa66b6bcc3c142c17b03581759 (diff)
downloadsamba-5ba377f3df61647e259d40a6fa24dc8445618cda.tar.gz
samba-5ba377f3df61647e259d40a6fa24dc8445618cda.tar.xz
samba-5ba377f3df61647e259d40a6fa24dc8445618cda.zip
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
Diffstat (limited to 'source3')
-rw-r--r--source3/winbindd/wb_fill_pwent.c8
-rw-r--r--source3/winbindd/wb_getgrsid.c10
-rw-r--r--source3/winbindd/wb_sids2xids.c8
-rw-r--r--source3/winbindd/winbindd_getgroups.c2
-rw-r--r--source3/winbindd/winbindd_proto.h2
-rw-r--r--source3/winbindd/winbindd_sid_to_gid.c8
-rw-r--r--source3/winbindd/winbindd_sid_to_uid.c8
-rw-r--r--source3/winbindd/winbindd_sids_to_xids.c2
8 files changed, 27 insertions, 21 deletions
diff --git a/source3/winbindd/wb_fill_pwent.c b/source3/winbindd/wb_fill_pwent.c
index 1135ef320d..4b4484fda0 100644
--- a/source3/winbindd/wb_fill_pwent.c
+++ b/source3/winbindd/wb_fill_pwent.c
@@ -70,9 +70,9 @@ static void wb_fill_pwent_sid2uid_done(struct tevent_req *subreq)
struct wb_fill_pwent_state *state = tevent_req_data(
req, struct wb_fill_pwent_state);
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);
if (tevent_req_nterror(req, status)) {
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
* 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);
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);
if (tevent_req_nomem(subreq, req)) {
diff --git a/source3/winbindd/wb_getgrsid.c b/source3/winbindd/wb_getgrsid.c
index 2678c5014c..acfedf62c9 100644
--- a/source3/winbindd/wb_getgrsid.c
+++ b/source3/winbindd/wb_getgrsid.c
@@ -116,9 +116,9 @@ static void wb_getgrsid_sid2gid_done(struct tevent_req *subreq)
struct wb_getgrsid_state *state = tevent_req_data(
req, struct wb_getgrsid_state);
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);
if (tevent_req_nterror(req, status)) {
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
* 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);
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) {
/*
@@ -145,7 +145,7 @@ static void wb_getgrsid_sid2gid_done(struct tevent_req *subreq)
*/
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);
return;
}
diff --git a/source3/winbindd/wb_sids2xids.c b/source3/winbindd/wb_sids2xids.c
index 76149743f0..e3962de269 100644
--- a/source3/winbindd/wb_sids2xids.c
+++ b/source3/winbindd/wb_sids2xids.c
@@ -253,7 +253,7 @@ static void wb_sids2xids_done(struct tevent_req *subreq)
}
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(
req, struct wb_sids2xids_state);
@@ -265,6 +265,12 @@ NTSTATUS wb_sids2xids_recv(struct tevent_req *req,
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;
for (i=0; i<state->num_sids; i++) {
diff --git a/source3/winbindd/winbindd_getgroups.c b/source3/winbindd/winbindd_getgroups.c
index b899bebe17..8b9d0a3ecd 100644
--- a/source3/winbindd/winbindd_getgroups.c
+++ b/source3/winbindd/winbindd_getgroups.c
@@ -155,7 +155,7 @@ static void winbindd_getgroups_sid2gid_done(struct tevent_req *subreq)
xids[i].id = UINT32_MAX;
}
- status = wb_sids2xids_recv(subreq, xids);
+ status = wb_sids2xids_recv(subreq, xids, state->num_sids);
TALLOC_FREE(subreq);
if (NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED) ||
NT_STATUS_EQUAL(status, STATUS_SOME_UNMAPPED))
diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h
index 77e1dbefc4..e0b7aad310 100644
--- a/source3/winbindd/winbindd_proto.h
+++ b/source3/winbindd/winbindd_proto.h
@@ -884,7 +884,7 @@ struct tevent_req *wb_sids2xids_send(TALLOC_CTX *mem_ctx,
const struct dom_sid *sids,
const uint32_t num_sids);
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_context *ev,
struct winbindd_cli_state *cli,
diff --git a/source3/winbindd/winbindd_sid_to_gid.c b/source3/winbindd/winbindd_sid_to_gid.c
index 46ca903cd3..978ed6a534 100644
--- a/source3/winbindd/winbindd_sid_to_gid.c
+++ b/source3/winbindd/winbindd_sid_to_gid.c
@@ -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(
req, struct winbindd_sid_to_gid_state);
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);
if (tevent_req_nterror(req, status)) {
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
* 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);
return;
}
- state->gid = (gid_t)xid.id;
+ state->gid = (gid_t)xids[0].id;
tevent_req_done(req);
}
diff --git a/source3/winbindd/winbindd_sid_to_uid.c b/source3/winbindd/winbindd_sid_to_uid.c
index 67fe9527dc..cbab2d2c16 100644
--- a/source3/winbindd/winbindd_sid_to_uid.c
+++ b/source3/winbindd/winbindd_sid_to_uid.c
@@ -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(
req, struct winbindd_sid_to_uid_state);
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);
if (tevent_req_nterror(req, status)) {
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
* 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);
return;
}
- state->uid = (uid_t)xid.id;
+ state->uid = (uid_t)xids[0].id;
tevent_req_done(req);
}
diff --git a/source3/winbindd/winbindd_sids_to_xids.c b/source3/winbindd/winbindd_sids_to_xids.c
index e4c7e3f0a9..13d51dbf97 100644
--- a/source3/winbindd/winbindd_sids_to_xids.c
+++ b/source3/winbindd/winbindd_sids_to_xids.c
@@ -89,7 +89,7 @@ static void winbindd_sids_to_xids_done(struct tevent_req *subreq)
return;
}
- status = wb_sids2xids_recv(subreq, state->xids);
+ status = wb_sids2xids_recv(subreq, state->xids, state->num_sids);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;