The branch, master has been updated
via 96870782516 smbd: avoid mangling names in
smbd_dirptr_lanman2_match_fn() for POSIX
via e5ff201592e smbd: pass dirfsp instead of conn and dptr to
smbd_dirptr_lanman2_entry() and get_lanman2_dir_entry()
via 8b2ae47a511 libsmb: use parse_finfo_posix_info in
is_bad_finfo_name()
via bc300c7a300 libsmb: set finfo->flags.posix in
parse_finfo_posix_info()
via 4b7175eae80 libsmb: add flags to struct file_info
via 93ad870a1e4 tests: expand SMB3 POSIX test for Windows illegal
characters behaviour
from 88572cc8f62 libads: fix get_kdc_ip_string() ...
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 9687078251620c50420ebbeb6d7d3d53c04705a7
Author: Ralph Boehme <[email protected]>
Date: Sun May 25 20:05:59 2025 +0200
smbd: avoid mangling names in smbd_dirptr_lanman2_match_fn() for POSIX
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15862
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
Autobuild-User(master): Jeremy Allison <[email protected]>
Autobuild-Date(master): Mon Jul 7 17:45:13 UTC 2025 on atb-devel-224
commit e5ff201592eec86b22ccaa977f3efd3c0e5f9053
Author: Ralph Boehme <[email protected]>
Date: Sun May 25 20:04:53 2025 +0200
smbd: pass dirfsp instead of conn and dptr to smbd_dirptr_lanman2_entry()
and get_lanman2_dir_entry()
No change in behaviour.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15862
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit 8b2ae47a5110592cdaef070c972514a47bce0b50
Author: Ralph Boehme <[email protected]>
Date: Mon May 26 10:37:42 2025 +0200
libsmb: use parse_finfo_posix_info in is_bad_finfo_name()
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15862
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit bc300c7a300bafe4dc417d074f56ffd2547dd2f9
Author: Ralph Boehme <[email protected]>
Date: Mon May 26 10:37:18 2025 +0200
libsmb: set finfo->flags.posix in parse_finfo_posix_info()
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15862
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit 4b7175eae803a026b9a0709ff1fe71b9cf43d631
Author: Ralph Boehme <[email protected]>
Date: Mon May 26 10:35:21 2025 +0200
libsmb: add flags to struct file_info
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15862
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit 93ad870a1e497066f82e8ec85c8a643dcd15b4de
Author: Ralph Boehme <[email protected]>
Date: Sun May 25 15:15:27 2025 +0200
tests: expand SMB3 POSIX test for Windows illegal characters behaviour
The test was testing file creation, but not FIND behaviour.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15862
Signed-off-by: Ralph Boehme <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
-----------------------------------------------------------------------
Summary of changes:
python/samba/tests/smb3unix.py | 21 +++++++++++++++++++--
source3/include/client.h | 3 +++
source3/libsmb/cli_smb2_fnum.c | 1 +
source3/libsmb/clilist.c | 4 +++-
source3/smbd/globals.h | 3 +--
source3/smbd/smb1_trans2.c | 11 ++++-------
source3/smbd/smb2_query_directory.c | 3 +--
source3/smbd/smb2_trans2.c | 13 ++++++++++---
8 files changed, 42 insertions(+), 17 deletions(-)
Changeset truncated at 500 lines:
diff --git a/python/samba/tests/smb3unix.py b/python/samba/tests/smb3unix.py
index 5c8ab182061..289bc5ac5b4 100644
--- a/python/samba/tests/smb3unix.py
+++ b/python/samba/tests/smb3unix.py
@@ -182,13 +182,30 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
wire_mode = libsmb.unix_mode_to_wire(0o744)
f,_,cc_out = c.create_ex('\\%s' % fname,
CreateDisposition=libsmb.FILE_CREATE,
- DesiredAccess=security.SEC_STD_DELETE,
+ DesiredAccess=security.SEC_FILE_READ_ATTRIBUTE,
CreateContexts=[posix_context(wire_mode)])
except NTSTATUSError as e:
self.fail(e)
- c.delete_on_close(f, True)
c.close(f)
+ try:
+ res = c.list('', info_level=libsmb.SMB2_FIND_POSIX_INFORMATION)
+ found_files = {get_string(i['name']): i for i in res}
+ for fname in test_files:
+ self.assertTrue(fname in found_files)
+ except NTSTATUSError as e:
+ self.fail(e)
+ finally:
+ wire_mode = libsmb.unix_mode_to_wire(0o600)
+ for fname in test_files:
+ f,_,_ = c.create_ex('\\%s' % fname,
+ CreateDisposition=libsmb.FILE_OPEN,
+ DesiredAccess=security.SEC_STD_DELETE,
+ CreateContexts=[posix_context(wire_mode)])
+ c.delete_on_close(f, True)
+ c.close(f)
+
+
def test_posix_delete_on_close(self):
c = libsmb.Conn(
self.server_ip,
diff --git a/source3/include/client.h b/source3/include/client.h
index aaac2956f32..18f76019ae8 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -111,6 +111,9 @@ struct file_info {
nlink_t st_ex_nlink;
struct dom_sid owner_sid;
struct dom_sid group_sid;
+ struct {
+ bool posix : 1;
+ } flags;
};
#define CLI_FULL_CONNECTION_DONT_SPNEGO 0x0001
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index dcd6aa50c58..cbbd1208e04 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -1334,6 +1334,7 @@ static NTSTATUS parse_finfo_posix_info(const uint8_t
*dir_data,
finfo->st_ex_mode = wire_mode_to_unix(info.cc.posix_mode);
sid_copy(&finfo->owner_sid, &info.cc.owner);
sid_copy(&finfo->group_sid, &info.cc.group);
+ finfo->flags.posix = true;
if (dir_data_length < 4) {
return NT_STATUS_INFO_LENGTH_MISMATCH;
diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c
index f954405ba10..9ec3e3240f4 100644
--- a/source3/libsmb/clilist.c
+++ b/source3/libsmb/clilist.c
@@ -66,7 +66,9 @@ NTSTATUS is_bad_finfo_name(const struct cli_state *cli,
NTSTATUS status = NT_STATUS_OK;
bool windows_names = true;
- if (cli->requested_posix_capabilities & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
+ if ((cli->requested_posix_capabilities & CIFS_UNIX_POSIX_PATHNAMES_CAP)
+ || finfo->flags.posix)
+ {
windows_names = false;
}
if (finfo->name != NULL) {
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index c74762248c1..e518c710cda 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -162,8 +162,7 @@ NTSTATUS smbd_do_qfsinfo(struct smbXsrv_connection *xconn,
int *ret_data_len);
NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
- connection_struct *conn,
- struct dptr_struct *dirptr,
+ struct files_struct *dirfsp,
uint16_t flags2,
const char *path_mask,
uint32_t dirtype,
diff --git a/source3/smbd/smb1_trans2.c b/source3/smbd/smb1_trans2.c
index 643c05dd77e..568a5611223 100644
--- a/source3/smbd/smb1_trans2.c
+++ b/source3/smbd/smb1_trans2.c
@@ -769,8 +769,7 @@ static void call_trans2open(connection_struct *conn,
}
static NTSTATUS get_lanman2_dir_entry(TALLOC_CTX *ctx,
- connection_struct *conn,
- struct dptr_struct *dirptr,
+ struct files_struct *dirfsp,
uint16_t flags2,
const char *path_mask,
uint32_t dirtype,
@@ -792,7 +791,7 @@ static NTSTATUS get_lanman2_dir_entry(TALLOC_CTX *ctx,
align = 1;
}
- return smbd_dirptr_lanman2_entry(ctx, conn, dirptr, flags2,
+ return smbd_dirptr_lanman2_entry(ctx, dirfsp, flags2,
path_mask, dirtype, info_level,
requires_resume_key, dont_descend,
true, align, do_pad,
@@ -1108,8 +1107,7 @@ static void call_trans2findfirst(connection_struct *conn,
for (i=0;(i<maxentries) && !finished && !out_of_space;i++) {
ntstatus = get_lanman2_dir_entry(talloc_tos(),
- conn,
- fsp->dptr,
+ fsp,
req->flags2,
mask,
dirtype,
@@ -1568,8 +1566,7 @@ static void call_trans2findnext(connection_struct *conn,
for (i=0;(i<(int)maxentries) && !finished && !out_of_space ;i++) {
ntstatus = get_lanman2_dir_entry(ctx,
- conn,
- fsp->dptr,
+ fsp,
req->flags2,
mask,
dirtype,
diff --git a/source3/smbd/smb2_query_directory.c
b/source3/smbd/smb2_query_directory.c
index ba8b690e1d7..0e66705425a 100644
--- a/source3/smbd/smb2_query_directory.c
+++ b/source3/smbd/smb2_query_directory.c
@@ -534,8 +534,7 @@ static bool smb2_query_directory_next_entry(struct
tevent_req *req)
SMB_ASSERT(space_remaining >= 0);
status = smbd_dirptr_lanman2_entry(state,
- state->dirfsp->conn,
- state->dirfsp->dptr,
+ state->dirfsp,
state->smbreq->flags2,
state->in_file_name,
state->dirtype,
diff --git a/source3/smbd/smb2_trans2.c b/source3/smbd/smb2_trans2.c
index 3483a413335..deb371beaba 100644
--- a/source3/smbd/smb2_trans2.c
+++ b/source3/smbd/smb2_trans2.c
@@ -920,6 +920,7 @@ struct smbd_dirptr_lanman2_state {
uint32_t info_level;
bool check_mangled_names;
bool case_sensitive;
+ bool posix_paths;
};
static bool smbd_dirptr_lanman2_match_fn(TALLOC_CTX *ctx,
@@ -936,7 +937,9 @@ static bool smbd_dirptr_lanman2_match_fn(TALLOC_CTX *ctx,
const char *fname;
/* Mangle fname if it's an illegal name. */
- if (mangle_must_mangle(dname, state->conn->params)) {
+ if (!state->posix_paths &&
+ mangle_must_mangle(dname, state->conn->params))
+ {
/*
* Slow path - ensure we can push the original name as UCS2. If
* not, then just don't return this name.
@@ -1758,8 +1761,7 @@ static NTSTATUS smbd_marshall_dir_entry(TALLOC_CTX *ctx,
}
NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
- connection_struct *conn,
- struct dptr_struct *dirptr,
+ struct files_struct *dirfsp,
uint16_t flags2,
const char *path_mask,
uint32_t dirtype,
@@ -1778,6 +1780,8 @@ NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
struct ea_list *name_list,
struct file_id *file_id)
{
+ struct connection_struct *conn = dirfsp->conn;
+ struct dptr_struct *dirptr = dirfsp->dptr;
const char *p;
const char *mask = NULL;
uint32_t mode = 0;
@@ -1799,6 +1803,9 @@ NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
state.check_mangled_names = true;
}
state.case_sensitive = dptr_case_sensitive(dirptr);
+ if (dirfsp->fsp_name->flags & SMB_FILENAME_POSIX_PATH) {
+ state.posix_paths = true;
+ }
p = strrchr_m(path_mask,'/');
if(p != NULL) {
--
Samba Shared Repository