summaryrefslogtreecommitdiff
path: root/usr/src/uts/common
diff options
context:
space:
mode:
authorDan McDonald <danmcd@mnx.io>2022-12-16 13:29:26 -0500
committerDan McDonald <danmcd@mnx.io>2022-12-16 13:29:26 -0500
commitc2b15a66358531a6d0407d3678b210e752a0b606 (patch)
tree37db6d27eafd3b8bb0ff1c25ee6c8b98070f5444 /usr/src/uts/common
parent3b01c8dd53b81ad475bf8152609c8c4803a9af55 (diff)
parentf4d2cf74960df993f48d42d323f16867fc6b9bdf (diff)
downloadillumos-joyent-master.tar.gz
[illumos-gate merge]HEADmaster
commit f4d2cf74960df993f48d42d323f16867fc6b9bdf 15253 14993 broke test-runner -l option commit fb2301db8e408458b542c1f5fa07b5b8a3a95395 15258 libsmb: tautological-pointer-compare commit abd30308264aa9ca2b1c71565b841fc94256d07b 15211 smbtorture failures in smb2.delete-on-close-perms.READONLY commit 0663b557d8c7575927b005cab08d9f19c8b98c25 15200 libdladm: error: '&&' within '||' commit bf7adeeaefd6f9806398f446e4b87af240a6770e 15199 libdladm: unused label commit 92f549282aaface1e6f92329085e28edcf24054f 15207 libfmd_agent: memory leak in fmd_agent_nvl_ioctl commit 7b5987898994d86cd20e00dbf8c305dfbfbb8bea 15135 stdalign.h is very C11-y, but perhaps disrespectful of C++
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c16
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_common_open.c6
2 files changed, 20 insertions, 2 deletions
diff --git a/usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c b/usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c
index 1b9ed07060..c5369eae4f 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c
@@ -231,8 +231,9 @@ smb_set_alloc_info(smb_request_t *sr, smb_setinfo_t *si)
uint32_t
smb_set_disposition_info(smb_request_t *sr, smb_setinfo_t *si)
{
- smb_node_t *node = si->si_node;
- smb_ofile_t *of = sr->fid_ofile;
+ smb_attr_t *attr = &si->si_attr;
+ smb_node_t *node = si->si_node;
+ smb_ofile_t *of = sr->fid_ofile;
uint8_t mark_delete;
uint32_t status;
uint32_t flags = 0;
@@ -249,6 +250,17 @@ smb_set_disposition_info(smb_request_t *sr, smb_setinfo_t *si)
}
/*
+ * MS-FSA 2.1.5.14.3 FileDispositionInformation
+ * If dosattr READONLY, STATUS_CANNOT_DELETE.
+ */
+ attr->sa_mask = SMB_AT_DOSATTR;
+ status = smb2_ofile_getattr(sr, of, attr);
+ if (status != 0)
+ return (status);
+ if ((attr->sa_dosattr & FILE_ATTRIBUTE_READONLY) != 0)
+ return (NT_STATUS_CANNOT_DELETE);
+
+ /*
* Break any oplock handle caching.
*/
status = smb_oplock_break_SETINFO(node, of,
diff --git a/usr/src/uts/common/fs/smbsrv/smb_common_open.c b/usr/src/uts/common/fs/smbsrv/smb_common_open.c
index 688bac53d8..894affa2a5 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_common_open.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_common_open.c
@@ -945,6 +945,12 @@ create:
goto errout;
}
+ if ((op->dattr & FILE_ATTRIBUTE_READONLY) != 0 &&
+ (op->create_options & FILE_DELETE_ON_CLOSE) != 0) {
+ status = NT_STATUS_CANNOT_DELETE;
+ goto errout;
+ }
+
if ((op->desired_access & ACCESS_SYSTEM_SECURITY) != 0 &&
!smb_user_has_security_priv(sr->uid_user, sr->user_cr)) {
status = NT_STATUS_ACCESS_DENIED;