1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2020, Microsoft Corporation.
5 * Author(s): Steve French <stfrench@microsoft.com>
6 * David Howells <dhowells@redhat.com>
10 #include <linux/module.h>
11 #include <linux/nsproxy.h>
12 #include <linux/slab.h>
13 #include <linux/magic.h>
14 #include <linux/security.h>
15 #include <net/net_namespace.h>
18 #include <linux/ctype.h>
19 #include <linux/fs_context.h>
20 #include <linux/fs_parser.h>
22 #include <linux/mount.h>
23 #include <linux/parser.h>
24 #include <linux/utsname.h>
28 #include "cifsproto.h"
29 #include "cifs_unicode.h"
30 #include "cifs_debug.h"
31 #include "cifs_fs_sb.h"
34 #include "rfc1002pdu.h"
35 #include "fs_context.h"
37 static const match_table_t cifs_smb_version_tokens = {
38 { Smb_1, SMB1_VERSION_STRING },
39 { Smb_20, SMB20_VERSION_STRING},
40 { Smb_21, SMB21_VERSION_STRING },
41 { Smb_30, SMB30_VERSION_STRING },
42 { Smb_302, SMB302_VERSION_STRING },
43 { Smb_302, ALT_SMB302_VERSION_STRING },
44 { Smb_311, SMB311_VERSION_STRING },
45 { Smb_311, ALT_SMB311_VERSION_STRING },
46 { Smb_3any, SMB3ANY_VERSION_STRING },
47 { Smb_default, SMBDEFAULT_VERSION_STRING },
48 { Smb_version_err, NULL }
51 static const match_table_t cifs_secflavor_tokens = {
52 { Opt_sec_krb5, "krb5" },
53 { Opt_sec_krb5i, "krb5i" },
54 { Opt_sec_krb5p, "krb5p" },
55 { Opt_sec_ntlmsspi, "ntlmsspi" },
56 { Opt_sec_ntlmssp, "ntlmssp" },
58 { Opt_sec_ntlmi, "ntlmi" },
59 { Opt_sec_ntlmv2, "nontlm" },
60 { Opt_sec_ntlmv2, "ntlmv2" },
61 { Opt_sec_ntlmv2i, "ntlmv2i" },
62 { Opt_sec_lanman, "lanman" },
63 { Opt_sec_none, "none" },
68 const struct fs_parameter_spec smb3_fs_parameters[] = {
69 /* Mount options that take no arguments */
70 fsparam_flag_no("user_xattr", Opt_user_xattr),
71 fsparam_flag_no("forceuid", Opt_forceuid),
72 fsparam_flag_no("multichannel", Opt_multichannel),
73 fsparam_flag_no("forcegid", Opt_forcegid),
74 fsparam_flag("noblocksend", Opt_noblocksend),
75 fsparam_flag("noautotune", Opt_noautotune),
76 fsparam_flag("nolease", Opt_nolease),
77 fsparam_flag_no("hard", Opt_hard),
78 fsparam_flag_no("soft", Opt_soft),
79 fsparam_flag_no("perm", Opt_perm),
80 fsparam_flag("nodelete", Opt_nodelete),
81 fsparam_flag_no("mapposix", Opt_mapposix),
82 fsparam_flag("mapchars", Opt_mapchars),
83 fsparam_flag("nomapchars", Opt_nomapchars),
84 fsparam_flag_no("sfu", Opt_sfu),
85 fsparam_flag("nodfs", Opt_nodfs),
86 fsparam_flag_no("posixpaths", Opt_posixpaths),
87 fsparam_flag_no("unix", Opt_unix),
88 fsparam_flag_no("linux", Opt_unix),
89 fsparam_flag_no("posix", Opt_unix),
90 fsparam_flag("nocase", Opt_nocase),
91 fsparam_flag("ignorecase", Opt_nocase),
92 fsparam_flag_no("brl", Opt_brl),
93 fsparam_flag_no("handlecache", Opt_handlecache),
94 fsparam_flag("forcemandatorylock", Opt_forcemandatorylock),
95 fsparam_flag("forcemand", Opt_forcemandatorylock),
96 fsparam_flag("setuidfromacl", Opt_setuidfromacl),
97 fsparam_flag_no("setuids", Opt_setuids),
98 fsparam_flag_no("dynperm", Opt_dynperm),
99 fsparam_flag_no("intr", Opt_intr),
100 fsparam_flag_no("strictsync", Opt_strictsync),
101 fsparam_flag_no("serverino", Opt_serverino),
102 fsparam_flag("rwpidforward", Opt_rwpidforward),
103 fsparam_flag("cifsacl", Opt_cifsacl),
104 fsparam_flag_no("acl", Opt_acl),
105 fsparam_flag("locallease", Opt_locallease),
106 fsparam_flag("sign", Opt_sign),
107 fsparam_flag("ignore_signature", Opt_ignore_signature),
108 fsparam_flag("seal", Opt_seal),
109 fsparam_flag("noac", Opt_noac),
110 fsparam_flag("fsc", Opt_fsc),
111 fsparam_flag("mfsymlinks", Opt_mfsymlinks),
112 fsparam_flag("multiuser", Opt_multiuser),
113 fsparam_flag("sloppy", Opt_sloppy),
114 fsparam_flag("nosharesock", Opt_nosharesock),
115 fsparam_flag_no("persistent", Opt_persistent),
116 fsparam_flag_no("resilient", Opt_resilient),
117 fsparam_flag("domainauto", Opt_domainauto),
118 fsparam_flag("rdma", Opt_rdma),
119 fsparam_flag("modesid", Opt_modesid),
120 fsparam_flag("rootfs", Opt_rootfs),
121 fsparam_flag("compress", Opt_compress),
122 fsparam_flag("witness", Opt_witness),
124 /* Mount options which take numeric value */
125 fsparam_u32("backupuid", Opt_backupuid),
126 fsparam_u32("backupgid", Opt_backupgid),
127 fsparam_u32("uid", Opt_uid),
128 fsparam_u32("cruid", Opt_cruid),
129 fsparam_u32("gid", Opt_gid),
130 fsparam_u32("file_mode", Opt_file_mode),
131 fsparam_u32("dirmode", Opt_dirmode),
132 fsparam_u32("dir_mode", Opt_dirmode),
133 fsparam_u32("port", Opt_port),
134 fsparam_u32("min_enc_offload", Opt_min_enc_offload),
135 fsparam_u32("bsize", Opt_blocksize),
136 fsparam_u32("rsize", Opt_rsize),
137 fsparam_u32("wsize", Opt_wsize),
138 fsparam_u32("actimeo", Opt_actimeo),
139 fsparam_u32("echo_interval", Opt_echo_interval),
140 fsparam_u32("max_credits", Opt_max_credits),
141 fsparam_u32("handletimeout", Opt_handletimeout),
142 fsparam_u32("snapshot", Opt_snapshot),
143 fsparam_u32("max_channels", Opt_max_channels),
145 /* Mount options which take string value */
146 fsparam_string("source", Opt_source),
147 fsparam_string("unc", Opt_source),
148 fsparam_string("user", Opt_user),
149 fsparam_string("username", Opt_user),
150 fsparam_string("pass", Opt_pass),
151 fsparam_string("password", Opt_pass),
152 fsparam_string("ip", Opt_ip),
153 fsparam_string("addr", Opt_ip),
154 fsparam_string("domain", Opt_domain),
155 fsparam_string("dom", Opt_domain),
156 fsparam_string("srcaddr", Opt_srcaddr),
157 fsparam_string("iocharset", Opt_iocharset),
158 fsparam_string("netbiosname", Opt_netbiosname),
159 fsparam_string("servern", Opt_servern),
160 fsparam_string("ver", Opt_ver),
161 fsparam_string("vers", Opt_vers),
162 fsparam_string("sec", Opt_sec),
163 fsparam_string("cache", Opt_cache),
165 /* Arguments that should be ignored */
166 fsparam_flag("guest", Opt_ignore),
167 fsparam_flag("noatime", Opt_ignore),
168 fsparam_flag("relatime", Opt_ignore),
169 fsparam_flag("_netdev", Opt_ignore),
170 fsparam_flag_no("suid", Opt_ignore),
171 fsparam_flag_no("exec", Opt_ignore),
172 fsparam_flag_no("dev", Opt_ignore),
173 fsparam_flag_no("mand", Opt_ignore),
174 fsparam_string("cred", Opt_ignore),
175 fsparam_string("credentials", Opt_ignore),
179 cifs_parse_security_flavors(char *value, struct smb3_fs_context *ctx)
182 substring_t args[MAX_OPT_ARGS];
185 * With mount options, the last one should win. Reset any existing
186 * settings back to default.
188 ctx->sectype = Unspecified;
191 switch (match_token(value, cifs_secflavor_tokens, args)) {
193 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
199 ctx->sectype = Kerberos;
201 case Opt_sec_ntlmsspi:
204 case Opt_sec_ntlmssp:
205 ctx->sectype = RawNTLMSSP;
213 case Opt_sec_ntlmv2i:
217 ctx->sectype = NTLMv2;
219 #ifdef CONFIG_CIFS_WEAK_PW_HASH
221 ctx->sectype = LANMAN;
228 cifs_dbg(VFS, "bad security option: %s\n", value);
235 static const match_table_t cifs_cacheflavor_tokens = {
236 { Opt_cache_loose, "loose" },
237 { Opt_cache_strict, "strict" },
238 { Opt_cache_none, "none" },
239 { Opt_cache_ro, "ro" },
240 { Opt_cache_rw, "singleclient" },
241 { Opt_cache_err, NULL }
245 cifs_parse_cache_flavor(char *value, struct smb3_fs_context *ctx)
247 substring_t args[MAX_OPT_ARGS];
249 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
250 case Opt_cache_loose:
251 ctx->direct_io = false;
252 ctx->strict_io = false;
253 ctx->cache_ro = false;
254 ctx->cache_rw = false;
256 case Opt_cache_strict:
257 ctx->direct_io = false;
258 ctx->strict_io = true;
259 ctx->cache_ro = false;
260 ctx->cache_rw = false;
263 ctx->direct_io = true;
264 ctx->strict_io = false;
265 ctx->cache_ro = false;
266 ctx->cache_rw = false;
269 ctx->direct_io = false;
270 ctx->strict_io = false;
271 ctx->cache_ro = true;
272 ctx->cache_rw = false;
275 ctx->direct_io = false;
276 ctx->strict_io = false;
277 ctx->cache_ro = false;
278 ctx->cache_rw = true;
281 cifs_dbg(VFS, "bad cache= option: %s\n", value);
287 #define DUP_CTX_STR(field) \
290 new_ctx->field = kstrdup(ctx->field, GFP_ATOMIC); \
291 if (new_ctx->field == NULL) { \
292 cifs_cleanup_volume_info_contents(new_ctx); \
299 smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx)
303 memcpy(new_ctx, ctx, sizeof(*ctx));
304 new_ctx->prepath = NULL;
305 new_ctx->mount_options = NULL;
306 new_ctx->local_nls = NULL;
307 new_ctx->nodename = NULL;
308 new_ctx->username = NULL;
309 new_ctx->password = NULL;
310 new_ctx->domainname = NULL;
312 new_ctx->iocharset = NULL;
315 * Make sure to stay in sync with cifs_cleanup_volume_info_contents()
317 DUP_CTX_STR(prepath);
318 DUP_CTX_STR(mount_options);
319 DUP_CTX_STR(username);
320 DUP_CTX_STR(password);
322 DUP_CTX_STR(domainname);
323 DUP_CTX_STR(nodename);
324 DUP_CTX_STR(iocharset);
330 cifs_parse_smb_version(char *value, struct smb3_fs_context *ctx, bool is_smb3)
332 substring_t args[MAX_OPT_ARGS];
334 switch (match_token(value, cifs_smb_version_tokens, args)) {
335 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
337 if (disable_legacy_dialects) {
338 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
342 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
345 cifs_dbg(VFS, "Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers\n");
346 ctx->ops = &smb1_operations;
347 ctx->vals = &smb1_values;
350 if (disable_legacy_dialects) {
351 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
355 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
358 ctx->ops = &smb20_operations;
359 ctx->vals = &smb20_values;
363 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
366 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
368 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
370 ctx->ops = &smb21_operations;
371 ctx->vals = &smb21_values;
374 ctx->ops = &smb30_operations;
375 ctx->vals = &smb30_values;
378 ctx->ops = &smb30_operations; /* currently identical with 3.0 */
379 ctx->vals = &smb302_values;
382 ctx->ops = &smb311_operations;
383 ctx->vals = &smb311_values;
386 ctx->ops = &smb30_operations; /* currently identical with 3.0 */
387 ctx->vals = &smb3any_values;
390 ctx->ops = &smb30_operations; /* currently identical with 3.0 */
391 ctx->vals = &smbdefault_values;
394 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
401 * Parse a devname into substrings and populate the ctx->UNC and ctx->prepath
402 * fields with the result. Returns 0 on success and an error otherwise
403 * (e.g. ENOMEM or EINVAL)
406 smb3_parse_devname(const char *devname, struct smb3_fs_context *ctx)
409 const char *delims = "/\\";
412 if (unlikely(!devname || !*devname)) {
413 cifs_dbg(VFS, "Device name not specified\n");
417 /* make sure we have a valid UNC double delimiter prefix */
418 len = strspn(devname, delims);
422 /* find delimiter between host and sharename */
423 pos = strpbrk(devname + 2, delims);
427 /* skip past delimiter */
430 /* now go until next delimiter or end of string */
431 len = strcspn(pos, delims);
433 /* move "pos" up to delimiter or NULL */
435 ctx->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
439 convert_delimiter(ctx->UNC, '\\');
441 /* skip any delimiter */
442 if (*pos == '/' || *pos == '\\')
445 /* If pos is NULL then no prepath */
449 ctx->prepath = kstrdup(pos, GFP_KERNEL);
456 static void smb3_fs_context_free(struct fs_context *fc);
457 static int smb3_fs_context_parse_param(struct fs_context *fc,
458 struct fs_parameter *param);
459 static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
461 static int smb3_get_tree(struct fs_context *fc);
462 static int smb3_reconfigure(struct fs_context *fc);
464 static const struct fs_context_operations smb3_fs_context_ops = {
465 .free = smb3_fs_context_free,
466 .parse_param = smb3_fs_context_parse_param,
467 .parse_monolithic = smb3_fs_context_parse_monolithic,
468 .get_tree = smb3_get_tree,
469 .reconfigure = smb3_reconfigure,
473 * Parse a monolithic block of data from sys_mount().
474 * smb3_fs_context_parse_monolithic - Parse key[=val][,key[=val]]* mount data
475 * @ctx: The superblock configuration to fill in.
476 * @data: The data to parse
478 * Parse a blob of data that's in key[=val][,key[=val]]* form. This can be
479 * called from the ->monolithic_mount_data() fs_context operation.
481 * Returns 0 on success or the error returned by the ->parse_option() fs_context
482 * operation on failure.
484 static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
487 struct smb3_fs_context *ctx = smb3_fc2context(fc);
488 char *options = data, *key;
494 ctx->mount_options = kstrdup(data, GFP_KERNEL);
495 if (ctx->mount_options == NULL)
498 ret = security_sb_eat_lsm_opts(options, &fc->security);
502 /* BB Need to add support for sep= here TBD */
503 while ((key = strsep(&options, ",")) != NULL) {
506 char *value = strchr(key, '=');
512 v_len = strlen(value);
514 ret = vfs_parse_fs_string(fc, key, value, v_len);
524 * Validate the preparsed information in the config.
526 static int smb3_fs_context_validate(struct fs_context *fc)
528 struct smb3_fs_context *ctx = smb3_fc2context(fc);
530 if (ctx->rdma && ctx->vals->protocol_id < SMB30_PROT_ID) {
531 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
536 /* Muliuser mounts require CONFIG_KEYS support */
537 if (ctx->multiuser) {
538 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
543 if (ctx->got_version == false)
544 pr_warn_once("No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3.1.1), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3.1.1 (or even SMB3 or SMB2.1) specify vers=1.0 on mount.\n");
548 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
552 /* make sure UNC has a share name */
553 if (strlen(ctx->UNC) < 3 || !strchr(ctx->UNC + 3, '\\')) {
554 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
562 /* No ip= option specified? Try to get it from UNC */
563 /* Use the address part of the UNC. */
564 slash = strchr(&ctx->UNC[2], '\\');
565 len = slash - &ctx->UNC[2];
566 if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
567 &ctx->UNC[2], len)) {
568 pr_err("Unable to determine destination address\n");
573 /* set the port that we got earlier */
574 cifs_set_port((struct sockaddr *)&ctx->dstaddr, ctx->port);
576 if (ctx->override_uid && !ctx->uid_specified) {
577 ctx->override_uid = 0;
578 pr_notice("ignoring forceuid mount option specified with no uid= option\n");
581 if (ctx->override_gid && !ctx->gid_specified) {
582 ctx->override_gid = 0;
583 pr_notice("ignoring forcegid mount option specified with no gid= option\n");
589 static int smb3_get_tree_common(struct fs_context *fc)
591 struct smb3_fs_context *ctx = smb3_fc2context(fc);
595 root = cifs_smb3_do_mount(fc->fs_type, 0, ctx);
597 return PTR_ERR(root);
605 * Create an SMB3 superblock from the parameters passed.
607 static int smb3_get_tree(struct fs_context *fc)
609 int err = smb3_fs_context_validate(fc);
613 return smb3_get_tree_common(fc);
616 static void smb3_fs_context_free(struct fs_context *fc)
618 struct smb3_fs_context *ctx = smb3_fc2context(fc);
620 cifs_cleanup_volume_info(ctx);
623 static int smb3_reconfigure(struct fs_context *fc)
625 // TODO: struct smb3_fs_context *ctx = smb3_fc2context(fc);
627 /* FIXME : add actual reconfigure */
631 static int smb3_fs_context_parse_param(struct fs_context *fc,
632 struct fs_parameter *param)
634 struct fs_parse_result result;
635 struct smb3_fs_context *ctx = smb3_fc2context(fc);
637 bool is_smb3 = !strcmp(fc->fs_type->name, "smb3");
638 bool skip_parsing = false;
640 cifs_dbg(FYI, "CIFS: parsing cifs mount option '%s'\n", param->key);
643 * fs_parse can not handle string options with an empty value so
644 * we will need special handling of them.
646 if (param->type == fs_value_is_string && param->string[0] == 0) {
647 if (!strcmp("pass", param->key) || !strcmp("password", param->key))
652 opt = fs_parse(fc, smb3_fs_parameters, param, &result);
654 return ctx->sloppy ? 1 : opt;
659 ctx->compression = UNKNOWN_TYPE;
661 "SMB3 compression support is experimental\n");
683 ctx->sfu_remap = false; /* disable SFU mapping */
694 ctx->override_uid = 0;
696 ctx->override_uid = 1;
700 ctx->override_gid = 0;
702 ctx->override_gid = 1;
722 case Opt_noblocksend:
734 case Opt_multichannel:
735 if (result.negated) {
736 ctx->multichannel = false;
737 ctx->max_channels = 1;
739 ctx->multichannel = true;
740 /* if number of channels not specified, default to 2 */
741 if (ctx->max_channels < 2)
742 ctx->max_channels = 2;
746 ctx->linux_uid.val = result.uint_32;
747 ctx->uid_specified = true;
750 ctx->cred_uid.val = result.uint_32;
753 ctx->backupgid.val = result.uint_32;
754 ctx->backupgid_specified = true;
757 ctx->linux_gid.val = result.uint_32;
758 ctx->gid_specified = true;
761 ctx->port = result.uint_32;
764 ctx->file_mode = result.uint_32;
767 ctx->dir_mode = result.uint_32;
769 case Opt_min_enc_offload:
770 ctx->min_offload = result.uint_32;
774 * inode blocksize realistically should never need to be
775 * less than 16K or greater than 16M and default is 1MB.
776 * Note that small inode block sizes (e.g. 64K) can lead
777 * to very poor performance of common tools like cp and scp
779 if ((result.uint_32 < CIFS_MAX_MSGSIZE) ||
780 (result.uint_32 > (4 * SMB3_DEFAULT_IOSIZE))) {
781 cifs_dbg(VFS, "%s: Invalid blocksize\n",
783 goto cifs_parse_mount_err;
785 ctx->bsize = result.uint_32;
788 ctx->rsize = result.uint_32;
791 ctx->wsize = result.uint_32;
794 ctx->actimeo = HZ * result.uint_32;
795 if (ctx->actimeo > CIFS_MAX_ACTIMEO) {
796 cifs_dbg(VFS, "attribute cache timeout too large\n");
797 goto cifs_parse_mount_err;
800 case Opt_echo_interval:
801 ctx->echo_interval = result.uint_32;
804 ctx->snapshot_time = result.uint_32;
806 case Opt_max_credits:
807 if (result.uint_32 < 20 || result.uint_32 > 60000) {
808 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
810 goto cifs_parse_mount_err;
812 ctx->max_credits = result.uint_32;
814 case Opt_max_channels:
815 if (result.uint_32 < 1 || result.uint_32 > CIFS_MAX_CHANNELS) {
816 cifs_dbg(VFS, "%s: Invalid max_channels value, needs to be 1-%d\n",
817 __func__, CIFS_MAX_CHANNELS);
818 goto cifs_parse_mount_err;
820 ctx->max_channels = result.uint_32;
822 case Opt_handletimeout:
823 ctx->handle_timeout = result.uint_32;
824 if (ctx->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
825 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
826 goto cifs_parse_mount_err;
832 switch (smb3_parse_devname(param->string, ctx)) {
836 cifs_dbg(VFS, "Unable to allocate memory for devname\n");
837 goto cifs_parse_mount_err;
839 cifs_dbg(VFS, "Malformed UNC in devname\n");
840 goto cifs_parse_mount_err;
842 cifs_dbg(VFS, "Unknown error parsing devname\n");
843 goto cifs_parse_mount_err;
845 fc->source = kstrdup(param->string, GFP_KERNEL);
846 if (fc->source == NULL) {
847 cifs_dbg(VFS, "OOM when copying UNC string\n");
848 goto cifs_parse_mount_err;
852 kfree(ctx->username);
853 ctx->username = NULL;
854 if (strlen(param->string) == 0) {
855 /* null user, ie. anonymous authentication */
860 if (strnlen(param->string, CIFS_MAX_USERNAME_LEN) >
861 CIFS_MAX_USERNAME_LEN) {
862 pr_warn("username too long\n");
863 goto cifs_parse_mount_err;
865 ctx->username = kstrdup(param->string, GFP_KERNEL);
866 if (ctx->username == NULL) {
867 cifs_dbg(VFS, "OOM when copying username string\n");
868 goto cifs_parse_mount_err;
872 kfree(ctx->password);
873 ctx->password = NULL;
874 if (strlen(param->string) == 0)
877 ctx->password = kstrdup(param->string, GFP_KERNEL);
878 if (ctx->password == NULL) {
879 cifs_dbg(VFS, "OOM when copying password string\n");
880 goto cifs_parse_mount_err;
884 if (strlen(param->string) == 0) {
888 if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
890 strlen(param->string))) {
891 pr_err("bad ip= option (%s)\n", param->string);
892 goto cifs_parse_mount_err;
897 if (strnlen(param->string, CIFS_MAX_DOMAINNAME_LEN)
898 == CIFS_MAX_DOMAINNAME_LEN) {
899 pr_warn("domain name too long\n");
900 goto cifs_parse_mount_err;
903 kfree(ctx->domainname);
904 ctx->domainname = kstrdup(param->string, GFP_KERNEL);
905 if (ctx->domainname == NULL) {
906 cifs_dbg(VFS, "OOM when copying domainname string\n");
907 goto cifs_parse_mount_err;
909 cifs_dbg(FYI, "Domain name set\n");
912 if (!cifs_convert_address(
913 (struct sockaddr *)&ctx->srcaddr,
914 param->string, strlen(param->string))) {
915 pr_warn("Could not parse srcaddr: %s\n",
917 goto cifs_parse_mount_err;
921 if (strnlen(param->string, 1024) >= 65) {
922 pr_warn("iocharset name too long\n");
923 goto cifs_parse_mount_err;
926 if (strncasecmp(param->string, "default", 7) != 0) {
927 kfree(ctx->iocharset);
928 ctx->iocharset = kstrdup(param->string, GFP_KERNEL);
929 if (ctx->iocharset == NULL) {
930 cifs_dbg(VFS, "OOM when copying iocharset string\n");
931 goto cifs_parse_mount_err;
934 /* if iocharset not set then load_nls_default
937 cifs_dbg(FYI, "iocharset set to %s\n", ctx->iocharset);
939 case Opt_netbiosname:
940 memset(ctx->source_rfc1001_name, 0x20,
943 * FIXME: are there cases in which a comma can
944 * be valid in workstation netbios name (and
945 * need special handling)?
947 for (i = 0; i < RFC1001_NAME_LEN; i++) {
948 /* don't ucase netbiosname for user */
949 if (param->string[i] == 0)
951 ctx->source_rfc1001_name[i] = param->string[i];
953 /* The string has 16th byte zero still from
954 * set at top of the function
956 if (i == RFC1001_NAME_LEN && param->string[i] != 0)
957 pr_warn("netbiosname longer than 15 truncated\n");
960 /* last byte, type, is 0x20 for servr type */
961 memset(ctx->target_rfc1001_name, 0x20,
962 RFC1001_NAME_LEN_WITH_NULL);
964 * BB are there cases in which a comma can be valid in this
965 * workstation netbios name (and need special handling)?
968 /* user or mount helper must uppercase the netbios name */
969 for (i = 0; i < 15; i++) {
970 if (param->string[i] == 0)
972 ctx->target_rfc1001_name[i] = param->string[i];
975 /* The string has 16th byte zero still from set at top of function */
976 if (i == RFC1001_NAME_LEN && param->string[i] != 0)
977 pr_warn("server netbiosname longer than 15 truncated\n");
980 /* version of mount userspace tools, not dialect */
981 /* If interface changes in mount.cifs bump to new ver */
982 if (strncasecmp(param->string, "1", 1) == 0) {
983 if (strlen(param->string) > 1) {
984 pr_warn("Bad mount helper ver=%s. Did you want SMB1 (CIFS) dialect and mean to type vers=1.0 instead?\n",
986 goto cifs_parse_mount_err;
988 /* This is the default */
991 /* For all other value, error */
992 pr_warn("Invalid mount helper version specified\n");
993 goto cifs_parse_mount_err;
995 /* protocol version (dialect) */
996 if (cifs_parse_smb_version(param->string, ctx, is_smb3) != 0)
997 goto cifs_parse_mount_err;
998 ctx->got_version = true;
1001 if (cifs_parse_security_flavors(param->string, ctx) != 0)
1002 goto cifs_parse_mount_err;
1005 if (cifs_parse_cache_flavor(param->string, ctx) != 0)
1006 goto cifs_parse_mount_err;
1009 #ifndef CONFIG_CIFS_SWN_UPCALL
1010 cifs_dbg(VFS, "Witness support needs CONFIG_CIFS_SWN_UPCALL config option\n");
1011 goto cifs_parse_mount_err;
1013 ctx->witness = true;
1016 #ifdef CONFIG_CIFS_ROOT
1020 case Opt_posixpaths:
1022 ctx->posix_paths = 0;
1024 ctx->posix_paths = 1;
1030 ctx->no_linux_ext = 1;
1036 if (result.negated) {
1038 * turn off mandatory locking in mode
1039 * if remote locking is turned off since the
1040 * local vfs will do advisory
1042 if (ctx->file_mode ==
1043 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1044 ctx->file_mode = S_IALLUGO;
1049 case Opt_handlecache:
1051 ctx->nohandlecache = 1;
1053 ctx->nohandlecache = 0;
1055 case Opt_forcemandatorylock:
1059 ctx->setuids = result.negated;
1062 ctx->intr = !result.negated;
1064 case Opt_setuidfromacl:
1065 ctx->setuidfromacl = 1;
1067 case Opt_strictsync:
1068 ctx->nostrictsync = result.negated;
1071 ctx->server_ino = !result.negated;
1073 case Opt_rwpidforward:
1074 ctx->rwpidforward = 1;
1080 ctx->cifs_acl = !result.negated;
1083 ctx->no_psx_acl = result.negated;
1085 case Opt_locallease:
1086 ctx->local_lease = 1;
1091 case Opt_ignore_signature:
1093 ctx->ignore_signature = true;
1096 /* we do not do the following in secFlags because seal
1097 * is a per tree connection (mount) not a per socket
1098 * or per-smb connection option in the protocol
1099 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1104 pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1107 #ifndef CONFIG_CIFS_FSCACHE
1108 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1109 goto cifs_parse_mount_err;
1113 case Opt_mfsymlinks:
1114 ctx->mfsymlinks = true;
1117 ctx->multiuser = true;
1122 case Opt_nosharesock:
1123 ctx->nosharesock = true;
1125 case Opt_persistent:
1126 if (result.negated) {
1127 if ((ctx->nopersistent) || (ctx->resilient)) {
1129 "persistenthandles mount options conflict\n");
1130 goto cifs_parse_mount_err;
1133 ctx->nopersistent = true;
1134 if (ctx->persistent) {
1136 "persistenthandles mount options conflict\n");
1137 goto cifs_parse_mount_err;
1142 if (result.negated) {
1143 ctx->resilient = false; /* already the default */
1145 ctx->resilient = true;
1146 if (ctx->persistent) {
1148 "persistenthandles mount options conflict\n");
1149 goto cifs_parse_mount_err;
1153 case Opt_domainauto:
1154 ctx->domainauto = true;
1163 cifs_parse_mount_err:
1167 int smb3_init_fs_context(struct fs_context *fc)
1169 struct smb3_fs_context *ctx;
1170 char *nodename = utsname()->nodename;
1173 ctx = kzalloc(sizeof(struct smb3_fs_context), GFP_KERNEL);
1178 * does not have to be perfect mapping since field is
1179 * informational, only used for servers that do not support
1180 * port 445 and it can be overridden at mount time
1182 memset(ctx->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1183 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1184 ctx->source_rfc1001_name[i] = toupper(nodename[i]);
1186 ctx->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1188 * null target name indicates to use *SMBSERVR default called name
1189 * if we end up sending RFC1001 session initialize
1191 ctx->target_rfc1001_name[0] = 0;
1192 ctx->cred_uid = current_uid();
1193 ctx->linux_uid = current_uid();
1194 ctx->linux_gid = current_gid();
1195 ctx->bsize = 1024 * 1024; /* can improve cp performance significantly */
1198 * default to SFM style remapping of seven reserved characters
1199 * unless user overrides it or we negotiate CIFS POSIX where
1200 * it is unnecessary. Can not simultaneously use more than one mapping
1201 * since then readdir could list files that open could not open
1205 /* default to only allowing write access to owner of the mount */
1206 ctx->dir_mode = ctx->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1208 /* ctx->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1209 /* default is always to request posix paths. */
1210 ctx->posix_paths = 1;
1211 /* default to using server inode numbers where available */
1212 ctx->server_ino = 1;
1214 /* default is to use strict cifs caching semantics */
1215 ctx->strict_io = true;
1217 ctx->actimeo = CIFS_DEF_ACTIMEO;
1219 /* Most clients set timeout to 0, allows server to use its default */
1220 ctx->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1222 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1223 ctx->ops = &smb30_operations;
1224 ctx->vals = &smbdefault_values;
1226 ctx->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1228 /* default to no multichannel (single server connection) */
1229 ctx->multichannel = false;
1230 ctx->max_channels = 1;
1232 ctx->backupuid_specified = false; /* no backup intent for a user */
1233 ctx->backupgid_specified = false; /* no backup intent for a group */
1236 * short int override_uid = -1;
1237 * short int override_gid = -1;
1238 * char *nodename = strdup(utsname()->nodename);
1239 * struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1242 fc->fs_private = ctx;
1243 fc->ops = &smb3_fs_context_ops;