winbind: Make wb_sids2xids_recv work on an array
authorVolker Lendecke <vl@samba.org>
Thu, 5 Mar 2015 19:59:16 +0000 (20:59 +0100)
committerVolker Lendecke <vl@samba.org>
Sat, 7 Mar 2015 14:28:59 +0000 (15:28 +0100)
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

source3/winbindd/wb_fill_pwent.c
source3/winbindd/wb_getgrsid.c
source3/winbindd/wb_sids2xids.c
source3/winbindd/winbindd_getgroups.c
source3/winbindd/winbindd_proto.h
source3/winbindd/winbindd_sid_to_gid.c
source3/winbindd/winbindd_sid_to_uid.c
source3/winbindd/winbindd_sids_to_xids.c

index 1135ef320d47f30de8aa4be7210e00a85de144af..4b4484fda0f7e3adddf8a364deb74dec720075ce 100644 (file)
@@ -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)) {
index 2678c5014c9c677023bb5afa79baa241d9f79c70..acfedf62c9d2cfba342799a6cb12ae54046bfa54 100644 (file)
@@ -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;
                }
index 76149743f055532728d622b49887ca65a4ecd263..e3962de269b5079f55ff01ebb71859d185785ee3 100644 (file)
@@ -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++) {
index b899bebe17035c191fb5d03bee8b27ebb4d7567f..8b9d0a3ecdf2fe66cb7d60af5408af715dd1673e 100644 (file)
@@ -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))
index 77e1dbefc40ddd8d3ef500bdeefb3621cc46be36..e0b7aad3108f025417b8afc34d5f2fb5fdd531a0 100644 (file)
@@ -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,
index 46ca903cd303de6062c963488f421d549e735a80..978ed6a5342e58c6800483b60c7d7daa4ca3431f 100644 (file)
@@ -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);
 }
 
index 67fe9527dc10213f219cff4e76e0fa929c97617e..cbab2d2c1624e64bb3845b4bd0df5f9d7f6c5501 100644 (file)
@@ -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);
 }
 
index e4c7e3f0a9f0d3183954b0c9ca1d725ddb723554..13d51dbf97c50aa72a734f1b62836b406c660ef1 100644 (file)
@@ -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;