]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:winbind:grent: don't stop group enumeration when a group has no gid
authorMichael Adam <obnox@samba.org>
Mon, 19 Jan 2015 12:51:55 +0000 (13:51 +0100)
committerKarolin Seeger <kseeger@samba.org>
Fri, 27 Mar 2015 22:11:15 +0000 (23:11 +0100)
simply continue with the next group

Note: this patch introduces some code duplication to make it
easier to create minimal backport patch. Subsequent patches
will provide some refactoring to reduce the duplication.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=8905

Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
(cherry picked from commit 24015224da1f363019d9d2da81ce533463a16abb)

source3/winbindd/wb_next_grent.c

index d3b03333585b53b8754b13940fb50b3e651ab719..d9323843b4b769736fecef54ada39e4b8be096a4 100644 (file)
@@ -168,9 +168,58 @@ static void wb_next_grent_getgrsid_done(struct tevent_req *subreq)
        status = wb_getgrsid_recv(subreq, talloc_tos(), &domname, &name,
                                  &state->gr->gr_gid, &state->members);
        TALLOC_FREE(subreq);
-       if (tevent_req_nterror(req, status)) {
+
+       if (NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) {
+               state->gstate->next_group += 1;
+
+               if (state->gstate->next_group >= state->gstate->num_groups) {
+                       TALLOC_FREE(state->gstate->groups);
+
+                       if (state->gstate->domain == NULL) {
+                               state->gstate->domain = domain_list();
+                       } else {
+                               state->gstate->domain = state->gstate->domain->next;
+                       }
+
+                       if ((state->gstate->domain != NULL) &&
+                           sid_check_is_our_sam(&state->gstate->domain->sid))
+                       {
+                               state->gstate->domain = state->gstate->domain->next;
+                       }
+
+                       if (state->gstate->domain == NULL) {
+                               tevent_req_nterror(req,
+                                                  NT_STATUS_NO_MORE_ENTRIES);
+                               return;
+                       }
+
+                       subreq = dcerpc_wbint_QueryGroupList_send(
+                               state, state->ev,
+                               dom_child_handle(state->gstate->domain),
+                               &state->next_groups);
+                       if (tevent_req_nomem(subreq, req)) {
+                               return;
+                       }
+
+                       tevent_req_set_callback(subreq,
+                                               wb_next_grent_fetch_done, req);
+                       return;
+               }
+
+               subreq = wb_getgrsid_send(
+                       state, state->ev,
+                       &state->gstate->groups[state->gstate->next_group].sid,
+                       state->max_nesting);
+               if (tevent_req_nomem(subreq, req)) {
+                       return;
+               }
+               tevent_req_set_callback(subreq, wb_next_grent_getgrsid_done,
+                                       req);
+               return;
+       } else if (tevent_req_nterror(req, status)) {
                return;
        }
+
        if (!fill_grent(talloc_tos(), state->gr, domname, name,
                        state->gr->gr_gid)) {
                DEBUG(5, ("fill_grent failed\n"));