From 118e77d86a7171f589f805fa4f63246b0cb63672 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 11 Apr 2018 11:05:14 -0700 Subject: [PATCH] s3: smbd. Generic fix for incorrect reporting of stream dos attributes on a directory MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit According to MS-FSA a stream name does not have separate DOS attribute metadata, so we must return the DOS attribute from the base filename. With one caveat, a non-default stream name can never be a directory. As this is common to all streams data stores, we handle it here instead of inside all stream VFS modules. Otherwise identical logic would have to be added to all streams modules in their [f]get_dos_attribute_fn() VFS calls. Found in real-world use case by Andrew Walker . BUG: https://bugzilla.samba.org/show_bug.cgi?id=13380 Signed-off-by: Jeremy Allison Reviewed-by: Ralph Böhme --- source3/smbd/dosmode.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index 8a11c8fd62a..7ac876a47bf 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -681,6 +681,28 @@ uint32_t dos_mode(connection_struct *conn, struct smb_filename *smb_fname) } } + /* + * According to MS-FSA a stream name does not have + * separate DOS attribute metadata, so we must return + * the DOS attribute from the base filename. With one caveat, + * a non-default stream name can never be a directory. + * + * As this is common to all streams data stores, we handle + * it here instead of inside all stream VFS modules. + * + * BUG: https://bugzilla.samba.org/show_bug.cgi?id=13380 + */ + + if (is_ntfs_stream_smb_fname(smb_fname)) { + /* is_ntfs_stream_smb_fname() returns false for a POSIX path. */ + if (!is_ntfs_default_stream_smb_fname(smb_fname)) { + /* + * Non-default stream name, not a posix path. + */ + result &= ~(FILE_ATTRIBUTE_DIRECTORY); + } + } + if (conn->fs_capabilities & FILE_FILE_COMPRESSION) { bool compressed = false; status = dos_mode_check_compressed(conn, smb_fname, -- 2.11.4.GIT