The branch, v4-21-stable has been updated
       via  d67152765b3 VERSION: Disable GIT_SNAPSHOT for the 4.21.2 release.
       via  c8e1d816979 WHATSNEW: Add release notes for Samba 4.21.2.
       via  8da34956d68 ctdb-scripts: Track connections for all ports for 
public IPs
       via  53df2b78ae5 ctdb-scripts: Get connections after tickle list
       via  f5fc8aa709c ctdb-scripts: Move connection tracking to 10.interface
       via  c6c0722cb72 ctdb-server: Drop a log message to DEBUG level
       via  7791375ccca ctdb-server: Clean up connection tracking functions
       via  84deecc5e8e ctdb-scripts: Use ss -H option to simplify
       via  5920d47149c ctdb-scripts: Remove superseded compatibility code
       via  0a571a6dbe3 ctdb-scripts: update_tickles() should use the public 
IPs cache
       via  650ce39d63c ctdb-scripts: Don't list connections when not hosting 
IPs
       via  6afa2ce5dc2 smbd: avoid a panic in close_directory()
       via  0c3379c5bd8 examples:winexe: Initialize Trustee.ptstrName at the 
right time
       via  193dc02471b libcli/auth: make use of 
netlogon_creds_cli_check_transport() in more places
       via  f444707208c libcli/auth: split out 
netlogon_creds_cli_check_transport()
       via  97c1456157a libcli/auth: let netlogon_creds_copy() copy all scalar 
elements
       via  10e8e230e7b s4:librpc/rpc: make use of 
netlogon_creds_client_verify()
       via  4fb7226f776 libcli/auth: make use of netlogon_creds_client_verify()
       via  bd5058538cc libcli/auth: split out netlogon_creds_client_verify() 
that takes auth_{type,level}
       via  1edb984810b libcli/auth: pass auth_{type,level} to 
netlogon_creds_server_step_check()
       via  15fad537ca5 libcli/auth: pass auth_{type,level} to 
schannel_check_creds_state()
       via  57b897276ca libcli/auth: return INVALID_PARAMETER for DES in 
netlogon_creds_{de,en}crypt_samlogon_logon
       via  f93fc1e65cb s4:rpc_server/netlogon: make use of 
netlogon_creds_decrypt_SendToSam
       via  9f36351814a s4:rpc_server/netlogon: make use of 
netlogon_creds_decrypt_samr_CryptPassword
       via  51dca749dd5 s4:rpc_server/netlogon: make use of 
netlogon_creds_{de,en}crypt_samr_Password()
       via  9b2c2de4bf9 s3:rpc_server/netlogon: make use of 
netlogon_creds_decrypt_samr_CryptPassword()
       via  cedcfa310b9 s3:rpc_server/netlogon: make use of 
netlogon_creds_{de,en}crypt_samr_Password
       via  fea3d0c5810 s4:torture/rpc: make use of 
netlogon_creds_{de,en}crypt_samr_Password
       via  a8e5bbb2689 s4:torture/rpc: make use of 
netlogon_creds_encrypt_samr_CryptPassword()
       via  c944d1fc372 s4:torture/rpc: make use of 
netlogon_creds_decrypt_samlogon_validation()
       via  7664466f8be s4:torture/rpc: make use of 
netlogon_creds_encrypt_samlogon_logon()
       via  423ee427b2d libcli/auth: make use of 
netlogon_creds_{de,en}crypt_samr_Password
       via  c39ab113afd libcli/auth: make use of 
netlogon_creds_encrypt_SendToSam
       via  44803568fce libcli/auth: make use of 
netlogon_creds_encrypt_samr_CryptPassword
       via  104dd940b80 libcli/auth: make 
netlogon_creds_des_{de,en}crypt_LMKey() static
       via  986e85311b1 python/tests: use encrypt_netr_PasswordInfo in 
KDCBaseTest._test_samlogon()
       via  16486fc89e9 pycredentials: add py_creds_encrypt_netr_PasswordInfo 
helper
       via  63cd352ce46 pycredentials: make use of 
netlogon_creds_encrypt_samr_CryptPassword in 
py_creds_encrypt_netr_crypt_password
       via  1942021a04b libcli/auth: add netlogon_creds_{de,en}crypt_SendToSam()
       via  a67f23403d5 libcli/auth: add 
netlogon_creds_{de,en}crypt_samr_CryptPassword()
       via  ee30900ecef libcli/auth: add 
netlogon_creds_{de,en}crypt_samr_Password()
       via  4da8ed66be9 libcli/auth: pass auth_{type,level} to 
netlogon_creds_{de,en}crypt_samlogon_logon()
       via  44109378880 libcli/auth: pass auth_{type,level} to 
