Commit 7476b043 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag '5.17-rc5-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6

Pull cifs fixes from Steve French:
 "Six small smb3 client fixes, three for stable:

   - fix for snapshot mount option

   - two ACL related fixes

   - use after free race fix

   - fix for confusing warning message logged with older dialects"

* tag '5.17-rc5-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6:
  cifs: fix confusing unneeded warning message on smb2.1 and earlier
  cifs: modefromsids must add an ACE for authenticated users
  cifs: fix double free race when mount fails in cifs_get_root()
  cifs: do not use uninitialized data in the owner/group sid
  cifs: fix set of group SID via NTSD xattrs
  smb3: fix snapshot mount option
parents 9195e5e0 53923e0f
...@@ -949,6 +949,9 @@ static void populate_new_aces(char *nacl_base, ...@@ -949,6 +949,9 @@ static void populate_new_aces(char *nacl_base,
pnntace = (struct cifs_ace *) (nacl_base + nsize); pnntace = (struct cifs_ace *) (nacl_base + nsize);
nsize += setup_special_mode_ACE(pnntace, nmode); nsize += setup_special_mode_ACE(pnntace, nmode);
num_aces++; num_aces++;
pnntace = (struct cifs_ace *) (nacl_base + nsize);
nsize += setup_authusers_ACE(pnntace);
num_aces++;
goto set_size; goto set_size;
} }
...@@ -1297,7 +1300,7 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd, ...@@ -1297,7 +1300,7 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd,
if (uid_valid(uid)) { /* chown */ if (uid_valid(uid)) { /* chown */
uid_t id; uid_t id;
nowner_sid_ptr = kmalloc(sizeof(struct cifs_sid), nowner_sid_ptr = kzalloc(sizeof(struct cifs_sid),
GFP_KERNEL); GFP_KERNEL);
if (!nowner_sid_ptr) { if (!nowner_sid_ptr) {
rc = -ENOMEM; rc = -ENOMEM;
...@@ -1326,7 +1329,7 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd, ...@@ -1326,7 +1329,7 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd,
} }
if (gid_valid(gid)) { /* chgrp */ if (gid_valid(gid)) { /* chgrp */
gid_t id; gid_t id;
ngroup_sid_ptr = kmalloc(sizeof(struct cifs_sid), ngroup_sid_ptr = kzalloc(sizeof(struct cifs_sid),
GFP_KERNEL); GFP_KERNEL);
if (!ngroup_sid_ptr) { if (!ngroup_sid_ptr) {
rc = -ENOMEM; rc = -ENOMEM;
...@@ -1613,7 +1616,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode, ...@@ -1613,7 +1616,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode,
nsecdesclen = secdesclen; nsecdesclen = secdesclen;
if (pnmode && *pnmode != NO_CHANGE_64) { /* chmod */ if (pnmode && *pnmode != NO_CHANGE_64) { /* chmod */
if (mode_from_sid) if (mode_from_sid)
nsecdesclen += sizeof(struct cifs_ace); nsecdesclen += 2 * sizeof(struct cifs_ace);
else /* cifsacl */ else /* cifsacl */
nsecdesclen += 5 * sizeof(struct cifs_ace); nsecdesclen += 5 * sizeof(struct cifs_ace);
} else { /* chown */ } else { /* chown */
......
...@@ -919,6 +919,7 @@ cifs_smb3_do_mount(struct file_system_type *fs_type, ...@@ -919,6 +919,7 @@ cifs_smb3_do_mount(struct file_system_type *fs_type,
out_super: out_super:
deactivate_locked_super(sb); deactivate_locked_super(sb);
return root;
out: out:
if (cifs_sb) { if (cifs_sb) {
kfree(cifs_sb->prepath); kfree(cifs_sb->prepath);
......
...@@ -149,7 +149,7 @@ const struct fs_parameter_spec smb3_fs_parameters[] = { ...@@ -149,7 +149,7 @@ const struct fs_parameter_spec smb3_fs_parameters[] = {
fsparam_u32("echo_interval", Opt_echo_interval), fsparam_u32("echo_interval", Opt_echo_interval),
fsparam_u32("max_credits", Opt_max_credits), fsparam_u32("max_credits", Opt_max_credits),
fsparam_u32("handletimeout", Opt_handletimeout), fsparam_u32("handletimeout", Opt_handletimeout),
fsparam_u32("snapshot", Opt_snapshot), fsparam_u64("snapshot", Opt_snapshot),
fsparam_u32("max_channels", Opt_max_channels), fsparam_u32("max_channels", Opt_max_channels),
/* Mount options which take string value */ /* Mount options which take string value */
...@@ -1078,7 +1078,7 @@ static int smb3_fs_context_parse_param(struct fs_context *fc, ...@@ -1078,7 +1078,7 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
ctx->echo_interval = result.uint_32; ctx->echo_interval = result.uint_32;
break; break;
case Opt_snapshot: case Opt_snapshot:
ctx->snapshot_time = result.uint_32; ctx->snapshot_time = result.uint_64;
break; break;
case Opt_max_credits: case Opt_max_credits:
if (result.uint_32 < 20 || result.uint_32 > 60000) { if (result.uint_32 < 20 || result.uint_32 > 60000) {
......
...@@ -127,11 +127,6 @@ int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses) ...@@ -127,11 +127,6 @@ int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses)
struct cifs_server_iface *ifaces = NULL; struct cifs_server_iface *ifaces = NULL;
size_t iface_count; size_t iface_count;
if (ses->server->dialect < SMB30_PROT_ID) {
cifs_dbg(VFS, "multichannel is not supported on this protocol version, use 3.0 or above\n");
return 0;
}
spin_lock(&ses->chan_lock); spin_lock(&ses->chan_lock);
new_chan_count = old_chan_count = ses->chan_count; new_chan_count = old_chan_count = ses->chan_count;
...@@ -145,6 +140,12 @@ int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses) ...@@ -145,6 +140,12 @@ int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses)
return 0; return 0;
} }
if (ses->server->dialect < SMB30_PROT_ID) {
spin_unlock(&ses->chan_lock);
cifs_dbg(VFS, "multichannel is not supported on this protocol version, use 3.0 or above\n");
return 0;
}
if (!(ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) { if (!(ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
ses->chan_max = 1; ses->chan_max = 1;
spin_unlock(&ses->chan_lock); spin_unlock(&ses->chan_lock);
......
...@@ -175,11 +175,13 @@ static int cifs_xattr_set(const struct xattr_handler *handler, ...@@ -175,11 +175,13 @@ static int cifs_xattr_set(const struct xattr_handler *handler,
switch (handler->flags) { switch (handler->flags) {
case XATTR_CIFS_NTSD_FULL: case XATTR_CIFS_NTSD_FULL:
aclflags = (CIFS_ACL_OWNER | aclflags = (CIFS_ACL_OWNER |
CIFS_ACL_GROUP |
CIFS_ACL_DACL | CIFS_ACL_DACL |
CIFS_ACL_SACL); CIFS_ACL_SACL);
break; break;
case XATTR_CIFS_NTSD: case XATTR_CIFS_NTSD:
aclflags = (CIFS_ACL_OWNER | aclflags = (CIFS_ACL_OWNER |
CIFS_ACL_GROUP |
CIFS_ACL_DACL); CIFS_ACL_DACL);
break; break;
case XATTR_CIFS_ACL: case XATTR_CIFS_ACL:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment