summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/smbsrv/smb_odir.c
diff options
context:
space:
mode:
authorPrashanth Badari <prbadari@tintri.com>2022-01-11 18:50:44 +0000
committerMatt Barden <mbarden@tintri.com>2022-11-04 20:05:13 -0400
commit56a2adb63cd7b5ba73bb3f0fb3930b2d2730513e (patch)
tree71a3b79a27b61578d1939b0cd25e20f318fc5148 /usr/src/uts/common/fs/smbsrv/smb_odir.c
parent66a9cc68640459b14e330f94bcab980ef58fd66d (diff)
downloadillumos-joyent-56a2adb63cd7b5ba73bb3f0fb3930b2d2730513e.tar.gz
15082 SMB Clients see but can't access restricted named streams
Reviewed by: Andrew Stormont <andyjstormont@gmail.com> Reviewed by: Gordon Ross <Gordon.W.Ross@gmail.com> Reviewed by: Toomas Soome <tsoome@me.com> Approved by: Dan McDonald <danmcd@mnx.io>
Diffstat (limited to 'usr/src/uts/common/fs/smbsrv/smb_odir.c')
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_odir.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/usr/src/uts/common/fs/smbsrv/smb_odir.c b/usr/src/uts/common/fs/smbsrv/smb_odir.c
index d2f56b47b0..24d9beae94 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_odir.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_odir.c
@@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2022 Tintri by DDN, Inc. All rights reserved.
*/
/*
@@ -277,7 +277,7 @@ static void smb_odir_delete(void *);
*/
uint32_t
smb_odir_openpath(smb_request_t *sr, char *path, uint16_t sattr,
- uint32_t flags, smb_odir_t **odp)
+ uint32_t flags, smb_odir_t **odp)
{
int rc;
smb_tree_t *tree;
@@ -338,7 +338,7 @@ smb_odir_openpath(smb_request_t *sr, char *path, uint16_t sattr,
*/
uint32_t
smb_odir_openfh(smb_request_t *sr, const char *pattern, uint16_t sattr,
- smb_odir_t **odp)
+ smb_odir_t **odp)
{
smb_ofile_t *of = sr->fid_ofile;
@@ -365,7 +365,8 @@ smb_odir_openfh(smb_request_t *sr, const char *pattern, uint16_t sattr,
* NT status
*/
uint32_t
-smb_odir_openat(smb_request_t *sr, smb_node_t *unode, smb_odir_t **odp)
+smb_odir_openat(smb_request_t *sr, smb_node_t *unode, smb_odir_t **odp,
+ boolean_t restricted)
{
char pattern[SMB_STREAM_PREFIX_LEN + 2];
vnode_t *xattr_dvp;
@@ -401,6 +402,10 @@ smb_odir_openat(smb_request_t *sr, smb_node_t *unode, smb_odir_t **odp)
*odp = smb_odir_create(sr, xattr_dnode, pattern,
SMB_SEARCH_ATTRIBUTES, 0, cr);
+ /* Causes restricted stream names to be hidden from the caller */
+ if (restricted)
+ (*odp)->d_flags |= SMB_ODIR_FLAG_RESTRICTED;
+
smb_node_release(xattr_dnode);
return (0);
}
@@ -724,6 +729,14 @@ smb_odir_read_streaminfo(smb_request_t *sr, smb_odir_t *od,
continue;
}
+ /*
+ * Hide streams that would be restricted if the caller
+ * is also restricted.
+ */
+ if ((od->d_flags & SMB_ODIR_FLAG_RESTRICTED) != 0 &&
+ smb_strname_restricted(odirent->od_name))
+ continue;
+
rc = smb_fsop_lookup(sr, od->d_cred, 0, od->d_tree->t_snode,
od->d_dnode, odirent->od_name, &fnode);
if (rc == 0) {
@@ -896,7 +909,7 @@ smb_odir_resume_at(smb_odir_t *od, smb_odir_resume_t *resume)
*/
static smb_odir_t *
smb_odir_create(smb_request_t *sr, smb_node_t *dnode,
- const char *pattern, uint16_t sattr, uint16_t odid, cred_t *cr)
+ const char *pattern, uint16_t sattr, uint16_t odid, cred_t *cr)
{
smb_odir_t *od;
smb_tree_t *tree;