netlogon_creds_{de,en}crypt_samlogon_validation()
       via  553db707b57 netlogon.idl: add netr_ServerAuthenticateKerberos() and 
related stuff
       via  2a210ec5c40 s3:rpc_server: add DCESRV_COMPAT_NOT_USED_ON_WIRE() 
helper macro
       via  c7166d2d612 dcesrv_core: add DCESRV_NOT_USED_ON_WIRE() helper macro
       via  30d744d0a6a s4:rpc_server/netlogon: split out 
dcesrv_netr_ServerAuthenticateGeneric()
       via  769588b25a7 s4:dsdb/common: dsdb_trust_get_incoming_passwords only 
needs a const ldb_message
       via  d7b7db05fd2 libcli/auth: split out netlogon_creds_alloc()
       via  57c1fb9048c libcli/auth: let netlogon_creds_cli_store_internal 
check netlogon_creds_CredentialState_legacy
       via  dcd3c2b9d2b libcli/auth: let netlogon_creds_cli_store_internal() 
use talloc_stackframe()
       via  46b7eb7737b libcli/auth: also use 
netlogon_creds_CredentialState_extra_info for the client
       via  ef69f555566 s4:torture/rpc: let test_netlogon_capabilities() fail 
on legacy servers
       via  1fecabddeb6 s4:rpc_server/netlogon: implement 
netr_LogonGetCapabilities query_level=2
       via  47e5aa1e36e s3:rpc_server/netlogon: implement 
netr_LogonGetCapabilities query_level=2
       via  c6bfa4dbb25 libcli/auth: remember client_requested_flags and 
auth_time in netlogon_creds_server_init()
       via  a0ad07e82f0 libcli/auth: remove unused creds->sid
       via  72be93b62f3 s4:rpc_server/netlogon: make use of 
creds->ex->client_sid
       via  39399a49d36 s3:rpc_server/netlogon: make use of 
creds->ex->client_sid
       via  114e369122c librpc/rpc: make use of creds->ex->client_sid in 
dcesrv_netr_check_schannel_get_state()
       via  58f657baf09 libcli/auth: split out 
netlogon_creds_CredentialState_extra_info
       via  1a6928892a9 libcli/auth: pass client_sid to 
netlogon_creds_server_init()
       via  e03e2f7639f s4:rpc_server/netlogon: add client_sid helper variables
       via  d197dd522f3 s3:rpc_server/netlogon: add client_sid helper variables
       via  f4edcf3d0ea s4:dsdb/common: samdb_confirm_rodc_allowed_to_repl_to() 
only needs a const sid
       via  b5bf7bc3810 s3:cli_netlogon: let rpccli_connect_netlogon() use 
force_reauth = true on retry
       via  c2796abfdc2 s4:torture/rpc/netlogon: adjust 
test_netlogon_capabilities query_level=2 to request_flags
       via  83e9f281ca4 s4:librpc/rpc: use netr_LogonGetCapabilities 
query_level=2 to verify the proposed capabilities
       via  5c7301f799f s4:librpc/rpc: define required schannel flags and 
enforce them
       via  41be718d655 s4:librpc/rpc: don't allow any unexpected upgrades of 
negotiate_flags
       via  59d8a8715de s4:librpc/rpc: do LogonControl after 
LogonGetCapabilities downgrade
       via  9265852ec70 libcli/auth: use netr_LogonGetCapabilities 
query_level=2 to verify the proposed capabilities
       via  ea1bb195859 libcli/auth: use a LogonControl after a 
LogonGetCapabilities downgrade
       via  d73e6c7ab08 libcli/auth: if we require aes we don't need to require 
arcfour nor strong key
       via  48acce5da8f libcli/auth: don't allow any unexpected upgrades of 
negotiate_flags
       via  6f1d556b407 libcli/auth: make use of 
netlogon_creds_cli_store_internal() in netlogon_creds_cli_auth_srvauth_done()
       via  ced6cbfa6b1 libcli/auth: remove unused 
netlogon_creds_client_init_session_key()
       via  8cf7bf9f615 netlogon.idl: the capabilities in query_level=2 are the 
ones send by the client
       via  349f3144883 s4:rpc_server/netlogon: if we require AES there's no 
need to remove the ARCFOUR flag
       via  6916bf43d3f s3:rpc_server/netlogon: if we require AES there's no 
need to remove the ARCFOUR flag
       via  a442241004e s3:rpc_server/netlogon: correctly negotiate flags in 
ServerAuthenticate2/3
       via  0267772cdf2 s4:torture/rpc: without weak crypto we should require 
AES
       via  a65ca95d4d2 s4:torture/rpc: check that DOWNGRADE_DETECTED has no 
