The branch, v4-23-test has been updated
via 1fe870aa4c8 WHATSNEW: unify format
via cd46d6f2bd8 WHATSNEW: add Initial version of smb_prometheus_endpoint
via 601e0e2c744 WHATSNEW: add Modern write time update logic
via 1757f22046d WHATSNEW: add SMB3 Unix Extensions
via fb9a042dab9 WHATSNEW: add support for SMB3 over QUIC
via 20c3ccc7be7 s4:lib/tls: add additional dns hostnames as
GNUTLS_SAN_DNSNAME for self-signed certificates
via ef469b45168 s4:lib/tls: set GNUTLS_SAN_DNSNAME for self-signed
certificates
via fbb1a8bfd8a s4:lib/tls: let tstream_tls_params_server_lpcfg() use
lpcfg_dns_hostname() internally
via 3710cb26ae3 auth:creds: Update the documentation for set_principal
and set_realm
via 1505f130450 auth:creds: Make sure to uppercase the realm of a
principal
via e9b5835127f auth:creds: Validate realm names in set_realm and
set_principal
via 2629f19dbe5 s3:utils: Keep password secret in ntlm_auth
get_password()
via ae5124ac5f5 auth:creds: Keep password secret in
cmdline_get_userpassword()
via 16b4aa95658 auth:creds: Keep the password secret
via 8f98180ed71 auth:creds: Allow to reset the principal by passing
NULL to set_principal
via e6158a6bf6d auth:creds: Also uppercase realm set via a callback
via 3985c45ad97 auth:creds: Allow to reset the realm by passing NULL
via 2788551866a smbd: return correct reparse tag DFS when listing
directories
via 607d7ad27c4 CI: add Python test
samba.tests.dcerpc.dfs.DfsTests.test_dfs_reparse_tag
via 24ba677d127 python/tests: also populate self.server in calls
LibsmbTests setup()
via d0fa3266ad8 pylibsmb: add SMB2_FIND_ID_BOTH_DIRECTORY_INFO
via d22c428c1da vfs_xattr_tdb: fix dangling symlink detection
via 8619973d978 s3/rpc_server/dfs: fix creating a DFS link
from 6dc245c4669 VERSION: Bump version up to Samba 4.23.0rc3...
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-23-test
- Log -----------------------------------------------------------------
commit 1fe870aa4c8f98f51ed6e4dfe87cba3e8934f06f
Author: Jule Anger <[email protected]>
Date: Thu Aug 28 10:26:05 2025 +0200
WHATSNEW: unify format
Signed-off-by: Jule Anger <[email protected]>
Autobuild-User(v4-23-test): Jule Anger <[email protected]>
Autobuild-Date(v4-23-test): Thu Aug 28 10:39:47 UTC 2025 on atb-devel-224
commit cd46d6f2bd8af8040285e730c85ff8fbcfbd9288
Author: Jule Anger <[email protected]>
Date: Thu Aug 28 10:22:49 2025 +0200
WHATSNEW: add Initial version of smb_prometheus_endpoint
Signed-off-by: Ralph Boehme <[email protected]>
commit 601e0e2c7443c3efd10fef0101ba06f96bd9c245
Author: Jule Anger <[email protected]>
Date: Thu Aug 28 10:21:49 2025 +0200
WHATSNEW: add Modern write time update logic
Signed-off-by: Ralph Boehme <[email protected]>
commit 1757f22046d23a489226f4c95f9510ac268ede82
Author: Jule Anger <[email protected]>
Date: Thu Aug 28 10:20:32 2025 +0200
WHATSNEW: add SMB3 Unix Extensions
Signed-off-by: Ralph Boehme <[email protected]>
commit fb9a042dab9a0dff66d652a5fd7ba6ebe6f66294
Author: Jule Anger <[email protected]>
Date: Thu Aug 28 10:18:01 2025 +0200
WHATSNEW: add support for SMB3 over QUIC
Signed-off-by: Stefan Metzmacher <[email protected]>
commit 20c3ccc7be78a7e1614361064b32d38694439e39
Author: Stefan Metzmacher <[email protected]>
Date: Tue Aug 26 15:22:10 2025 +0200
s4:lib/tls: add additional dns hostnames as GNUTLS_SAN_DNSNAME for
self-signed certificates
It's better to include X509v3 Subject Alternative Name with
DNS names also for additional dns hostnames.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15899
Signed-off-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Ralph Boehme <[email protected]>
Autobuild-User(master): Stefan Metzmacher <[email protected]>
Autobuild-Date(master): Tue Aug 26 22:00:26 UTC 2025 on atb-devel-224
(cherry picked from commit 499656a05011a462b2e44faea7318a02c847de5e)
commit ef469b451688eaaa9c0a0b595e8cfbfa896944f6
Author: Stefan Metzmacher <[email protected]>
Date: Tue Aug 26 11:55:40 2025 +0200
s4:lib/tls: set GNUTLS_SAN_DNSNAME for self-signed certificates
It's better to include X509v3 Subject Alternative Name with
DNS names in the self-signed certificate...
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15899
Signed-off-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Ralph Boehme <[email protected]>
(cherry picked from commit 49e179963f56e749dac4e20284dc567e382ccdb2)
commit fbb1a8bfd8a807c5f74c40c40e0a60aeb6f83e02
Author: Stefan Metzmacher <[email protected]>
Date: Tue Aug 26 11:22:43 2025 +0200
s4:lib/tls: let tstream_tls_params_server_lpcfg() use lpcfg_dns_hostname()
internally
This is simpler and the next step will also make use of
lpcfg_additional_dns_hostnames() too...
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15899
Signed-off-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Ralph Boehme <[email protected]>
(cherry picked from commit 6116bc64961fb2330df5ff4256b4ef75dca08cf0)
commit 3710cb26ae3bcfd97e10ad358ace894d18160fb5
Author: Andreas Schneider <[email protected]>
Date: Wed Aug 6 07:54:52 2025 +0200
auth:creds: Update the documentation for set_principal and set_realm
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15893
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Alexander Bokovoy <[email protected]>
Autobuild-User(master): Alexander Bokovoy <[email protected]>
Autobuild-Date(master): Mon Aug 25 12:08:22 UTC 2025 on atb-devel-224
(cherry picked from commit 7a19fde92605a3a3699998fb226e3e787de0b5ca)
commit 1505f1304504913b47eb48d0ac99a9dfb5cef65d
Author: Andreas Schneider <[email protected]>
Date: Wed Aug 6 16:33:21 2025 +0200
auth:creds: Make sure to uppercase the realm of a principal
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15893
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Alexander Bokovoy <[email protected]>
(cherry picked from commit 5879410caf9303a378f3d90365e60928a735e65a)
commit e9b5835127f84b9503f1ce0d363b5c86f463923c
Author: Andreas Schneider <[email protected]>
Date: Tue Aug 5 15:25:54 2025 +0200
auth:creds: Validate realm names in set_realm and set_principal
See also
https://web.mit.edu/kerberos/krb5-latest/doc/admin/realm_config.html#realm-name
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15893
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Alexander Bokovoy <[email protected]>
(cherry picked from commit e848671f34f969634d55eb7b846d70e6334034ae)
commit 2629f19dbe5b7b2e133d20ac303d20a2d65b80d9
Author: Andreas Schneider <[email protected]>
Date: Thu Aug 7 13:48:26 2025 +0200
s3:utils: Keep password secret in ntlm_auth get_password()
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15893
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Alexander Bokovoy <[email protected]>
(cherry picked from commit f86739e3abd63ba0b7ba632d796968fec9fa2f8f)
commit ae5124ac5f52a344822194c2e50fe614c408a367
Author: Andreas Schneider <[email protected]>
Date: Thu Aug 7 13:48:04 2025 +0200
auth:creds: Keep password secret in cmdline_get_userpassword()
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15893
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Alexander Bokovoy <[email protected]>
(cherry picked from commit 34482f4ad014a09c84b484097a8d03dfec4f6512)
commit 16b4aa95658b997efe917a65f164a5e94764870e
Author: Andreas Schneider <[email protected]>
Date: Thu Aug 7 13:45:48 2025 +0200
auth:creds: Keep the password secret
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15893
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Alexander Bokovoy <[email protected]>
(cherry picked from commit 705db6c8b295f65f40b7dcd0d5dc0f6db901c8d7)
commit 8f98180ed716e94332bb856a9da418905abc949b
Author: Andreas Schneider <[email protected]>
Date: Wed Aug 6 14:42:51 2025 +0200
auth:creds: Allow to reset the principal by passing NULL to set_principal
We do that e.g. in cli_credentials_set_anonymous()
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15893
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Alexander Bokovoy <[email protected]>
(cherry picked from commit 67c2feba290764c62ab01602d5bc9d4d122c2c12)
commit e6158a6bf6d7ad40045d2107a5ea509f0b375278
Author: Andreas Schneider <[email protected]>
Date: Thu Aug 7 13:32:47 2025 +0200
auth:creds: Also uppercase realm set via a callback
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15893
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Alexander Bokovoy <[email protected]>
(cherry picked from commit 4f8ff3a567d6318c71b0960345592224721c9594)
commit 3985c45ad97a3b2729f3970a8fbcf989a093ca44
Author: Andreas Schneider <[email protected]>
Date: Wed Aug 6 14:40:34 2025 +0200
auth:creds: Allow to reset the realm by passing NULL
This is e.g. done by cli_credentials_set_anonymous().
We can't call TALLOC_FREE(cred->realm), as this would break
cli_credentials_shallow_copy().
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15893
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Alexander Bokovoy <[email protected]>
(cherry picked from commit e5608cdb2e5a7ef2641ec0e7b0ce0b4640a02ce1)
commit 2788551866a1569648cb38ca9aab744bd38994d6
Author: Ralph Boehme <[email protected]>
Date: Fri Aug 15 10:13:33 2025 +0200
smbd: return correct reparse tag DFS when listing directories
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15843
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Volker Lendecke <[email protected]>
Autobuild-User(master): Volker Lendecke <[email protected]>
Autobuild-Date(master): Fri Aug 15 15:37:05 UTC 2025 on atb-devel-224
(cherry picked from commit 0be53d7ac0a39d6a48c6c5e2144f342c0d406781)
commit 607d7ad27c4b1aec26f793a83956debb8306a64b
Author: Ralph Boehme <[email protected]>
Date: Thu Aug 14 17:18:08 2025 +0200
CI: add Python test samba.tests.dcerpc.dfs.DfsTests.test_dfs_reparse_tag
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15843
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Volker Lendecke <[email protected]>
(cherry picked from commit 43ee86c0c757e95712ed52bd336d2085485498ba)
commit 24ba677d1272d7f12b84179652249a4a804b2672
Author: Ralph Boehme <[email protected]>
Date: Fri Aug 15 11:49:27 2025 +0200
python/tests: also populate self.server in calls LibsmbTests setup()
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15843
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Volker Lendecke <[email protected]>
(cherry picked from commit 5f7b31927733b0ff3e1207be242f1ddb2cb699bd)
commit d0fa3266ad8b38e4fa8a611f52c5b6534bdec597
Author: Ralph Boehme <[email protected]>
Date: Fri Aug 15 10:14:53 2025 +0200
pylibsmb: add SMB2_FIND_ID_BOTH_DIRECTORY_INFO
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15843
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Volker Lendecke <[email protected]>
(cherry picked from commit 698a0195f72a091e9ed6b0448160c79e37761840)
commit d22c428c1da8c65895de2a87994ee55ac3eb0f74
Author: Ralph Boehme <[email protected]>
Date: Fri Aug 15 11:50:26 2025 +0200
vfs_xattr_tdb: fix dangling symlink detection
The caller might not have called stat on smb_fname.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15843
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Volker Lendecke <[email protected]>
(cherry picked from commit 2e88ba4b4de146327c19682d59bbe34d68158bf7)
commit 8619973d9783857c03d2c0ca439835fdc63576f8
Author: Ralph Boehme <[email protected]>
Date: Thu Aug 14 19:20:02 2025 +0200
s3/rpc_server/dfs: fix creating a DFS link
If there's no existing link, get_referred_path() returns
NT_STATUS_OBJECT_PATH_NOT_FOUND.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15843
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Volker Lendecke <[email protected]>
(cherry picked from commit 2cb2991ccdd5d4f63e4c5b3ccc4454a6b39d6afe)
-----------------------------------------------------------------------
Summary of changes:
WHATSNEW.txt | 74 ++++++++++++-----
auth/credentials/credentials.c | 140 ++++++++++++++++++++++++++++-----
auth/credentials/credentials_cmdline.c | 1 +
python/samba/tests/credentials.py | 4 +-
python/samba/tests/dcerpc/dfs.py | 48 +++++++++++
python/samba/tests/libsmb.py | 1 +
source3/libsmb/pylibsmb.c | 1 +
source3/modules/vfs_xattr_tdb.c | 13 ++-
source3/rpc_server/dfs/srv_dfs_nt.c | 4 +-
source3/smbd/dir.c | 2 +
source3/smbd/server.c | 8 --
source3/utils/ntlm_auth.c | 1 +
source4/ldap_server/ldap_server.c | 10 ---
source4/ldap_server/ldap_server.h | 1 -
source4/lib/tls/tls.h | 3 +-
source4/lib/tls/tls_tstream.c | 6 +-
source4/lib/tls/tlscert.c | 16 ++++
source4/selftest/tests.py | 1 +
18 files changed, 262 insertions(+), 72 deletions(-)
create mode 100644 python/samba/tests/dcerpc/dfs.py
Changeset truncated at 500 lines:
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 051fa2084de..e968a448eda 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -18,23 +18,60 @@ NEW FEATURES/CHANGES
Enable SMB3 Unix Extensions by default
--------------------------------------
-todo
+Starting with Samba 4.23, the SMB3 UNIX Extensions are enabled by
+default. These extensions provide first-class support for POSIX semantics
+over SMB3, allowing UNIX and Linux clients to access file services with
+features such as proper POSIX permissions, symlink handling, hardlinks,
+and special file types.
+
+Enabling this feature by default improves interoperability for UNIX/Linux
+clients without requiring additional configuration. Windows clients that
+do not support the extensions will continue to function normally, by
+using standard SMB3 behavior.
Add support for SMB3 over QUIC
------------------------------
-todo
+The new "client smb transports" and "server smb transport"
+allow a more flexible configuration for the used tcp
+sockets.
+
+It also got the ability specify "quic" as possible transport.
+If quic should be used in addition to the defaults something
+like "server smb transports = +quic" can be used.
+
+For the client quic only works with name based uncs,
+ip address based uncs are not supported.
+
+Note for the server 'quic' requires the quic.ko kernel module
+for Linux from https://github.com/lxin/quic (tested with Linux 6.14).
+Future Linux versions may support it natively, here's the
+branch that will hopefully accepted upstream soon:
+https://github.com/lxin/net-next/commits/quic/
+
+For the client side there's a fallback to the userspace ngtcp2
+library if the quic kernel module is not available.
+
+Check the smb.conf manpage for additional hints
+about the "client smb transports" and "server smb transport"
+options and interactions with tls related options.
Modern write time update logic
------------------------------
-todo
+Samba 4.23 changes file timestamp handling to match modern Windows servers.
+Earlier releases used delayed write time updates, where last_write_time was
+only refreshed after a short idle period. Now Samba applies immediate
+timestamp updates consistent with modern Windows 10/Server 2016 or newer.
Initial version of smb_prometheus_endpoint
------------------------------------------
-todo
+Samba 4.23 introduces the smb_prometheus_endpoint utility, which exports
+Samba server metrics in Prometheus-compatible format. This enables seamless
+integration of Samba performance and status monitoring into existing
+Prometheus and Grafana environments. For usage and configuration details,
+refer to the new smb_prometheus_endpoint man page.
samba-tool domain backup --no-secrets avoids confidential attributes
--------------------------------------------------------------------
-
The --no-secrets option creates a back-up without secret attributes
(e.g. passwords), suitable for use in a lab domain. Until now it could
still contain confidential attributes, including BitLocker recovery
@@ -45,20 +82,19 @@ schema to have confidential attributes and are no use
without them.
CTDB changes
------------
-
-* CTDB now supports loading tunables from
- /etc/ctdb/tunables.d/*.tunables, in addition to the standard
- /etc/ctdb/tunables.conf. See the ctdb-tunables(7) manual page for
- more details. Note that the above locations are examples - the
- actual location of these files will depend on compile time
- configuration.
-
- It isn't expected that many users will require a directory of tunables
- files, since most users do not need to change tunables from their
- default values. However, this allows vendors to ship their required
- tunables settings (for example, in one or more files marked "do not
- edit") while still allowing local administrators to add their own
- tunables settings (in one or more separate files).
+CTDB now supports loading tunables from
+/etc/ctdb/tunables.d/*.tunables, in addition to the standard
+/etc/ctdb/tunables.conf. See the ctdb-tunables(7) manual page for
+more details. Note that the above locations are examples - the
+actual location of these files will depend on compile time
+configuration.
+
+It isn't expected that many users will require a directory of tunables
+files, since most users do not need to change tunables from their
+default values. However, this allows vendors to ship their required
+tunables settings (for example, in one or more files marked "do not
+edit") while still allowing local administrators to add their own
+tunables settings (in one or more separate files).
Per-share profiling stats
-------------------------
diff --git a/auth/credentials/credentials.c b/auth/credentials/credentials.c
index c31470a81d2..dab1c047c13 100644
--- a/auth/credentials/credentials.c
+++ b/auth/credentials/credentials.c
@@ -33,6 +33,18 @@
#include "system/filesys.h"
#include "system/passwd.h"
+static bool str_is_ascii(const char *s) {
+ if (s != NULL) {
+ for (; s[0] != '\0'; s++) {
+ if (!isascii(s[0])) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
/**
* Create a new credentials structure
* @param mem_ctx TALLOC_CTX parent for credentials structure
@@ -367,9 +379,31 @@ _PUBLIC_ char
*cli_credentials_get_principal_and_obtained(struct cli_credentials
if (cred->principal_obtained == CRED_CALLBACK &&
!cred->callback_running) {
+ const char *princ = NULL;
+
cred->callback_running = true;
- cred->principal = cred->principal_cb(cred);
+ princ = cred->principal_cb(cred);
cred->callback_running = false;
+
+ cred->principal = NULL;
+ if (princ != NULL) {
+ char *p = NULL;
+
+ cred->principal = talloc_strdup(cred, princ);
+ if (cred->principal == NULL) {
+ return NULL;
+ }
+
+ p = strchr(cred->principal, '@');
+ if (p != NULL) {
+ p += 1;
+
+ for (; p[0] != '\0'; p++) {
+ *p = toupper(p[0]);
+ }
+ }
+ }
+
if (cred->principal_obtained == CRED_CALLBACK) {
cred->principal_obtained = CRED_CALLBACK_RESULT;
cli_credentials_invalidate_ccache(cred,
cred->principal_obtained);
@@ -427,17 +461,52 @@ _PUBLIC_ char *cli_credentials_get_principal(struct
cli_credentials *cred, TALLO
return cli_credentials_get_principal_and_obtained(cred, mem_ctx,
&obtained);
}
+/**
+ * @brief Set the principal for the credentials context.
+ *
+ * The realm of the principal will be checked if it is ASCII only and upper
+ * cased if it isn't yet.
+ *
+ * @param cred The credential context.
+ *
+ * @param val The principal to set or NULL to reset.
+ *
+ * @param obtained This way the described principal was specified.
+ *
+ * @return true on success, false if the realm is not ASCII or the allocation
+ * failed.
+ */
_PUBLIC_ bool cli_credentials_set_principal(struct cli_credentials *cred,
- const char *val,
- enum credentials_obtained obtained)
+ const char *val,
+ enum credentials_obtained obtained)
{
if (obtained >= cred->principal_obtained) {
- cred->principal = talloc_strdup(cred, val);
- if (cred->principal == NULL) {
- return false;
+ /* If `val = NULL` is passed, principal is reset */
+ cred->principal = NULL;
+ if (val != NULL) {
+ char *p = strchr(val, '@');
+ if (p != NULL) {
+ /* For realm names, only ASCII is allowed */
+ if (!str_is_ascii(p + 1)) {
+ return false;
+ }
+ }
+
+ cred->principal = talloc_strdup(cred, val);
+ if (cred->principal == NULL) {
+ return false;
+ }
+
+ p = strchr(cred->principal, '@');
+ if (p != NULL) {
+ p += 1;
+
+ for (; p[0] != '\0'; p++) {
+ *p = toupper(p[0]);
+ }
+ }
}
cred->principal_obtained = obtained;
-
cli_credentials_invalidate_ccache(cred,
cred->principal_obtained);
return true;
}
@@ -623,6 +692,7 @@ _PUBLIC_ bool cli_credentials_set_password(struct
cli_credentials *cred,
if (cred->password == NULL) {
return false;
}
+ talloc_keep_secret(discard_const(cred->password));
/* Don't print the actual password in talloc memory dumps */
talloc_set_name_const(cred->password,
@@ -912,9 +982,20 @@ _PUBLIC_ const char *cli_credentials_get_realm(struct
cli_credentials *cred)
if (cred->realm_obtained == CRED_CALLBACK &&
!cred->callback_running) {
+ const char *realm = NULL;
+
cred->callback_running = true;
- cred->realm = cred->realm_cb(cred);
+ realm = cred->realm_cb(cred);
cred->callback_running = false;
+
+ cred->realm = NULL;
+ if (realm != NULL) {
+ cred->realm = strupper_talloc(cred, realm);
+ if (cred->realm == NULL) {
+ return NULL;
+ }
+ }
+
if (cred->realm_obtained == CRED_CALLBACK) {
cred->realm_obtained = CRED_CALLBACK_RESULT;
cli_credentials_invalidate_ccache(cred,
cred->realm_obtained);
@@ -925,15 +1006,37 @@ _PUBLIC_ const char *cli_credentials_get_realm(struct
cli_credentials *cred)
}
/**
- * Set the realm for this credentials context, and force it to
- * uppercase for the sanity of our local kerberos libraries
+ * @brief Set the realm for this credentials context.
+ *
+ * The realm be checked if it is ASCII only and upper cased if it isn't yet.
+ *
+ * @param cred The credential context.
+ *
+ * @param val The realm to set or NULL to reset.
+ *
+ * @param obtained This way the described realm was specified.
+ *
+ * @return true on success, false if the realm is not ASCII or the allocation
+ * failed.
*/
_PUBLIC_ bool cli_credentials_set_realm(struct cli_credentials *cred,
- const char *val,
- enum credentials_obtained obtained)
+ const char *val,
+ enum credentials_obtained obtained)
{
if (obtained >= cred->realm_obtained) {
- cred->realm = strupper_talloc(cred, val);
+ /* If `val = NULL` is passed, realm is reset */
+ cred->realm = NULL;
+ if (val != NULL) {
+ /* For realm names, only ASCII is allowed */
+ if (!str_is_ascii(val)) {
+ return false;
+ }
+
+ cred->realm = strupper_talloc(cred, val);
+ if (cred->realm == NULL) {
+ return false;
+ }
+ }
cred->realm_obtained = obtained;
cli_credentials_invalidate_ccache(cred, cred->realm_obtained);
return true;
@@ -1030,8 +1133,6 @@ _PUBLIC_ void cli_credentials_parse_string(struct
cli_credentials *credentials,
}
if ((p = strchr_m(uname,'@'))) {
- char *x = NULL;
-
/*
* We also need to set username and domain
* in order to undo the effect of
@@ -1040,11 +1141,6 @@ _PUBLIC_ void cli_credentials_parse_string(struct
cli_credentials *credentials,
cli_credentials_set_username(credentials, uname, obtained);
cli_credentials_set_domain(credentials, "", obtained);
- /* Make sure the realm is uppercase */
- for (x = p + 1; x[0] != '\0'; x++) {
- *x = toupper_m(*x);
- }
-
cli_credentials_set_principal(credentials, uname, obtained);
*p = 0;
cli_credentials_set_realm(credentials, p+1, obtained);
@@ -1535,7 +1631,9 @@ _PUBLIC_ void
cli_credentials_get_ntlm_username_domain(struct cli_credentials *c
const char **username,
const char **domain)
{
- if (cred->principal_obtained >= cred->username_obtained) {
+ if (!cli_credentials_is_anonymous(cred) &&
+ cred->principal_obtained >= cred->username_obtained)
+ {
*domain = talloc_strdup(mem_ctx, "");
*username = cli_credentials_get_principal(cred, mem_ctx);
} else {
diff --git a/auth/credentials/credentials_cmdline.c
b/auth/credentials/credentials_cmdline.c
index c8c7c183c22..e9cdc80d52a 100644
--- a/auth/credentials/credentials_cmdline.c
+++ b/auth/credentials/credentials_cmdline.c
@@ -46,6 +46,7 @@ static const char *cmdline_get_userpassword(struct
cli_credentials *creds)
goto fail;
}
talloc_set_name_const(ret, __location__);
+ talloc_keep_secret(ret);
fail:
ZERO_STRUCT(pwd);
TALLOC_FREE(frame);
diff --git a/python/samba/tests/credentials.py
b/python/samba/tests/credentials.py
index bc132681c48..1835d9b7b59 100644
--- a/python/samba/tests/credentials.py
+++ b/python/samba/tests/credentials.py
@@ -361,7 +361,7 @@ class CredentialsTests(samba.tests.TestCaseInTempDir):
self.assertEqual(creds.get_username(), "env_user")
self.assertEqual(creds.get_domain(), lp.get("workgroup").upper())
self.assertEqual(creds.get_realm(), realm.upper())
- self.assertEqual(creds.get_principal(), "[email protected]")
+ self.assertEqual(creds.get_principal(), "[email protected]")
creds.parse_string("domain\\user")
self.assertEqual(creds.get_username(), "user")
self.assertEqual(creds.get_domain(), "DOMAIN")
@@ -385,7 +385,7 @@ class CredentialsTests(samba.tests.TestCaseInTempDir):
self.assertEqual(creds.get_username(), "env_user")
self.assertEqual(creds.get_domain(), lp.get("workgroup").upper())
self.assertEqual(creds.get_realm(), realm.upper())
- self.assertEqual(creds.get_principal(), "[email protected]")
+ self.assertEqual(creds.get_principal(), "[email protected]")
creds.parse_string("domain\\user")
self.assertEqual(creds.get_username(), "user")
self.assertEqual(creds.get_domain(), "DOMAIN")
diff --git a/python/samba/tests/dcerpc/dfs.py b/python/samba/tests/dcerpc/dfs.py
new file mode 100644
index 00000000000..0fcce324e55
--- /dev/null
+++ b/python/samba/tests/dcerpc/dfs.py
@@ -0,0 +1,48 @@
+#
+# Unix SMB/CIFS implementation.
+# Copyright Ralph Boehme <[email protected]> 2025
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+"""Tests for samba.dcerpc.dfs"""
+
+import os
+import logging
+import samba
+from samba.dcerpc import dfs
+from samba.tests import RpcInterfaceTestCase
+from samba.logger import get_samba_logger
+from samba.credentials import Credentials
+from samba.samba3 import libsmb_samba_internal as libsmb
+import samba.tests.libsmb
+from samba.samba3 import param as s3param
+
+logger = get_samba_logger(name=__name__)
+
+class DfsTests(samba.tests.libsmb.LibsmbTests):
+ def setUp(self):
+ super().setUp()
+ self.dfs = dfs.netdfs('ncacn_np:%s[/pipe/netdfs]' % self.server,
self.lp, self.creds)
+ self.c = libsmb.Conn(self.server_ip, "msdfs-share", self.lp,
self.creds)
+
+ def tearDown(self):
+ super().tearDown()
+
+ def test_dfs_reparse_tag(self):
+ self.dfs.Add('\\\\%s\\msdfs-share\\dfslink' % self.server,
self.server, 'tmp', 'comment', 0)
+ l = self.c.list('', info_level=libsmb.SMB2_FIND_ID_BOTH_DIRECTORY_INFO)
+ files = {i['name']: i for i in l}
+ self.assertEqual(files['dfslink']['reparse_tag'],
libsmb.IO_REPARSE_TAG_DFS)
+ self.dfs.Remove('\\\\%s\\msdfs-share\\dfslink' % self.server,
self.server, 'tmp')
diff --git a/python/samba/tests/libsmb.py b/python/samba/tests/libsmb.py
index 3ac1b68a59b..e3683901df2 100644
--- a/python/samba/tests/libsmb.py
+++ b/python/samba/tests/libsmb.py
@@ -43,6 +43,7 @@ class LibsmbTests(samba.tests.TestCase):
server_conf_dir = os.path.dirname(server_conf)
self.global_inject = os.path.join(server_conf_dir,
"global_inject.conf")
+ self.server = samba.tests.env_get_var_value("SERVER")
self.server_ip = samba.tests.env_get_var_value("SERVER_IP")
def clean_file(self, conn, filename):
diff --git a/source3/libsmb/pylibsmb.c b/source3/libsmb/pylibsmb.c
index 67872d8e3b1..cba910d173d 100644
--- a/source3/libsmb/pylibsmb.c
+++ b/source3/libsmb/pylibsmb.c
@@ -3740,6 +3740,7 @@ MODULE_INIT_FUNC(libsmb_samba_cwrapper)
ADD_STRING(SMB2_CREATE_TAG_APP_INSTANCE_ID);
ADD_STRING(SVHDX_OPEN_DEVICE_CONTEXT);
ADD_STRING(SMB2_CREATE_TAG_POSIX);
+ ADD_FLAGS(SMB2_FIND_ID_BOTH_DIRECTORY_INFO);
ADD_FLAGS(SMB2_FIND_POSIX_INFORMATION);
ADD_FLAGS(FILE_SUPERSEDE);
ADD_FLAGS(FILE_OPEN);
diff --git a/source3/modules/vfs_xattr_tdb.c b/source3/modules/vfs_xattr_tdb.c
index 447d868924d..19331d0de4f 100644
--- a/source3/modules/vfs_xattr_tdb.c
+++ b/source3/modules/vfs_xattr_tdb.c
@@ -604,13 +604,12 @@ static int xattr_tdb_unlinkat(vfs_handle_struct *handle,
} else {
ret = SMB_VFS_NEXT_STAT(handle, full_fname);
if (ret == -1 && (errno == ENOENT || errno == ELOOP)) {
- if (VALID_STAT(smb_fname->st) &&
- S_ISLNK(smb_fname->st.st_ex_mode)) {
- /*
- * Original name was a link - Could be
- * trying to remove a dangling symlink.
- */
- ret = SMB_VFS_NEXT_LSTAT(handle, full_fname);
+ /*
+ * Could be trying to remove a dangling symlink.
+ */
+ ret = SMB_VFS_NEXT_LSTAT(handle, full_fname);
+ if (ret == 0 && !S_ISLNK(full_fname->st.st_ex_mode)) {
+ ret = -1;
}
}
}
diff --git a/source3/rpc_server/dfs/srv_dfs_nt.c
b/source3/rpc_server/dfs/srv_dfs_nt.c
index 8eaa59a8b0e..d8aeb76a1fb 100644
--- a/source3/rpc_server/dfs/srv_dfs_nt.c
+++ b/source3/rpc_server/dfs/srv_dfs_nt.c
@@ -97,7 +97,9 @@ WERROR _dfs_Add(struct pipes_struct *p, struct dfs_Add *r)
remote_address,
local_address,
jn, &consumedcnt, &self_ref);
- if(!NT_STATUS_IS_OK(status)) {
+ if(!NT_STATUS_IS_OK(status) &&
+ !NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_PATH_NOT_FOUND))
+ {
return ntstatus_to_werror(status);
}
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 137d9a1dacd..95869e054f3 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -639,6 +639,8 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
smb_fname->st.st_ex_mode = (smb_fname->st.st_ex_mode &
~S_IFMT) |
S_IFDIR;
+ smb_fname->fsp->fsp_name->st.st_ex_mode =
+ smb_fname->st.st_ex_mode;
mode = dos_mode_msdfs(conn, dname, &smb_fname->st);
get_dosmode = false;
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index f7f55420c00..f31ea894600 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -255,21 +255,13 @@ static NTSTATUS smb_parent_load_tls_certificates(struct
smbd_parent_context *par
struct loadparm_context
*lp_ctx)
{
struct tstream_tls_params *quic_tlsp = NULL;
- const char *dns_hostname = NULL;
NTSTATUS status;
if (parent == NULL) {
--
Samba Shared Repository