]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s4:librpc/rpc: don't allow any unexpected upgrades of negotiate_flags
authorStefan Metzmacher <metze@samba.org>
Wed, 2 Oct 2024 14:44:26 +0000 (16:44 +0200)
committerJule Anger <janger@samba.org>
Wed, 13 Nov 2024 10:39:11 +0000 (10:39 +0000)
Only remove the unsupported flags from local_negotiate_flags for
the next try...

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

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
(cherry picked from commit 69b0cbd13d06fa640a900acab6757425b5b77cac)

source4/librpc/rpc/dcerpc_schannel.c

index 3f69b849bb8d0e2ad0361042d4f1b2c15a15c173..4e237d841f268b35ddf156323b016c7ce68bc7c8 100644 (file)
@@ -243,6 +243,14 @@ static void continue_srv_auth2(struct tevent_req *subreq)
                uint32_t rf = s->remote_negotiate_flags;
                const char *rn = NULL;
 
+               if ((lf & rf) == lf) {
+                       /*
+                        * without a change in flags
+                        * there's no need to retry...
+                        */
+                       s->dcerpc_schannel_auto = false;
+               }
+
                if (!s->dcerpc_schannel_auto) {
                        composite_error(c, s->a.out.result);
                        return;
@@ -277,7 +285,7 @@ static void continue_srv_auth2(struct tevent_req *subreq)
                          "and retry! local[0x%08X] remote[0x%08X]\n",
                          ln, rn, lf, rf));
 
-               s->local_negotiate_flags = s->remote_negotiate_flags;
+               s->local_negotiate_flags &= s->remote_negotiate_flags;
 
                generate_random_buffer(s->credentials1.data,
                                       sizeof(s->credentials1.data));
@@ -292,14 +300,14 @@ static void continue_srv_auth2(struct tevent_req *subreq)
                return;
        }
 
-       s->creds->negotiate_flags = s->remote_negotiate_flags;
-
        /* verify credentials */
        if (!netlogon_creds_client_check(s->creds, s->a.out.return_credentials)) {
                composite_error(c, NT_STATUS_UNSUCCESSFUL);
                return;
        }
 
+       s->creds->negotiate_flags &= s->remote_negotiate_flags;
+
        composite_done(c);
 }