bits negotiated
       via  d41a1dbc0bf s3:winbindd: call process_set_title() for locator child
       via  00e1c97fee9 third_party/heimdal: Import 
lorikeet-heimdal-202410161454 (commit 0d61538a16b5051c820702f0711102112cd01a83)
       via  a7ea9b5026f smbd: fix sharing access check for directories
       via  5c3e5377fe6 smbd: fix share access check for overwrite dispostions
       via  66c09de1f30 smbtorture: add subtests for overwrite dispositions vs 
sharemodes
       via  88caf2c0911 smbtorture: fix smb2.notify.mask test
       via  a2ee15f58de smbtorture: prepare test_overwrite_read_only_file() for 
more subtests
       via  27e364a4933 dcesrv_core: better fault codes 
dcesrv_auth_prepare_auth3()
       via  4b60c66a9e7 dcesrv_core: fix the auth3 for large ntlmssp messages
       via  dae81f45a37 gensec:spnego: ignore trailing bytes in 
SPNEGO_SERVER_START state
       via  f18b49489f1 gensec:ntlmssp: only allow messages up to 2888 bytes
       via  657953d8e48 dcesrv_core: alter_context logon failures should result 
in DCERPC_FAULT_ACCESS_DENIED
       via  aa0e68958cc dcesrv_core: a failure from gensec_update results in 
NAK_REASON_INVALID_CHECKSUM
       via  f27161ef539 dcerpc_util: let dcerpc_pull_auth_trailer() ignore 
data_and_pad for bind, alter, auth3
       via  178e654eca1 dcerpc_util: let dcerpc_pull_auth_trailer() expose the 
reject reason
       via  5740e9daadc dcerpc_util: let dcerpc_pull_auth_trailer() check that 
auth_offset is 4 bytes aligned
       via  a91d040b859 tests/dcerpc/raw_protocol: test invalid schannel binds
       via  8add039c0bc tests/dcerpc/raw_protocol: add more tests for auth_pad 
alignment
       via  68ade99138d tests/dcerpc/raw_protocol: add tests for max 
auth_padding, auth_len or auth_offset
       via  b019eb56d69 tests/dcerpc/raw_protocol: fix comment in 
test_spnego_change_auth_type1
       via  5fbb57e0dd5 tests/dcerpc/raw_protocol: test_no_auth_ctx_request
       via  058328859c7 dcesrv_core: introduce 
dcesrv_connection->transport_max_recv_frag
       via  80129a9b077 tests/dcerpc/raw_protocol: run test_neg_xmit_ffff_ffff 
over tcp and smb
       via  2553c9aeded dcesrv_core: add more verbose debugging for missing 
association groups
       via  465bcb60550 RawDCERPCTest: add some more auth_length related asserts
       via  fcbb5243d5a RawDCERPCTest: split prepare_pdu() and send_pdu_blob() 
out of send_pdu()
       via  82ce898457b s4:librpc: provide py_schannel bindings
       via  bea355c2316 dcerpc_util: don't allow auth_padding for BIND, 
ALTER_CONTEXT and AUTH3 pdus
       via  79d8431c864 tests/dcerpc/raw_protocol: add more test for auth 
padding during ALTER_CONTEXT/AUTH3
       via  cbcd11f2fb2 dcesrv_core: return 
NAK_REASON_PROTOCOL_VERSION_NOT_SUPPORTED for binds without contexts
       via  346dab391d6 dcesrv_core: disconnect after a fault with non 
AUTH_LEVEL_CONNECT bind
       via  b56c35c3366 s4:selftest: only run ad_member with 
AUTH_LEVEL_CONNECT_LSA=1
       via  c0f40a78313 tests/dcerpc/raw_protocol: pass against Windows 2022 
and require special env vars for legacy servers
       via  9e35e26e038 RawDCERPCTest: ignore errors in smb_pipe_socket.close()
       via  189e4e8b262 s4:tortore/rpc: let rpc.backupkey without privacy pass 
against Windows 2022
       via  53cf535b450 VERSION: Bump version up to Samba 4.21.2...
      from  654d41a19c2 VERSION: Disable GIT_SNAPSHOT for the 4.21.1 release.

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-21-stable


- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 VERSION                                       |    2 +-
 WHATSNEW.txt                                  |   58 +-
 auth/credentials/pycredentials.c              |   92 +-
 auth/gensec/spnego.c                          |   24 +-
 auth/ntlmssp/ntlmssp.c                        |    9 +
 auth/ntlmssp/ntlmssp_client.c                 |    6 -
 auth/ntlmssp/ntlmssp_server.c                 |    6 -
 ctdb/config/events/legacy/10.interface.script |    2 +
 ctdb/config/events/legacy/60.nfs.script       |    1 -
 ctdb/config/functions                         |   52 +-
 ctdb/server/ctdb_takeover.c                   |  108 +-
 examples/winexe/winexesvc.c                   |    3 +-
 libcli/auth/credentials.c                     |  358 ++++--
 libcli/auth/libcli_auth.h                     |    1 +
 libcli/auth/netlogon_creds_cli.c              |  744 +++++++-----
 libcli/auth/proto.h                           |   59 +-
 libcli/auth/schannel_state.h                  |    2 +
 libcli/auth/schannel_state_tdb.c              |   15 +-
 librpc/idl/netlogon.idl                       |   33 +-
 librpc/idl/schannel.idl                       |   73 +-
 librpc/idl/wscript_build                      |    2 +-
 librpc/rpc/dcerpc_util.c                      |   75 +-
 librpc/rpc/dcesrv_auth.c                      |   71 +-
 librpc/rpc/dcesrv_core.c                      |  107 +-
 librpc/rpc/dcesrv_core.h                      |   10 +
 librpc/rpc/server/netlogon/schannel_util.c    |    6 +-
 python/samba/tests/dcerpc/raw_protocol.py     | 1555 ++++++++++++++++++++++---
 python/samba/tests/dcerpc/raw_testcase.py     |   52 +-
 python/samba/tests/krb5/kdc_base_test.py      |   10 +-
 selftest/expectedfail.d/ntlm-auth             |    4 +
 selftest/expectedfail.d/samba4.rpc.backupkey  |   28 +
 selftest/target/Samba4.pm                     |    1 -
 source3/rpc_client/cli_netlogon.c             |    1 +
 source3/rpc_server/netlogon/srv_netlog_nt.c   |  169 ++-
 source3/rpc_server/rpc_pipes.h                |    6 +
 source3/smbd/close.c                          |    4 +-
 source3/smbd/open.c                           |    7 +-
 source3/winbindd/winbindd_dual.c              |    2 +
 source3/winbindd/winbindd_locator.c           |    9 +
 source3/winbindd/winbindd_proto.h             |    1 +
 source4/dsdb/common/rodc_helper.c             |    2 +-
 source4/dsdb/common/util_trusts.c             |    2 +-
 source4/librpc/rpc/dcerpc_schannel.c          |  333 +++++-
 source4/librpc/wscript_build                  |    7 +
 source4/rpc_server/netlogon/dcerpc_netlogon.c |  343 ++++--
 source4/selftest/tests.py                     |   14 +-
 source4/torture/ntp/ntp_signd.c               |    1 +
 source4/torture/rpc/backupkey.c               |   80 +-
 source4/torture/rpc/forest_trust.c            |   17 +-
 source4/torture/rpc/lsa.c                     |   21 +-
 source4/torture/rpc/netlogon.c                |  194 ++-
 source4/torture/rpc/netlogon_crypto.c         |    7 +-
 source4/torture/rpc/remote_pac.c              |   42 +-
 source4/torture/rpc/samba3rpc.c               |   19 +-
 source4/torture/rpc/samlogon.c                |   38 +-
 source4/torture/rpc/samr.c                    |   21 +-
 source4/torture/rpc/schannel.c                |   85 +-
 source4/torture/smb2/acls.c                   |  124 +-
 source4/torture/smb2/notify.c                 |   34 +-
 third_party/heimdal/lib/gssapi/krb5/8003.c    |   10 +
 60 files changed, 4105 insertions(+), 1057 deletions(-)
 create mode 100644 selftest/expectedfail.d/samba4.rpc.backupkey


Changeset truncated at 500 lines:

diff --git a/VERSION b/VERSION
index 5ccd19a89c2..e34c965aa18 100644
--- a/VERSION
+++ b/VERSION
@@ -27,7 +27,7 @@ SAMBA_COPYRIGHT_STRING="Copyright Andrew Tridgell and the 
Samba Team 1992-2024"
 ########################################################
 SAMBA_VERSION_MAJOR=4
 SAMBA_VERSION_MINOR=21
-SAMBA_VERSION_RELEASE=1
+SAMBA_VERSION_RELEASE=2
 
 ########################################################
 # If a official release has a serious bug              #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index e6db953bedc..4f3ff92965b 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,3 +1,58 @@
