summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c')
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c17
1 files changed, 14 insertions, 3 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 304eb93a39..1b9ed07060 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_cmn_setfile.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2020 Tintri by DDN, Inc. All rights reserved.
+ * Copyright 2022 RackTop Systems, Inc.
*/
/*
@@ -62,9 +63,19 @@ smb_set_basic_info(smb_request_t *sr, smb_setinfo_t *si)
&crtime, &atime, &mtime, &ctime, &attributes) != 0)
return (NT_STATUS_INFO_LENGTH_MISMATCH);
- if ((attributes & FILE_ATTRIBUTE_DIRECTORY) &&
- (!smb_node_is_dir(node)))
- return (NT_STATUS_INVALID_PARAMETER);
+ /*
+ * MS-FSA 2.1.5.14.2 FileBasicInformation
+ * Return STATUS_INVALID_PARAMETER if:
+ * FILE_ATTRIBUTE_TEMPORARY on a directory,
+ * FILE_ATTRIBUTE_DIRECTORY on a non-directory.
+ */
+ if (smb_node_is_dir(node)) {
+ if ((attributes & FILE_ATTRIBUTE_TEMPORARY) != 0)
+ return (NT_STATUS_INVALID_PARAMETER);
+ } else {
+ if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
+ return (NT_STATUS_INVALID_PARAMETER);
+ }
bzero(attr, sizeof (*attr));
if (atime != 0 && atime != (uint64_t)-1) {