]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
CVE-2020-25717 winbindd: call wb_parent_idmap_setup_send() in wb_queryuser_send()
authorRalph Boehme <slow@samba.org>
Tue, 31 Aug 2021 15:04:56 +0000 (17:04 +0200)
committerJule Anger <janger@samba.org>
Mon, 8 Nov 2021 09:52:09 +0000 (10:52 +0100)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14804

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
(cherry picked from commit 39c2ec72cb77945c3eb611fb1d7d7e9aad52bdfd)

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

(cherry picked from commit 7d1dd87a6538f8c7f1e4938b0ff52cbd231fff90)

source3/winbindd/wb_queryuser.c

index 9db51909c02c9c88ba5b0bb9ca862e5073af532f..f5bc96f03f668bc2d4a1e7d0e0c6e2b856c51397 100644 (file)
 
 struct wb_queryuser_state {
        struct tevent_context *ev;
-       struct wbint_userinfo *info;
+        struct wbint_userinfo *info;
+       const struct wb_parent_idmap_config *idmap_cfg;
        bool tried_dclookup;
 };
 
+static void wb_queryuser_idmap_setup_done(struct tevent_req *subreq);
 static void wb_queryuser_got_uid(struct tevent_req *subreq);
 static void wb_queryuser_got_domain(struct tevent_req *subreq);
 static void wb_queryuser_got_dc(struct tevent_req *subreq);
@@ -60,13 +62,35 @@ struct tevent_req *wb_queryuser_send(TALLOC_CTX *mem_ctx,
 
        sid_copy(&info->user_sid, user_sid);
 
+       subreq = wb_parent_idmap_setup_send(state, state->ev);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
+       }
+       tevent_req_set_callback(subreq, wb_queryuser_idmap_setup_done, req);
+        return req;
+}
+
+static void wb_queryuser_idmap_setup_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct wb_queryuser_state *state = tevent_req_data(
+               req, struct wb_queryuser_state);
+       NTSTATUS status;
+
+       status = wb_parent_idmap_setup_recv(subreq, &state->idmap_cfg);
+       TALLOC_FREE(subreq);
+       if (tevent_req_nterror(req, status)) {
+               return;
+       }
+
        subreq = wb_sids2xids_send(
                state, state->ev, &state->info->user_sid, 1);
        if (tevent_req_nomem(subreq, req)) {
-               return tevent_req_post(req, ev);
+               return;
        }
        tevent_req_set_callback(subreq, wb_queryuser_got_uid, req);
-       return req;
+       return;
 }
 
 static void wb_queryuser_got_uid(struct tevent_req *subreq)