+                   ==============================
+                   Release Notes for Samba 4.21.2
+                         November 25, 2024
+                   ==============================
+
+
+This is the latest stable release of the Samba 4.21 release series.
+
+
+Changes since 4.21.1
+--------------------
+
+o  Ralph Boehme <s...@samba.org>
+   * BUG 15732: smbd fails to correctly check sharemode against OVERWRITE
+     dispositions.
+   * BUG 15754: Panic in close_directory.
+
+o  Pavel Filipenský <pfilipen...@samba.org>
+   * BUG 15752: winexe no longer works with samba 4.21.
+
+o  Stefan Metzmacher <me...@samba.org>
+   * BUG 14356: protocol error - Unclear debug message "pad length mismatch" 
for
+     invalid bind packet.
+   * BUG 15425: NetrGetLogonCapabilities QueryLevel 2 needs to be implemented.
+   * BUG 15740: gss_accept_sec_context() from Heimdal does not imply
+     GSS_C_MUTUAL_FLAG with GSS_C_DCE_STYLE.
+   * BUG 15749: winbindd should call process_set_title() for locator child.
+
+o  Martin Schwenke <mschwe...@ddn.com>
+   * BUG 15320: Update CTDB to track all TCP connections to public IP 
addresses.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical:matrix.org matrix room, or
+#samba-technical IRC channel on irc.libera.chat.
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored.  All bug reports should
+be filed under the Samba 4.1 and newer product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
                    ==============================
                    Release Notes for Samba 4.21.1
                           October 14, 2024
