[Samba] missing msdfs referrals from samba directory listing: wrong order in smbd_dirptr_get_entry()?
Michael Tokarev
mjt at tls.msk.ru
Thu Jun 6 16:33:21 UTC 2024
Hi!
For quite some time I'm trying to find what's going on with MSDFS referrals.
Samba version is 4.19.6.
We've global host msdfs = yes (the default anyway), and for a share in question,
msdfs root = yes. testparam confirms the settings.
There's a symlink created in the root dir of the share, which points to the same
server but different path:
dfstest => msdfs:thissrv/othershare/subdir
However, when opening the directory in question from client, this name is not
shown in the listing. Samba skips this name from the listing when looping over
readdir entries:
[2024/06/06 19:02:40.521314, 10, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:868(openat_pathref_fsp_nosymlink)
openat_pathref_fsp_nosymlink: path_in=dfstest
[2024/06/06 19:02:40.521339, 5, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:77(fsp_new)
fsp_new: allocated files structure (9 used)
[2024/06/06 19:02:40.521372, 10, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:978(openat_pathref_fsp_nosymlink)
openat_pathref_fsp_nosymlink: SMB_VFS_OPENAT(., dfstest, RESOLVE_NO_SYMLINKS) returned 40 Too many levels of symbolic links =>
NT_STATUS_OBJECT_PATH_NOT_FOUND
[2024/06/06 19:02:40.521437, 10, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/mangle_hash2.c:415(is_mangled)
is_mangled dfstest ?
[2024/06/06 19:02:40.521466, 10, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/mangle_hash2.c:354(is_mangled_component)
is_mangled_component dfstest (len 7) ?
[2024/06/06 19:02:40.521493, 5, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:77(fsp_new)
fsp_new: allocated files structure (10 used)
[2024/06/06 19:02:40.521517, 10, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:115(fsp_bind_smb)
fsp_bind_smb: INTERNAL_OPEN_ONLY, skipping smbXsrv_open
[2024/06/06 19:02:40.521542, 5, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:179(file_new)
file_new: new file fnum [invalid value]
[2024/06/06 19:02:40.521569, 10, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:2198(file_name_hash)
file_name_hash: /ws/ws/. hash 0x3eac6da4
[2024/06/06 19:02:40.521608, 10, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/open.c:930(fd_openat)
fd_openat: name ., flags = 0400000 mode = 00, fd = 38
[2024/06/06 19:02:40.521669, 5, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:1985(file_free)
file_free: freed files structure 0 (9 used)
[2024/06/06 19:02:40.521711, 10, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:1172(openat_pathref_fsp_nosymlink)
openat_pathref_fsp_nosymlink: SMB_VFS_OPENAT() failed: No such file or directory
[2024/06/06 19:02:40.521781, 5, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/files.c:1985(file_free)
file_free: freed files structure 0 (8 used)
[2024/06/06 19:02:40.521810, 3, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/dir.c:750(smbd_dirptr_get_entry)
smbd_dirptr_get_entry: Could not open dfstest: NT_STATUS_OBJECT_NAME_NOT_FOUND
[2024/06/06 19:02:40.521845, 10, pid=1173240, effective(1000, 1000), real(1000, 0)] source3/smbd/dir.c:568(smbd_dirptr_get_entry)
smbd_dirptr_get_entry: dir [.] dirptr [0x564f0a10ed10] offset [9] => dname [(finished)]
[2024/06/06 19:02:40.521878, 10, pid=1173240, effective(1000, 1000), real(1000, 0), class=smb2]
source3/smbd/smb2_query_directory.c:188(smbd_smb2_request_find_done)
smbd_smb2_request_find_done: out_output_buffer.length = 942
[2024/06/06 19:02:40.521904, 10, pid=1173240, effective(1000, 1000), real(1000, 0), class=smb2] source3/smbd/smb2_server.c:3916(smbd_smb2_request_done_ex)
smbd_smb2_request_done_ex: mid [12841] idx[5] status[NT_STATUS_OK] body[8] dyn[yes:942] at source3/smbd/smb2_query_directory.c:193
This is consistent for smbclient and for windows10 and windows11 clients.
However, when specifying whole path in question, in form \\thisserver\dfstest\,
it works, - samba correctly returns referral and the client handles it:
$ smbclient //thissrv/share
Password for...:
smb: \> dir
. D 0 Thu Jun 6 19:10:50 2024
.. D 0 Thu Jun 6 19:10:50 2024
smb: \> cd dfstest
smb: \dfstest\> dir
. D 0 Wed Apr 2 21:56:01 2008
.. D 0 Mon Sep 18 11:25:54 2023
doc D 0 Mon Jun 20 13:37:17 2005
...other entries..
smb: \dfstest\> cd ..
smb: \> _
So it looks like only the file listing does not work.
But the fun thing is that it is omitted in the listing *sometimes* (most of the
time), - At one point I did see it in the listing, so I concluded it works fine
and forgot about it, until users started complaining they don't see their dirs.
I'm certain nothing had changed since that time, - exactly the same samba version
and the same config, but we had a couple of reboots in between.
Reading source3/smbd/dir.c:smbd_dirptr_get_entry() I can't see where it can work,
ever. Because it does openat_pathref_fsp_lcomp() first, which never works on a
symlink not pointing to a real file (which is how msdfs symlink looks like), that
one return !NT_STATUS_OK() (NT_STATUS_OBJECT_NAME_NOT_FOUND in the above debug
log), and whole thing ends up in there. is_msdfs_link() is checked later.
If I move is_msdfs_link() check right before openat_pathref_fsp_lcomp() call, it
seems to work fine.
Should such a move be done in the actual code?
Thanks,
/mjt--
GPG Key transition (from rsa2048 to rsa4096) since 2024-04-24.
New key: rsa4096/61AD3D98ECDF2C8E 9D8B E14E 3F2A 9DD7 9199 28F1 61AD 3D98 ECDF 2C8E
Old key: rsa2048/457CE0A0804465C5 6EE1 95D1 886E 8FFB 810D 4324 457C E0A0 8044 65C5
Transition statement: http://www.corpit.ru/mjt/gpg-transition-2024.txt
More information about the samba
mailing list