@@ -68,8 +123,7 @@ database (https://bugzilla.samba.org/).
 ======================================================================
 
 
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
                    ==============================
                    Release Notes for Samba 4.21.0
                          September 02, 2024
diff --git a/auth/credentials/pycredentials.c b/auth/credentials/pycredentials.c
index 8008bd0418d..b123c2e986a 100644
--- a/auth/credentials/pycredentials.c
+++ b/auth/credentials/pycredentials.c
@@ -1074,9 +1074,11 @@ static PyObject *py_creds_get_old_kerberos_key(PyObject 
*self, PyObject *args)
 static PyObject *py_creds_encrypt_netr_crypt_password(PyObject *self,
                                                      PyObject *args)
 {
-       DATA_BLOB data = data_blob_null;
        struct cli_credentials    *creds  = NULL;
        struct netr_CryptPassword *pwd    = NULL;
+       struct samr_CryptPassword spwd;
+       enum dcerpc_AuthType auth_type = DCERPC_AUTH_TYPE_NONE;
+       enum dcerpc_AuthLevel auth_level = DCERPC_AUTH_LEVEL_NONE;
        NTSTATUS status;
        PyObject *py_cp = Py_None;
 
@@ -1100,9 +1102,18 @@ static PyObject 
*py_creds_encrypt_netr_crypt_password(PyObject *self,
                /* pytalloc_get_type sets TypeError */
                return NULL;
        }
-       data.length = sizeof(struct netr_CryptPassword);
-       data.data   = (uint8_t *)pwd;
-       status = netlogon_creds_session_encrypt(creds->netlogon_creds, data);
+
+       memcpy(spwd.data, pwd->data, 512);
+       PUSH_LE_U32(spwd.data, 512, pwd->length);
+
+       status = 
netlogon_creds_encrypt_samr_CryptPassword(creds->netlogon_creds,
+                                                          &spwd,
+                                                          auth_type,
+                                                          auth_level);
+
+       memcpy(pwd->data, spwd.data, 512);
+       pwd->length = PULL_LE_U32(spwd.data, 512);
+       ZERO_STRUCT(spwd);
 
        PyErr_NTSTATUS_IS_ERR_RAISE(status);
 
@@ -1151,6 +1162,68 @@ static PyObject *py_creds_encrypt_samr_password(PyObject 
*self,
        Py_RETURN_NONE;
 }
 
+static PyObject *py_creds_encrypt_netr_PasswordInfo(PyObject *self,
+                                                   PyObject *args,
+                                                   PyObject *kwargs)
+{
+       const char * const kwnames[] = {
+               "info",
+               "auth_type",
+               "auth_level",
+               NULL
+       };
+       struct cli_credentials *creds = NULL;
+       PyObject *py_info = Py_None;
+       enum netr_LogonInfoClass level = NetlogonInteractiveInformation;
+       union netr_LogonLevel logon = { .password = NULL, };
+       uint8_t auth_type = DCERPC_AUTH_TYPE_NONE;
+       uint8_t auth_level = DCERPC_AUTH_LEVEL_NONE;
+       NTSTATUS status;
+       bool ok;
+
+       creds = PyCredentials_AsCliCredentials(self);
+       if (creds == NULL) {
+               PyErr_Format(PyExc_TypeError, "Credentials expected");
+               return NULL;
+       }
+
+       if (creds->netlogon_creds == NULL) {
+               PyErr_Format(PyExc_ValueError, "NetLogon credentials not set");
+               return NULL;
+       }
+
+       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Obb",
+                                        discard_const_p(char *, kwnames),
+                                        &py_info, &auth_type, &auth_level))
+       {
+               return NULL;
+       }
+
+       ok = py_check_dcerpc_type(py_info,
+                                 "samba.dcerpc.netlogon",
+                                 "netr_PasswordInfo");
+       if (!ok) {
+               /* py_check_dcerpc_type sets TypeError */
+               return NULL;
+       }
+
+       logon.password = pytalloc_get_type(py_info, struct netr_PasswordInfo);
+       if (logon.password == NULL) {
+               /* pytalloc_get_type sets TypeError */
+               return NULL;
+       }
+
+       status = netlogon_creds_encrypt_samlogon_logon(creds->netlogon_creds,
+                                                      level,
+                                                      &logon,
+                                                      auth_type,
+                                                      auth_level);
+
+       PyErr_NTSTATUS_IS_ERR_RAISE(status);
+
+       Py_RETURN_NONE;
+}
+
 static PyObject *py_creds_get_smb_signing(PyObject *self, PyObject *unused)
 {
        enum smb_signing_setting signing_state;
@@ -1684,6 +1757,17 @@ static PyMethodDef py_creds_methods[] = {
                            "the negotiated encryption algorithm in place\n"
                            "i.e. it overwrites the original data"
        },
+       {
+               .ml_name  = "encrypt_netr_PasswordInfo",
+               .ml_meth  = PY_DISCARD_FUNC_SIG(PyCFunction,
+                                       py_creds_encrypt_netr_PasswordInfo),
+               .ml_flags = METH_VARARGS | METH_KEYWORDS,
+               .ml_doc   = "S.encrypt_netr_PasswordInfo(info, "
+                           "auth_type, auth_level) -> None\n"
+                           "Encrypt the supplied password info using the 
session key and\n"
+                           "the negotiated encryption algorithm in place\n"
+                           "i.e. it overwrites the original data"
+       },
        {
                .ml_name  = "get_smb_signing",
                .ml_meth  = py_creds_get_smb_signing,
diff --git a/auth/gensec/spnego.c b/auth/gensec/spnego.c
index 378ba3402c4..741d85b9a5e 100644
--- a/auth/gensec/spnego.c
+++ b/auth/gensec/spnego.c
@@ -1758,6 +1758,7 @@ static NTSTATUS gensec_spnego_update_in(struct 
gensec_security *gensec_security,
                                        const DATA_BLOB in, TALLOC_CTX *mem_ctx,
                                        DATA_BLOB *full_in)
 {
+       DATA_BLOB consume = data_blob_null;
        struct spnego_state *spnego_state =
                talloc_get_type_abort(gensec_security->private_data,
                struct spnego_state);
@@ -1824,17 +1825,26 @@ static NTSTATUS gensec_spnego_update_in(struct 
gensec_security *gensec_security,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
+       consume = in;
        expected = spnego_state->in_needed - spnego_state->in_frag.length;
-       if (in.length > expected) {
+       if (consume.length > expected) {
+               if (spnego_state->state_position != SPNEGO_SERVER_START) {
+                       /*
+                        * we got more than expected
+                        */
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
+
                /*
-                * we got more than expected
+                * In SPNEGO_SERVER_START we need to ignore unexpected
+                * bytes at the end.
                 */
-               return NT_STATUS_INVALID_PARAMETER;
+               consume.length = expected;
        }
 
-       if (in.length == spnego_state->in_needed) {
+       if (consume.length == spnego_state->in_needed) {
                /*
-                * if the in.length contains the full blob
+                * if the consume.length contains the full blob
                 * we are done.
                 *
                 * Note: this implies spnego_state->in_frag.length == 0,
@@ -1842,13 +1852,13 @@ static NTSTATUS gensec_spnego_update_in(struct 
gensec_security *gensec_security,
                 *       because we already know that we did not get
                 *       more than expected.
                 */
-               *full_in = in;
+               *full_in = consume;
                spnego_state->in_needed = 0;
                return NT_STATUS_OK;
        }
 
        ok = data_blob_append(spnego_state, &spnego_state->in_frag,
-                             in.data, in.length);
+                             consume.data, consume.length);
        if (!ok) {
                return NT_STATUS_NO_MEMORY;
        }
diff --git a/auth/ntlmssp/ntlmssp.c b/auth/ntlmssp/ntlmssp.c
index 745f2628d21..c9360a5fa2d 100644
--- a/auth/ntlmssp/ntlmssp.c
+++ b/auth/ntlmssp/ntlmssp.c
@@ -36,6 +36,8 @@ struct auth_session_info;
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_AUTH
 
+#define NTLMSSP_MAX_UPDATE_SIZE 2888
+
 /**
  * Callbacks for NTLMSSP - for both client and server operating modes
  *
@@ -136,6 +138,13 @@ static NTSTATUS gensec_ntlmssp_update_find(struct 
gensec_security *gensec_securi
                }
        }
 
+       if (input.length > NTLMSSP_MAX_UPDATE_SIZE) {
+               DBG_WARNING("reject large command=%u message, length %zu > 
%u)\n",
+                           ntlmssp_command, input.length,
+                           NTLMSSP_MAX_UPDATE_SIZE);
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
        if (ntlmssp_command != gensec_ntlmssp->ntlmssp_state->expected_state) {
                DEBUG(2, ("got NTLMSSP command %u, expected %u\n", 
ntlmssp_command,
                          gensec_ntlmssp->ntlmssp_state->expected_state));
diff --git a/auth/ntlmssp/ntlmssp_client.c b/auth/ntlmssp/ntlmssp_client.c
index a50ff661f5f..8c2a1f9c0aa 100644
--- a/auth/ntlmssp/ntlmssp_client.c
+++ b/auth/ntlmssp/ntlmssp_client.c
@@ -142,12 +142,6 @@ NTSTATUS gensec_ntlmssp_resume_ccache(struct 
gensec_security *gensec_security,
 
        /* parse the NTLMSSP packet */
 
-       if (in.length > UINT16_MAX) {
-               DEBUG(1, ("%s: reject large request of length %u\n",
-                       __func__, (unsigned int)in.length));
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
        ok = msrpc_parse(ntlmssp_state, &in, "Cdd",
                         "NTLMSSP",
                         &ntlmssp_command,
diff --git a/auth/ntlmssp/ntlmssp_server.c b/auth/ntlmssp/ntlmssp_server.c
index 1e49379a8ed..2e25c4efab5 100644
--- a/auth/ntlmssp/ntlmssp_server.c
+++ b/auth/ntlmssp/ntlmssp_server.c
@@ -124,12 +124,6 @@ NTSTATUS gensec_ntlmssp_server_negotiate(struct 
gensec_security *gensec_security
 #endif
 
        if (request.length) {
-               if (request.length > UINT16_MAX) {
-                       DEBUG(1, ("ntlmssp_server_negotiate: reject large 
request of length %u\n",
-                               (unsigned int)request.length));
-                       return NT_STATUS_INVALID_PARAMETER;
-               }
-
                if ((request.length < 16) || !msrpc_parse(ntlmssp_state, 
&request, "Cdd",
                                                          "NTLMSSP",
                                                          &ntlmssp_command,
diff --git a/ctdb/config/events/legacy/10.interface.script 
b/ctdb/config/events/legacy/10.interface.script
index fdc559ee1c8..dfd796563fd 100755
--- a/ctdb/config/events/legacy/10.interface.script
+++ b/ctdb/config/events/legacy/10.interface.script
@@ -247,6 +247,8 @@ ipreallocated)
 
 monitor)
        monitor_interfaces || exit 1
+
+       update_tickles
        ;;
 esac
 
diff --git a/ctdb/config/events/legacy/60.nfs.script 
b/ctdb/config/events/legacy/60.nfs.script
index 246a856bca8..7d03a2a50f2 100755
--- a/ctdb/config/events/legacy/60.nfs.script
+++ b/ctdb/config/events/legacy/60.nfs.script
@@ -338,7 +338,6 @@ monitor)
                        exit $?
        fi
 
-       update_tickles 2049
        nfs_update_lock_info
 
        nfs_check_services
diff --git a/ctdb/config/functions b/ctdb/config/functions
index ef79dbf2162..4139059a3d3 100755
--- a/ctdb/config/functions
+++ b/ctdb/config/functions
@@ -499,7 +499,7 @@ ctdb_check_unix_socket()
                return 1
        fi
 
-       _out=$(ss -l -x "src ${_sockpath}" | tail -n +2)
+       _out=$(ss -l -xH "src ${_sockpath}")
        if [ -z "$_out" ]; then
                echo "ERROR: ${service_name} not listening on ${_sockpath}"
                return 1
@@ -602,7 +602,7 @@ get_tcp_connections_for_ip()
 {
        _ip="$1"
 
-       ss -tn state established "src [$_ip]" | awk 'NR > 1 {print $3, $4}'
+       ss -tnH state established "src [$_ip]" | awk '{print $3, $4}'
 }
 
 ########################################################
@@ -1176,49 +1176,39 @@ nfs_callout()
 
 update_tickles()
 {
-       _port="$1"
-
        tickledir="${CTDB_SCRIPT_VARDIR}/tickles"
        mkdir -p "$tickledir"
 
-       # What public IPs do I hold?
-       _pnn=$(ctdb_get_pnn)
-       _ips=$($CTDB -X ip | awk -F'|' -v pnn="$_pnn" '$3 == pnn {print $2}')
+       # If not hosting any public IPs then can't have any connections...
+       if [ ! -s "$CTDB_MY_PUBLIC_IPS_CACHE" ]; then
+               return
+       fi
 
-       # IPs and port as ss filters
+       # IPs ss filter
        _ip_filter=""
-       for _ip in $_ips; do
+       while read -r _ip; do
                _ip_filter="${_ip_filter}${_ip_filter:+ || }src [${_ip}]"
-       done
-       _port_filter="sport == :${_port}"
+       done <"$CTDB_MY_PUBLIC_IPS_CACHE"
+
+       # Record our current tickles in a temporary file
+       _my_tickles="${tickledir}/all.tickles.$$"
+       while read -r _i; do
+               $CTDB -X gettickles "$_i" |
+                       awk -F'|' 'NR > 1 { printf "%s:%s %s:%s\n", $2, $3, $4, 
$5 }'
+       done <"$CTDB_MY_PUBLIC_IPS_CACHE" |
+               sort >"$_my_tickles"
 
        # Record connections to our public IPs in a temporary file.
        # This temporary file is in CTDB's private state directory and
        # $$ is used to avoid a very rare race involving CTDB's script
        # debugging.  No security issue, nothing to see here...
-       _my_connections="${tickledir}/${_port}.connections.$$"
-       # Parentheses are needed around the filters for precedence but
+       _my_connections="${tickledir}/all.connections.$$"
+       # Parentheses are needed around the IP filter for precedence but
        # the parentheses can't be empty!
-       #
-       # Recent versions of ss print square brackets around IPv6
-       # addresses.  While it is desirable to update CTDB's address
-       # parsing and printing code, something needs to be done here
-       # for backward compatibility, so just delete the brackets.
-       ss -tn state established \
-               "${_ip_filter:+( ${_ip_filter} )}" \
-               "${_port_filter:+( ${_port_filter} )}" |
-               awk 'NR > 1 {print $4, $3}' |
-               tr -d '][' |
+       ss -tnH state established "${_ip_filter:+( ${_ip_filter} )}" |
+               awk '{print $4, $3}' |
                sort >"$_my_connections"
 
-       # Record our current tickles in a temporary file
-       _my_tickles="${tickledir}/${_port}.tickles.$$"
-       for _i in $_ips; do
-               $CTDB -X gettickles "$_i" "$_port" |
-                       awk -F'|' 'NR > 1 { printf "%s:%s %s:%s\n", $2, $3, $4, 
$5 }'
-       done |
-               sort >"$_my_tickles"
-
        # Add tickles for connections that we haven't already got tickles for
        comm -23 "$_my_connections" "$_my_tickles" |
                $CTDB addtickle
diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c
index 2176c6ab806..ad543452e62 100644
--- a/ctdb/server/ctdb_takeover.c
+++ b/ctdb/server/ctdb_takeover.c
@@ -1504,27 +1504,40 @@ static struct ctdb_connection *ctdb_tcp_find(struct 
ctdb_tcp_array *array,
   clients managing that should tickled with an ACK when IP takeover is
   done
  */
-int32_t ctdb_control_tcp_add(struct ctdb_context *ctdb, TDB_DATA indata, bool 
tcp_update_needed)
+int32_t ctdb_control_tcp_add(struct ctdb_context *ctdb,
+                            TDB_DATA indata,
+                            bool tcp_update_needed)
 {
        struct ctdb_connection *p = (struct ctdb_connection *)indata.dptr;
        struct ctdb_tcp_array *tcparray;
        struct ctdb_connection tcp;
        struct ctdb_vnn *vnn;
+       char conn_str[132] = { 0, };
+       int ret;
 
        /* If we don't have public IPs, tickles are useless */
        if (ctdb->vnn == NULL) {
                return 0;
        }
 
+       ret = ctdb_connection_to_buf(conn_str,
+                                    sizeof(conn_str),
+                                    p,
+                                    false,
+                                    " -> ");
+       if (ret != 0) {
+               strlcpy(conn_str, "UNKNOWN", sizeof(conn_str));
+       }
+
        vnn = find_public_ip_vnn(ctdb, &p->dst);
        if (vnn == NULL) {
-               DEBUG(DEBUG_INFO,(__location__ " got TCP_ADD control for an 
address which is not a public address '%s'\n",
-                       ctdb_addr_to_str(&p->dst)));
+               DBG_INFO("Attempt to add connection %s "
+                        "but destination is not a public address\n",
+                        conn_str);
 
                return -1;
        }
 
-
        tcparray = vnn->tcp_array;
 
        /* If this is the first tickle */
@@ -1534,7 +1547,8 @@ int32_t ctdb_control_tcp_add(struct ctdb_context *ctdb, 
TDB_DATA indata, bool tc
                vnn->tcp_array = tcparray;


-- 
Samba Shared Repository

Reply via email to