1 /*
2 * fs/cifs/connect.c
3 *
4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
6 *
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21 #include <linux/fs.h>
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/signal.h>
25 #include <linux/list.h>
26 #include <linux/wait.h>
27 #include <linux/slab.h>
28 #include <linux/pagemap.h>
29 #include <linux/ctype.h>
30 #include <linux/utsname.h>
31 #include <linux/mempool.h>
32 #include <linux/delay.h>
33 #include <linux/completion.h>
34 #include <linux/kthread.h>
35 #include <linux/pagevec.h>
36 #include <linux/freezer.h>
37 #include <linux/namei.h>
38 #include <linux/uuid.h>
39 #include <linux/uaccess.h>
40 #include <asm/processor.h>
41 #include <linux/inet.h>
42 #include <linux/module.h>
43 #include <keys/user-type.h>
44 #include <net/ipv6.h>
45 #include <linux/parser.h>
46 #include <linux/bvec.h>
47 #include "cifspdu.h"
48 #include "cifsglob.h"
49 #include "cifsproto.h"
50 #include "cifs_unicode.h"
51 #include "cifs_debug.h"
52 #include "cifs_fs_sb.h"
53 #include "ntlmssp.h"
54 #include "nterr.h"
55 #include "rfc1002pdu.h"
56 #include "fscache.h"
57 #include "smb2proto.h"
58 #include "smbdirect.h"
59 #include "dns_resolve.h"
60 #include "cifsfs.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
63 #endif
64
65 extern mempool_t *cifs_req_poolp;
66 extern bool disable_legacy_dialects;
67
68 /* FIXME: should these be tunable? */
69 #define TLINK_ERROR_EXPIRE (1 * HZ)
70 #define TLINK_IDLE_EXPIRE (600 * HZ)
71
72 enum {
73 /* Mount options that take no arguments */
74 Opt_user_xattr, Opt_nouser_xattr,
75 Opt_forceuid, Opt_noforceuid,
76 Opt_forcegid, Opt_noforcegid,
77 Opt_noblocksend, Opt_noautotune, Opt_nolease,
78 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
79 Opt_mapposix, Opt_nomapposix,
80 Opt_mapchars, Opt_nomapchars, Opt_sfu,
81 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
82 Opt_noposixpaths, Opt_nounix, Opt_unix,
83 Opt_nocase,
84 Opt_brl, Opt_nobrl,
85 Opt_handlecache, Opt_nohandlecache,
86 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
87 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
88 Opt_nohard, Opt_nosoft,
89 Opt_nointr, Opt_intr,
90 Opt_nostrictsync, Opt_strictsync,
91 Opt_serverino, Opt_noserverino,
92 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
93 Opt_acl, Opt_noacl, Opt_locallease,
94 Opt_sign, Opt_ignore_signature, Opt_seal, Opt_noac,
95 Opt_fsc, Opt_mfsymlinks,
96 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
97 Opt_persistent, Opt_nopersistent,
98 Opt_resilient, Opt_noresilient,
99 Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs,
100 Opt_compress,
101
102 /* Mount options which take numeric value */
103 Opt_backupuid, Opt_backupgid, Opt_uid,
104 Opt_cruid, Opt_gid, Opt_file_mode,
105 Opt_dirmode, Opt_port,
106 Opt_min_enc_offload,
107 Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
108 Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
109 Opt_snapshot,
110
111 /* Mount options which take string value */
112 Opt_user, Opt_pass, Opt_ip,
113 Opt_domain, Opt_srcaddr, Opt_iocharset,
114 Opt_netbiosname, Opt_servern,
115 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
116
117 /* Mount options to be ignored */
118 Opt_ignore,
119
120 /* Options which could be blank */
121 Opt_blank_pass,
122 Opt_blank_user,
123 Opt_blank_ip,
124
125 Opt_err
126 };
127
128 static const match_table_t cifs_mount_option_tokens = {
129
130 { Opt_user_xattr, "user_xattr" },
131 { Opt_nouser_xattr, "nouser_xattr" },
132 { Opt_forceuid, "forceuid" },
133 { Opt_noforceuid, "noforceuid" },
134 { Opt_forcegid, "forcegid" },
135 { Opt_noforcegid, "noforcegid" },
136 { Opt_noblocksend, "noblocksend" },
137 { Opt_noautotune, "noautotune" },
138 { Opt_nolease, "nolease" },
139 { Opt_hard, "hard" },
140 { Opt_soft, "soft" },
141 { Opt_perm, "perm" },
142 { Opt_noperm, "noperm" },
143 { Opt_mapchars, "mapchars" }, /* SFU style */
144 { Opt_nomapchars, "nomapchars" },
145 { Opt_mapposix, "mapposix" }, /* SFM style */
146 { Opt_nomapposix, "nomapposix" },
147 { Opt_sfu, "sfu" },
148 { Opt_nosfu, "nosfu" },
149 { Opt_nodfs, "nodfs" },
150 { Opt_posixpaths, "posixpaths" },
151 { Opt_noposixpaths, "noposixpaths" },
152 { Opt_nounix, "nounix" },
153 { Opt_nounix, "nolinux" },
154 { Opt_nounix, "noposix" },
155 { Opt_unix, "unix" },
156 { Opt_unix, "linux" },
157 { Opt_unix, "posix" },
158 { Opt_nocase, "nocase" },
159 { Opt_nocase, "ignorecase" },
160 { Opt_brl, "brl" },
161 { Opt_nobrl, "nobrl" },
162 { Opt_handlecache, "handlecache" },
163 { Opt_nohandlecache, "nohandlecache" },
164 { Opt_nobrl, "nolock" },
165 { Opt_forcemandatorylock, "forcemandatorylock" },
166 { Opt_forcemandatorylock, "forcemand" },
167 { Opt_setuids, "setuids" },
168 { Opt_nosetuids, "nosetuids" },
169 { Opt_setuidfromacl, "idsfromsid" },
170 { Opt_dynperm, "dynperm" },
171 { Opt_nodynperm, "nodynperm" },
172 { Opt_nohard, "nohard" },
173 { Opt_nosoft, "nosoft" },
174 { Opt_nointr, "nointr" },
175 { Opt_intr, "intr" },
176 { Opt_nostrictsync, "nostrictsync" },
177 { Opt_strictsync, "strictsync" },
178 { Opt_serverino, "serverino" },
179 { Opt_noserverino, "noserverino" },
180 { Opt_rwpidforward, "rwpidforward" },
181 { Opt_modesid, "modefromsid" },
182 { Opt_cifsacl, "cifsacl" },
183 { Opt_nocifsacl, "nocifsacl" },
184 { Opt_acl, "acl" },
185 { Opt_noacl, "noacl" },
186 { Opt_locallease, "locallease" },
187 { Opt_sign, "sign" },
188 { Opt_ignore_signature, "signloosely" },
189 { Opt_seal, "seal" },
190 { Opt_noac, "noac" },
191 { Opt_fsc, "fsc" },
192 { Opt_mfsymlinks, "mfsymlinks" },
193 { Opt_multiuser, "multiuser" },
194 { Opt_sloppy, "sloppy" },
195 { Opt_nosharesock, "nosharesock" },
196 { Opt_persistent, "persistenthandles"},
197 { Opt_nopersistent, "nopersistenthandles"},
198 { Opt_resilient, "resilienthandles"},
199 { Opt_noresilient, "noresilienthandles"},
200 { Opt_domainauto, "domainauto"},
201 { Opt_rdma, "rdma"},
202
203 { Opt_backupuid, "backupuid=%s" },
204 { Opt_backupgid, "backupgid=%s" },
205 { Opt_uid, "uid=%s" },
206 { Opt_cruid, "cruid=%s" },
207 { Opt_gid, "gid=%s" },
208 { Opt_file_mode, "file_mode=%s" },
209 { Opt_dirmode, "dirmode=%s" },
210 { Opt_dirmode, "dir_mode=%s" },
211 { Opt_port, "port=%s" },
212 { Opt_min_enc_offload, "esize=%s" },
213 { Opt_blocksize, "bsize=%s" },
214 { Opt_rsize, "rsize=%s" },
215 { Opt_wsize, "wsize=%s" },
216 { Opt_actimeo, "actimeo=%s" },
217 { Opt_handletimeout, "handletimeout=%s" },
218 { Opt_echo_interval, "echo_interval=%s" },
219 { Opt_max_credits, "max_credits=%s" },
220 { Opt_snapshot, "snapshot=%s" },
221 { Opt_compress, "compress=%s" },
222
223 { Opt_blank_user, "user=" },
224 { Opt_blank_user, "username=" },
225 { Opt_user, "user=%s" },
226 { Opt_user, "username=%s" },
227 { Opt_blank_pass, "pass=" },
228 { Opt_blank_pass, "password=" },
229 { Opt_pass, "pass=%s" },
230 { Opt_pass, "password=%s" },
231 { Opt_blank_ip, "ip=" },
232 { Opt_blank_ip, "addr=" },
233 { Opt_ip, "ip=%s" },
234 { Opt_ip, "addr=%s" },
235 { Opt_ignore, "unc=%s" },
236 { Opt_ignore, "target=%s" },
237 { Opt_ignore, "path=%s" },
238 { Opt_domain, "dom=%s" },
239 { Opt_domain, "domain=%s" },
240 { Opt_domain, "workgroup=%s" },
241 { Opt_srcaddr, "srcaddr=%s" },
242 { Opt_ignore, "prefixpath=%s" },
243 { Opt_iocharset, "iocharset=%s" },
244 { Opt_netbiosname, "netbiosname=%s" },
245 { Opt_servern, "servern=%s" },
246 { Opt_ver, "ver=%s" },
247 { Opt_vers, "vers=%s" },
248 { Opt_sec, "sec=%s" },
249 { Opt_cache, "cache=%s" },
250
251 { Opt_ignore, "cred" },
252 { Opt_ignore, "credentials" },
253 { Opt_ignore, "cred=%s" },
254 { Opt_ignore, "credentials=%s" },
255 { Opt_ignore, "guest" },
256 { Opt_ignore, "rw" },
257 { Opt_ignore, "ro" },
258 { Opt_ignore, "suid" },
259 { Opt_ignore, "nosuid" },
260 { Opt_ignore, "exec" },
261 { Opt_ignore, "noexec" },
262 { Opt_ignore, "nodev" },
263 { Opt_ignore, "noauto" },
264 { Opt_ignore, "dev" },
265 { Opt_ignore, "mand" },
266 { Opt_ignore, "nomand" },
267 { Opt_ignore, "relatime" },
268 { Opt_ignore, "_netdev" },
269 { Opt_rootfs, "rootfs" },
270
271 { Opt_err, NULL }
272 };
273
274 enum {
275 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
276 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
277 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
278 Opt_sec_ntlmv2i, Opt_sec_lanman,
279 Opt_sec_none,
280
281 Opt_sec_err
282 };
283
284 static const match_table_t cifs_secflavor_tokens = {
285 { Opt_sec_krb5, "krb5" },
286 { Opt_sec_krb5i, "krb5i" },
287 { Opt_sec_krb5p, "krb5p" },
288 { Opt_sec_ntlmsspi, "ntlmsspi" },
289 { Opt_sec_ntlmssp, "ntlmssp" },
290 { Opt_ntlm, "ntlm" },
291 { Opt_sec_ntlmi, "ntlmi" },
292 { Opt_sec_ntlmv2, "nontlm" },
293 { Opt_sec_ntlmv2, "ntlmv2" },
294 { Opt_sec_ntlmv2i, "ntlmv2i" },
295 { Opt_sec_lanman, "lanman" },
296 { Opt_sec_none, "none" },
297
298 { Opt_sec_err, NULL }
299 };
300
301 /* cache flavors */
302 enum {
303 Opt_cache_loose,
304 Opt_cache_strict,
305 Opt_cache_none,
306 Opt_cache_ro,
307 Opt_cache_rw,
308 Opt_cache_err
309 };
310
311 static const match_table_t cifs_cacheflavor_tokens = {
312 { Opt_cache_loose, "loose" },
313 { Opt_cache_strict, "strict" },
314 { Opt_cache_none, "none" },
315 { Opt_cache_ro, "ro" },
316 { Opt_cache_rw, "singleclient" },
317 { Opt_cache_err, NULL }
318 };
319
320 static const match_table_t cifs_smb_version_tokens = {
321 { Smb_1, SMB1_VERSION_STRING },
322 { Smb_20, SMB20_VERSION_STRING},
323 { Smb_21, SMB21_VERSION_STRING },
324 { Smb_30, SMB30_VERSION_STRING },
325 { Smb_302, SMB302_VERSION_STRING },
326 { Smb_302, ALT_SMB302_VERSION_STRING },
327 { Smb_311, SMB311_VERSION_STRING },
328 { Smb_311, ALT_SMB311_VERSION_STRING },
329 { Smb_3any, SMB3ANY_VERSION_STRING },
330 { Smb_default, SMBDEFAULT_VERSION_STRING },
331 { Smb_version_err, NULL }
332 };
333
334 static int ip_connect(struct TCP_Server_Info *server);
335 static int generic_ip_connect(struct TCP_Server_Info *server);
336 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
337 static void cifs_prune_tlinks(struct work_struct *work);
338 static char *extract_hostname(const char *unc);
339
340 /*
341 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
342 * get their ip addresses changed at some point.
343 *
344 * This should be called with server->srv_mutex held.
345 */
346 #ifdef CONFIG_CIFS_DFS_UPCALL
reconn_set_ipaddr(struct TCP_Server_Info * server)347 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
348 {
349 int rc;
350 int len;
351 char *unc, *ipaddr = NULL;
352
353 if (!server->hostname)
354 return -EINVAL;
355
356 len = strlen(server->hostname) + 3;
357
358 unc = kmalloc(len, GFP_KERNEL);
359 if (!unc) {
360 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
361 return -ENOMEM;
362 }
363 scnprintf(unc, len, "\\\\%s", server->hostname);
364
365 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
366 kfree(unc);
367
368 if (rc < 0) {
369 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
370 __func__, server->hostname, rc);
371 return rc;
372 }
373
374 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
375 strlen(ipaddr));
376 kfree(ipaddr);
377
378 return !rc ? -1 : 0;
379 }
380 #else
reconn_set_ipaddr(struct TCP_Server_Info * server)381 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
382 {
383 return 0;
384 }
385 #endif
386
387 #ifdef CONFIG_CIFS_DFS_UPCALL
388 struct super_cb_data {
389 struct TCP_Server_Info *server;
390 struct super_block *sb;
391 };
392
393 /* These functions must be called with server->srv_mutex held */
394
super_cb(struct super_block * sb,void * arg)395 static void super_cb(struct super_block *sb, void *arg)
396 {
397 struct super_cb_data *d = arg;
398 struct cifs_sb_info *cifs_sb;
399 struct cifs_tcon *tcon;
400
401 if (d->sb)
402 return;
403
404 cifs_sb = CIFS_SB(sb);
405 tcon = cifs_sb_master_tcon(cifs_sb);
406 if (tcon->ses->server == d->server)
407 d->sb = sb;
408 }
409
get_tcp_super(struct TCP_Server_Info * server)410 static struct super_block *get_tcp_super(struct TCP_Server_Info *server)
411 {
412 struct super_cb_data d = {
413 .server = server,
414 .sb = NULL,
415 };
416
417 iterate_supers_type(&cifs_fs_type, super_cb, &d);
418
419 if (unlikely(!d.sb))
420 return ERR_PTR(-ENOENT);
421 /*
422 * Grab an active reference in order to prevent automounts (DFS links)
423 * of expiring and then freeing up our cifs superblock pointer while
424 * we're doing failover.
425 */
426 cifs_sb_active(d.sb);
427 return d.sb;
428 }
429
put_tcp_super(struct super_block * sb)430 static inline void put_tcp_super(struct super_block *sb)
431 {
432 if (!IS_ERR_OR_NULL(sb))
433 cifs_sb_deactive(sb);
434 }
435
reconn_inval_dfs_target(struct TCP_Server_Info * server,struct cifs_sb_info * cifs_sb,struct dfs_cache_tgt_list * tgt_list,struct dfs_cache_tgt_iterator ** tgt_it)436 static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
437 struct cifs_sb_info *cifs_sb,
438 struct dfs_cache_tgt_list *tgt_list,
439 struct dfs_cache_tgt_iterator **tgt_it)
440 {
441 const char *name;
442
443 if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
444 !server->nr_targets)
445 return;
446
447 if (!*tgt_it) {
448 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
449 } else {
450 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
451 if (!*tgt_it)
452 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
453 }
454
455 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
456
457 name = dfs_cache_get_tgt_name(*tgt_it);
458
459 kfree(server->hostname);
460
461 server->hostname = extract_hostname(name);
462 if (IS_ERR(server->hostname)) {
463 cifs_dbg(FYI,
464 "%s: failed to extract hostname from target: %ld\n",
465 __func__, PTR_ERR(server->hostname));
466 }
467 }
468
reconn_setup_dfs_targets(struct cifs_sb_info * cifs_sb,struct dfs_cache_tgt_list * tl,struct dfs_cache_tgt_iterator ** it)469 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
470 struct dfs_cache_tgt_list *tl,
471 struct dfs_cache_tgt_iterator **it)
472 {
473 if (!cifs_sb->origin_fullpath)
474 return -EOPNOTSUPP;
475 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
476 }
477 #endif
478
479 /*
480 * cifs tcp session reconnection
481 *
482 * mark tcp session as reconnecting so temporarily locked
483 * mark all smb sessions as reconnecting for tcp session
484 * reconnect tcp session
485 * wake up waiters on reconnection? - (not needed currently)
486 */
487 int
cifs_reconnect(struct TCP_Server_Info * server)488 cifs_reconnect(struct TCP_Server_Info *server)
489 {
490 int rc = 0;
491 struct list_head *tmp, *tmp2;
492 struct cifs_ses *ses;
493 struct cifs_tcon *tcon;
494 struct mid_q_entry *mid_entry;
495 struct list_head retry_list;
496 #ifdef CONFIG_CIFS_DFS_UPCALL
497 struct super_block *sb = NULL;
498 struct cifs_sb_info *cifs_sb = NULL;
499 struct dfs_cache_tgt_list tgt_list = {0};
500 struct dfs_cache_tgt_iterator *tgt_it = NULL;
501 #endif
502
503 spin_lock(&GlobalMid_Lock);
504 server->nr_targets = 1;
505 #ifdef CONFIG_CIFS_DFS_UPCALL
506 spin_unlock(&GlobalMid_Lock);
507 sb = get_tcp_super(server);
508 if (IS_ERR(sb)) {
509 rc = PTR_ERR(sb);
510 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
511 __func__, rc);
512 sb = NULL;
513 } else {
514 cifs_sb = CIFS_SB(sb);
515
516 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
517 if (rc && (rc != -EOPNOTSUPP)) {
518 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
519 __func__);
520 } else {
521 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
522 }
523 }
524 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
525 server->nr_targets);
526 spin_lock(&GlobalMid_Lock);
527 #endif
528 if (server->tcpStatus == CifsExiting) {
529 /* the demux thread will exit normally
530 next time through the loop */
531 spin_unlock(&GlobalMid_Lock);
532 #ifdef CONFIG_CIFS_DFS_UPCALL
533 dfs_cache_free_tgts(&tgt_list);
534 put_tcp_super(sb);
535 #endif
536 return rc;
537 } else
538 server->tcpStatus = CifsNeedReconnect;
539 spin_unlock(&GlobalMid_Lock);
540 server->maxBuf = 0;
541 server->max_read = 0;
542
543 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
544 trace_smb3_reconnect(server->CurrentMid, server->hostname);
545
546 /* before reconnecting the tcp session, mark the smb session (uid)
547 and the tid bad so they are not used until reconnected */
548 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
549 __func__);
550 spin_lock(&cifs_tcp_ses_lock);
551 list_for_each(tmp, &server->smb_ses_list) {
552 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
553 ses->need_reconnect = true;
554 list_for_each(tmp2, &ses->tcon_list) {
555 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
556 tcon->need_reconnect = true;
557 }
558 if (ses->tcon_ipc)
559 ses->tcon_ipc->need_reconnect = true;
560 }
561 spin_unlock(&cifs_tcp_ses_lock);
562
563 /* do not want to be sending data on a socket we are freeing */
564 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
565 mutex_lock(&server->srv_mutex);
566 if (server->ssocket) {
567 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
568 server->ssocket->state, server->ssocket->flags);
569 kernel_sock_shutdown(server->ssocket, SHUT_WR);
570 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
571 server->ssocket->state, server->ssocket->flags);
572 sock_release(server->ssocket);
573 server->ssocket = NULL;
574 }
575 server->sequence_number = 0;
576 server->session_estab = false;
577 kfree(server->session_key.response);
578 server->session_key.response = NULL;
579 server->session_key.len = 0;
580 server->lstrp = jiffies;
581
582 /* mark submitted MIDs for retry and issue callback */
583 INIT_LIST_HEAD(&retry_list);
584 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
585 spin_lock(&GlobalMid_Lock);
586 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
587 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
588 kref_get(&mid_entry->refcount);
589 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
590 mid_entry->mid_state = MID_RETRY_NEEDED;
591 list_move(&mid_entry->qhead, &retry_list);
592 mid_entry->mid_flags |= MID_DELETED;
593 }
594 spin_unlock(&GlobalMid_Lock);
595 mutex_unlock(&server->srv_mutex);
596
597 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
598 list_for_each_safe(tmp, tmp2, &retry_list) {
599 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
600 list_del_init(&mid_entry->qhead);
601 mid_entry->callback(mid_entry);
602 cifs_mid_q_entry_release(mid_entry);
603 }
604
605 if (cifs_rdma_enabled(server)) {
606 mutex_lock(&server->srv_mutex);
607 smbd_destroy(server);
608 mutex_unlock(&server->srv_mutex);
609 }
610
611 do {
612 try_to_freeze();
613
614 mutex_lock(&server->srv_mutex);
615 /*
616 * Set up next DFS target server (if any) for reconnect. If DFS
617 * feature is disabled, then we will retry last server we
618 * connected to before.
619 */
620 if (cifs_rdma_enabled(server))
621 rc = smbd_reconnect(server);
622 else
623 rc = generic_ip_connect(server);
624 if (rc) {
625 cifs_dbg(FYI, "reconnect error %d\n", rc);
626 #ifdef CONFIG_CIFS_DFS_UPCALL
627 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
628 &tgt_it);
629 #endif
630 rc = reconn_set_ipaddr(server);
631 if (rc) {
632 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
633 __func__, rc);
634 }
635 mutex_unlock(&server->srv_mutex);
636 msleep(3000);
637 } else {
638 atomic_inc(&tcpSesReconnectCount);
639 set_credits(server, 1);
640 spin_lock(&GlobalMid_Lock);
641 if (server->tcpStatus != CifsExiting)
642 server->tcpStatus = CifsNeedNegotiate;
643 spin_unlock(&GlobalMid_Lock);
644 mutex_unlock(&server->srv_mutex);
645 }
646 } while (server->tcpStatus == CifsNeedReconnect);
647
648 #ifdef CONFIG_CIFS_DFS_UPCALL
649 if (tgt_it) {
650 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
651 tgt_it);
652 if (rc) {
653 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
654 __func__, rc);
655 }
656 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
657 if (rc) {
658 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
659 __func__, rc);
660 }
661 dfs_cache_free_tgts(&tgt_list);
662
663 }
664
665 put_tcp_super(sb);
666 #endif
667 if (server->tcpStatus == CifsNeedNegotiate)
668 mod_delayed_work(cifsiod_wq, &server->echo, 0);
669
670 return rc;
671 }
672
673 static void
cifs_echo_request(struct work_struct * work)674 cifs_echo_request(struct work_struct *work)
675 {
676 int rc;
677 struct TCP_Server_Info *server = container_of(work,
678 struct TCP_Server_Info, echo.work);
679 unsigned long echo_interval;
680
681 /*
682 * If we need to renegotiate, set echo interval to zero to
683 * immediately call echo service where we can renegotiate.
684 */
685 if (server->tcpStatus == CifsNeedNegotiate)
686 echo_interval = 0;
687 else
688 echo_interval = server->echo_interval;
689
690 /*
691 * We cannot send an echo if it is disabled.
692 * Also, no need to ping if we got a response recently.
693 */
694
695 if (server->tcpStatus == CifsNeedReconnect ||
696 server->tcpStatus == CifsExiting ||
697 server->tcpStatus == CifsNew ||
698 (server->ops->can_echo && !server->ops->can_echo(server)) ||
699 time_before(jiffies, server->lstrp + echo_interval - HZ))
700 goto requeue_echo;
701
702 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
703 if (rc)
704 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
705 server->hostname);
706
707 requeue_echo:
708 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
709 }
710
711 static bool
allocate_buffers(struct TCP_Server_Info * server)712 allocate_buffers(struct TCP_Server_Info *server)
713 {
714 if (!server->bigbuf) {
715 server->bigbuf = (char *)cifs_buf_get();
716 if (!server->bigbuf) {
717 cifs_server_dbg(VFS, "No memory for large SMB response\n");
718 msleep(3000);
719 /* retry will check if exiting */
720 return false;
721 }
722 } else if (server->large_buf) {
723 /* we are reusing a dirty large buf, clear its start */
724 memset(server->bigbuf, 0, HEADER_SIZE(server));
725 }
726
727 if (!server->smallbuf) {
728 server->smallbuf = (char *)cifs_small_buf_get();
729 if (!server->smallbuf) {
730 cifs_server_dbg(VFS, "No memory for SMB response\n");
731 msleep(1000);
732 /* retry will check if exiting */
733 return false;
734 }
735 /* beginning of smb buffer is cleared in our buf_get */
736 } else {
737 /* if existing small buf clear beginning */
738 memset(server->smallbuf, 0, HEADER_SIZE(server));
739 }
740
741 return true;
742 }
743
744 static bool
server_unresponsive(struct TCP_Server_Info * server)745 server_unresponsive(struct TCP_Server_Info *server)
746 {
747 /*
748 * We need to wait 3 echo intervals to make sure we handle such
749 * situations right:
750 * 1s client sends a normal SMB request
751 * 2s client gets a response
752 * 30s echo workqueue job pops, and decides we got a response recently
753 * and don't need to send another
754 * ...
755 * 65s kernel_recvmsg times out, and we see that we haven't gotten
756 * a response in >60s.
757 */
758 if ((server->tcpStatus == CifsGood ||
759 server->tcpStatus == CifsNeedNegotiate) &&
760 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
761 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
762 (3 * server->echo_interval) / HZ);
763 cifs_reconnect(server);
764 wake_up(&server->response_q);
765 return true;
766 }
767
768 return false;
769 }
770
771 static inline bool
zero_credits(struct TCP_Server_Info * server)772 zero_credits(struct TCP_Server_Info *server)
773 {
774 int val;
775
776 spin_lock(&server->req_lock);
777 val = server->credits + server->echo_credits + server->oplock_credits;
778 if (server->in_flight == 0 && val == 0) {
779 spin_unlock(&server->req_lock);
780 return true;
781 }
782 spin_unlock(&server->req_lock);
783 return false;
784 }
785
786 static int
cifs_readv_from_socket(struct TCP_Server_Info * server,struct msghdr * smb_msg)787 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
788 {
789 int length = 0;
790 int total_read;
791
792 smb_msg->msg_control = NULL;
793 smb_msg->msg_controllen = 0;
794
795 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
796 try_to_freeze();
797
798 /* reconnect if no credits and no requests in flight */
799 if (zero_credits(server)) {
800 cifs_reconnect(server);
801 return -ECONNABORTED;
802 }
803
804 if (server_unresponsive(server))
805 return -ECONNABORTED;
806 if (cifs_rdma_enabled(server) && server->smbd_conn)
807 length = smbd_recv(server->smbd_conn, smb_msg);
808 else
809 length = sock_recvmsg(server->ssocket, smb_msg, 0);
810
811 if (server->tcpStatus == CifsExiting)
812 return -ESHUTDOWN;
813
814 if (server->tcpStatus == CifsNeedReconnect) {
815 cifs_reconnect(server);
816 return -ECONNABORTED;
817 }
818
819 if (length == -ERESTARTSYS ||
820 length == -EAGAIN ||
821 length == -EINTR) {
822 /*
823 * Minimum sleep to prevent looping, allowing socket
824 * to clear and app threads to set tcpStatus
825 * CifsNeedReconnect if server hung.
826 */
827 usleep_range(1000, 2000);
828 length = 0;
829 continue;
830 }
831
832 if (length <= 0) {
833 cifs_dbg(FYI, "Received no data or error: %d\n", length);
834 cifs_reconnect(server);
835 return -ECONNABORTED;
836 }
837 }
838 return total_read;
839 }
840
841 int
cifs_read_from_socket(struct TCP_Server_Info * server,char * buf,unsigned int to_read)842 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
843 unsigned int to_read)
844 {
845 struct msghdr smb_msg;
846 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
847 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
848
849 return cifs_readv_from_socket(server, &smb_msg);
850 }
851
852 int
cifs_read_page_from_socket(struct TCP_Server_Info * server,struct page * page,unsigned int page_offset,unsigned int to_read)853 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
854 unsigned int page_offset, unsigned int to_read)
855 {
856 struct msghdr smb_msg;
857 struct bio_vec bv = {
858 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
859 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
860 return cifs_readv_from_socket(server, &smb_msg);
861 }
862
863 static bool
is_smb_response(struct TCP_Server_Info * server,unsigned char type)864 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
865 {
866 /*
867 * The first byte big endian of the length field,
868 * is actually not part of the length but the type
869 * with the most common, zero, as regular data.
870 */
871 switch (type) {
872 case RFC1002_SESSION_MESSAGE:
873 /* Regular SMB response */
874 return true;
875 case RFC1002_SESSION_KEEP_ALIVE:
876 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
877 break;
878 case RFC1002_POSITIVE_SESSION_RESPONSE:
879 cifs_dbg(FYI, "RFC 1002 positive session response\n");
880 break;
881 case RFC1002_NEGATIVE_SESSION_RESPONSE:
882 /*
883 * We get this from Windows 98 instead of an error on
884 * SMB negprot response.
885 */
886 cifs_dbg(FYI, "RFC 1002 negative session response\n");
887 /* give server a second to clean up */
888 msleep(1000);
889 /*
890 * Always try 445 first on reconnect since we get NACK
891 * on some if we ever connected to port 139 (the NACK
892 * is since we do not begin with RFC1001 session
893 * initialize frame).
894 */
895 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
896 cifs_reconnect(server);
897 wake_up(&server->response_q);
898 break;
899 default:
900 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
901 cifs_reconnect(server);
902 }
903
904 return false;
905 }
906
907 void
dequeue_mid(struct mid_q_entry * mid,bool malformed)908 dequeue_mid(struct mid_q_entry *mid, bool malformed)
909 {
910 #ifdef CONFIG_CIFS_STATS2
911 mid->when_received = jiffies;
912 #endif
913 spin_lock(&GlobalMid_Lock);
914 if (!malformed)
915 mid->mid_state = MID_RESPONSE_RECEIVED;
916 else
917 mid->mid_state = MID_RESPONSE_MALFORMED;
918 /*
919 * Trying to handle/dequeue a mid after the send_recv()
920 * function has finished processing it is a bug.
921 */
922 if (mid->mid_flags & MID_DELETED)
923 printk_once(KERN_WARNING
924 "trying to dequeue a deleted mid\n");
925 else {
926 list_del_init(&mid->qhead);
927 mid->mid_flags |= MID_DELETED;
928 }
929 spin_unlock(&GlobalMid_Lock);
930 }
931
932 static unsigned int
smb2_get_credits_from_hdr(char * buffer,struct TCP_Server_Info * server)933 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
934 {
935 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
936
937 /*
938 * SMB1 does not use credits.
939 */
940 if (server->vals->header_preamble_size)
941 return 0;
942
943 return le16_to_cpu(shdr->CreditRequest);
944 }
945
946 static void
handle_mid(struct mid_q_entry * mid,struct TCP_Server_Info * server,char * buf,int malformed)947 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
948 char *buf, int malformed)
949 {
950 if (server->ops->check_trans2 &&
951 server->ops->check_trans2(mid, server, buf, malformed))
952 return;
953 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
954 mid->resp_buf = buf;
955 mid->large_buf = server->large_buf;
956 /* Was previous buf put in mpx struct for multi-rsp? */
957 if (!mid->multiRsp) {
958 /* smb buffer will be freed by user thread */
959 if (server->large_buf)
960 server->bigbuf = NULL;
961 else
962 server->smallbuf = NULL;
963 }
964 dequeue_mid(mid, malformed);
965 }
966
clean_demultiplex_info(struct TCP_Server_Info * server)967 static void clean_demultiplex_info(struct TCP_Server_Info *server)
968 {
969 int length;
970
971 /* take it off the list, if it's not already */
972 spin_lock(&cifs_tcp_ses_lock);
973 list_del_init(&server->tcp_ses_list);
974 spin_unlock(&cifs_tcp_ses_lock);
975
976 spin_lock(&GlobalMid_Lock);
977 server->tcpStatus = CifsExiting;
978 spin_unlock(&GlobalMid_Lock);
979 wake_up_all(&server->response_q);
980
981 /* check if we have blocked requests that need to free */
982 spin_lock(&server->req_lock);
983 if (server->credits <= 0)
984 server->credits = 1;
985 spin_unlock(&server->req_lock);
986 /*
987 * Although there should not be any requests blocked on this queue it
988 * can not hurt to be paranoid and try to wake up requests that may
989 * haven been blocked when more than 50 at time were on the wire to the
990 * same server - they now will see the session is in exit state and get
991 * out of SendReceive.
992 */
993 wake_up_all(&server->request_q);
994 /* give those requests time to exit */
995 msleep(125);
996 if (cifs_rdma_enabled(server))
997 smbd_destroy(server);
998 if (server->ssocket) {
999 sock_release(server->ssocket);
1000 server->ssocket = NULL;
1001 }
1002
1003 if (!list_empty(&server->pending_mid_q)) {
1004 struct list_head dispose_list;
1005 struct mid_q_entry *mid_entry;
1006 struct list_head *tmp, *tmp2;
1007
1008 INIT_LIST_HEAD(&dispose_list);
1009 spin_lock(&GlobalMid_Lock);
1010 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
1011 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
1012 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
1013 kref_get(&mid_entry->refcount);
1014 mid_entry->mid_state = MID_SHUTDOWN;
1015 list_move(&mid_entry->qhead, &dispose_list);
1016 mid_entry->mid_flags |= MID_DELETED;
1017 }
1018 spin_unlock(&GlobalMid_Lock);
1019
1020 /* now walk dispose list and issue callbacks */
1021 list_for_each_safe(tmp, tmp2, &dispose_list) {
1022 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
1023 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
1024 list_del_init(&mid_entry->qhead);
1025 mid_entry->callback(mid_entry);
1026 cifs_mid_q_entry_release(mid_entry);
1027 }
1028 /* 1/8th of sec is more than enough time for them to exit */
1029 msleep(125);
1030 }
1031
1032 if (!list_empty(&server->pending_mid_q)) {
1033 /*
1034 * mpx threads have not exited yet give them at least the smb
1035 * send timeout time for long ops.
1036 *
1037 * Due to delays on oplock break requests, we need to wait at
1038 * least 45 seconds before giving up on a request getting a
1039 * response and going ahead and killing cifsd.
1040 */
1041 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
1042 msleep(46000);
1043 /*
1044 * If threads still have not exited they are probably never
1045 * coming home not much else we can do but free the memory.
1046 */
1047 }
1048
1049 kfree(server->hostname);
1050 kfree(server);
1051
1052 length = atomic_dec_return(&tcpSesAllocCount);
1053 if (length > 0)
1054 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1055 }
1056
1057 static int
standard_receive3(struct TCP_Server_Info * server,struct mid_q_entry * mid)1058 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1059 {
1060 int length;
1061 char *buf = server->smallbuf;
1062 unsigned int pdu_length = server->pdu_size;
1063
1064 /* make sure this will fit in a large buffer */
1065 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1066 server->vals->header_preamble_size) {
1067 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1068 cifs_reconnect(server);
1069 wake_up(&server->response_q);
1070 return -ECONNABORTED;
1071 }
1072
1073 /* switch to large buffer if too big for a small one */
1074 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1075 server->large_buf = true;
1076 memcpy(server->bigbuf, buf, server->total_read);
1077 buf = server->bigbuf;
1078 }
1079
1080 /* now read the rest */
1081 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1082 pdu_length - HEADER_SIZE(server) + 1
1083 + server->vals->header_preamble_size);
1084
1085 if (length < 0)
1086 return length;
1087 server->total_read += length;
1088
1089 dump_smb(buf, server->total_read);
1090
1091 return cifs_handle_standard(server, mid);
1092 }
1093
1094 int
cifs_handle_standard(struct TCP_Server_Info * server,struct mid_q_entry * mid)1095 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1096 {
1097 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1098 int length;
1099
1100 /*
1101 * We know that we received enough to get to the MID as we
1102 * checked the pdu_length earlier. Now check to see
1103 * if the rest of the header is OK. We borrow the length
1104 * var for the rest of the loop to avoid a new stack var.
1105 *
1106 * 48 bytes is enough to display the header and a little bit
1107 * into the payload for debugging purposes.
1108 */
1109 length = server->ops->check_message(buf, server->total_read, server);
1110 if (length != 0)
1111 cifs_dump_mem("Bad SMB: ", buf,
1112 min_t(unsigned int, server->total_read, 48));
1113
1114 if (server->ops->is_session_expired &&
1115 server->ops->is_session_expired(buf)) {
1116 cifs_reconnect(server);
1117 wake_up(&server->response_q);
1118 return -1;
1119 }
1120
1121 if (server->ops->is_status_pending &&
1122 server->ops->is_status_pending(buf, server))
1123 return -1;
1124
1125 if (!mid)
1126 return length;
1127
1128 handle_mid(mid, server, buf, length);
1129 return 0;
1130 }
1131
1132 static void
smb2_add_credits_from_hdr(char * buffer,struct TCP_Server_Info * server)1133 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1134 {
1135 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1136
1137 /*
1138 * SMB1 does not use credits.
1139 */
1140 if (server->vals->header_preamble_size)
1141 return;
1142
1143 if (shdr->CreditRequest) {
1144 spin_lock(&server->req_lock);
1145 server->credits += le16_to_cpu(shdr->CreditRequest);
1146 spin_unlock(&server->req_lock);
1147 wake_up(&server->request_q);
1148 }
1149 }
1150
1151
1152 static int
cifs_demultiplex_thread(void * p)1153 cifs_demultiplex_thread(void *p)
1154 {
1155 int i, num_mids, length;
1156 struct TCP_Server_Info *server = p;
1157 unsigned int pdu_length;
1158 unsigned int next_offset;
1159 char *buf = NULL;
1160 struct task_struct *task_to_wake = NULL;
1161 struct mid_q_entry *mids[MAX_COMPOUND];
1162 char *bufs[MAX_COMPOUND];
1163
1164 current->flags |= PF_MEMALLOC;
1165 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1166
1167 length = atomic_inc_return(&tcpSesAllocCount);
1168 if (length > 1)
1169 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1170
1171 set_freezable();
1172 allow_kernel_signal(SIGKILL);
1173 while (server->tcpStatus != CifsExiting) {
1174 if (try_to_freeze())
1175 continue;
1176
1177 if (!allocate_buffers(server))
1178 continue;
1179
1180 server->large_buf = false;
1181 buf = server->smallbuf;
1182 pdu_length = 4; /* enough to get RFC1001 header */
1183
1184 length = cifs_read_from_socket(server, buf, pdu_length);
1185 if (length < 0)
1186 continue;
1187
1188 if (server->vals->header_preamble_size == 0)
1189 server->total_read = 0;
1190 else
1191 server->total_read = length;
1192
1193 /*
1194 * The right amount was read from socket - 4 bytes,
1195 * so we can now interpret the length field.
1196 */
1197 pdu_length = get_rfc1002_length(buf);
1198
1199 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1200 if (!is_smb_response(server, buf[0]))
1201 continue;
1202 next_pdu:
1203 server->pdu_size = pdu_length;
1204
1205 /* make sure we have enough to get to the MID */
1206 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1207 server->vals->header_preamble_size) {
1208 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1209 server->pdu_size);
1210 cifs_reconnect(server);
1211 wake_up(&server->response_q);
1212 continue;
1213 }
1214
1215 /* read down to the MID */
1216 length = cifs_read_from_socket(server,
1217 buf + server->vals->header_preamble_size,
1218 HEADER_SIZE(server) - 1
1219 - server->vals->header_preamble_size);
1220 if (length < 0)
1221 continue;
1222 server->total_read += length;
1223
1224 if (server->ops->next_header) {
1225 next_offset = server->ops->next_header(buf);
1226 if (next_offset)
1227 server->pdu_size = next_offset;
1228 }
1229
1230 memset(mids, 0, sizeof(mids));
1231 memset(bufs, 0, sizeof(bufs));
1232 num_mids = 0;
1233
1234 if (server->ops->is_transform_hdr &&
1235 server->ops->receive_transform &&
1236 server->ops->is_transform_hdr(buf)) {
1237 length = server->ops->receive_transform(server,
1238 mids,
1239 bufs,
1240 &num_mids);
1241 } else {
1242 mids[0] = server->ops->find_mid(server, buf);
1243 bufs[0] = buf;
1244 num_mids = 1;
1245
1246 if (!mids[0] || !mids[0]->receive)
1247 length = standard_receive3(server, mids[0]);
1248 else
1249 length = mids[0]->receive(server, mids[0]);
1250 }
1251
1252 if (length < 0) {
1253 for (i = 0; i < num_mids; i++)
1254 if (mids[i])
1255 cifs_mid_q_entry_release(mids[i]);
1256 continue;
1257 }
1258
1259 server->lstrp = jiffies;
1260
1261 for (i = 0; i < num_mids; i++) {
1262 if (mids[i] != NULL) {
1263 mids[i]->resp_buf_size = server->pdu_size;
1264
1265 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1266 mids[i]->callback(mids[i]);
1267
1268 cifs_mid_q_entry_release(mids[i]);
1269 } else if (server->ops->is_oplock_break &&
1270 server->ops->is_oplock_break(bufs[i],
1271 server)) {
1272 smb2_add_credits_from_hdr(bufs[i], server);
1273 cifs_dbg(FYI, "Received oplock break\n");
1274 } else {
1275 cifs_server_dbg(VFS, "No task to wake, unknown frame "
1276 "received! NumMids %d\n",
1277 atomic_read(&midCount));
1278 cifs_dump_mem("Received Data is: ", bufs[i],
1279 HEADER_SIZE(server));
1280 smb2_add_credits_from_hdr(bufs[i], server);
1281 #ifdef CONFIG_CIFS_DEBUG2
1282 if (server->ops->dump_detail)
1283 server->ops->dump_detail(bufs[i],
1284 server);
1285 cifs_dump_mids(server);
1286 #endif /* CIFS_DEBUG2 */
1287 }
1288 }
1289
1290 if (pdu_length > server->pdu_size) {
1291 if (!allocate_buffers(server))
1292 continue;
1293 pdu_length -= server->pdu_size;
1294 server->total_read = 0;
1295 server->large_buf = false;
1296 buf = server->smallbuf;
1297 goto next_pdu;
1298 }
1299 } /* end while !EXITING */
1300
1301 /* buffer usually freed in free_mid - need to free it here on exit */
1302 cifs_buf_release(server->bigbuf);
1303 if (server->smallbuf) /* no sense logging a debug message if NULL */
1304 cifs_small_buf_release(server->smallbuf);
1305
1306 task_to_wake = xchg(&server->tsk, NULL);
1307 clean_demultiplex_info(server);
1308
1309 /* if server->tsk was NULL then wait for a signal before exiting */
1310 if (!task_to_wake) {
1311 set_current_state(TASK_INTERRUPTIBLE);
1312 while (!signal_pending(current)) {
1313 schedule();
1314 set_current_state(TASK_INTERRUPTIBLE);
1315 }
1316 set_current_state(TASK_RUNNING);
1317 }
1318
1319 module_put_and_exit(0);
1320 }
1321
1322 /* extract the host portion of the UNC string */
1323 static char *
extract_hostname(const char * unc)1324 extract_hostname(const char *unc)
1325 {
1326 const char *src;
1327 char *dst, *delim;
1328 unsigned int len;
1329
1330 /* skip double chars at beginning of string */
1331 /* BB: check validity of these bytes? */
1332 if (strlen(unc) < 3)
1333 return ERR_PTR(-EINVAL);
1334 for (src = unc; *src && *src == '\\'; src++)
1335 ;
1336 if (!*src)
1337 return ERR_PTR(-EINVAL);
1338
1339 /* delimiter between hostname and sharename is always '\\' now */
1340 delim = strchr(src, '\\');
1341 if (!delim)
1342 return ERR_PTR(-EINVAL);
1343
1344 len = delim - src;
1345 dst = kmalloc((len + 1), GFP_KERNEL);
1346 if (dst == NULL)
1347 return ERR_PTR(-ENOMEM);
1348
1349 memcpy(dst, src, len);
1350 dst[len] = '\0';
1351
1352 return dst;
1353 }
1354
get_option_ul(substring_t args[],unsigned long * option)1355 static int get_option_ul(substring_t args[], unsigned long *option)
1356 {
1357 int rc;
1358 char *string;
1359
1360 string = match_strdup(args);
1361 if (string == NULL)
1362 return -ENOMEM;
1363 rc = kstrtoul(string, 0, option);
1364 kfree(string);
1365
1366 return rc;
1367 }
1368
get_option_uid(substring_t args[],kuid_t * result)1369 static int get_option_uid(substring_t args[], kuid_t *result)
1370 {
1371 unsigned long value;
1372 kuid_t uid;
1373 int rc;
1374
1375 rc = get_option_ul(args, &value);
1376 if (rc)
1377 return rc;
1378
1379 uid = make_kuid(current_user_ns(), value);
1380 if (!uid_valid(uid))
1381 return -EINVAL;
1382
1383 *result = uid;
1384 return 0;
1385 }
1386
get_option_gid(substring_t args[],kgid_t * result)1387 static int get_option_gid(substring_t args[], kgid_t *result)
1388 {
1389 unsigned long value;
1390 kgid_t gid;
1391 int rc;
1392
1393 rc = get_option_ul(args, &value);
1394 if (rc)
1395 return rc;
1396
1397 gid = make_kgid(current_user_ns(), value);
1398 if (!gid_valid(gid))
1399 return -EINVAL;
1400
1401 *result = gid;
1402 return 0;
1403 }
1404
cifs_parse_security_flavors(char * value,struct smb_vol * vol)1405 static int cifs_parse_security_flavors(char *value,
1406 struct smb_vol *vol)
1407 {
1408
1409 substring_t args[MAX_OPT_ARGS];
1410
1411 /*
1412 * With mount options, the last one should win. Reset any existing
1413 * settings back to default.
1414 */
1415 vol->sectype = Unspecified;
1416 vol->sign = false;
1417
1418 switch (match_token(value, cifs_secflavor_tokens, args)) {
1419 case Opt_sec_krb5p:
1420 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1421 return 1;
1422 case Opt_sec_krb5i:
1423 vol->sign = true;
1424 /* Fallthrough */
1425 case Opt_sec_krb5:
1426 vol->sectype = Kerberos;
1427 break;
1428 case Opt_sec_ntlmsspi:
1429 vol->sign = true;
1430 /* Fallthrough */
1431 case Opt_sec_ntlmssp:
1432 vol->sectype = RawNTLMSSP;
1433 break;
1434 case Opt_sec_ntlmi:
1435 vol->sign = true;
1436 /* Fallthrough */
1437 case Opt_ntlm:
1438 vol->sectype = NTLM;
1439 break;
1440 case Opt_sec_ntlmv2i:
1441 vol->sign = true;
1442 /* Fallthrough */
1443 case Opt_sec_ntlmv2:
1444 vol->sectype = NTLMv2;
1445 break;
1446 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1447 case Opt_sec_lanman:
1448 vol->sectype = LANMAN;
1449 break;
1450 #endif
1451 case Opt_sec_none:
1452 vol->nullauth = 1;
1453 break;
1454 default:
1455 cifs_dbg(VFS, "bad security option: %s\n", value);
1456 return 1;
1457 }
1458
1459 return 0;
1460 }
1461
1462 static int
cifs_parse_cache_flavor(char * value,struct smb_vol * vol)1463 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1464 {
1465 substring_t args[MAX_OPT_ARGS];
1466
1467 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1468 case Opt_cache_loose:
1469 vol->direct_io = false;
1470 vol->strict_io = false;
1471 vol->cache_ro = false;
1472 vol->cache_rw = false;
1473 break;
1474 case Opt_cache_strict:
1475 vol->direct_io = false;
1476 vol->strict_io = true;
1477 vol->cache_ro = false;
1478 vol->cache_rw = false;
1479 break;
1480 case Opt_cache_none:
1481 vol->direct_io = true;
1482 vol->strict_io = false;
1483 vol->cache_ro = false;
1484 vol->cache_rw = false;
1485 break;
1486 case Opt_cache_ro:
1487 vol->direct_io = false;
1488 vol->strict_io = false;
1489 vol->cache_ro = true;
1490 vol->cache_rw = false;
1491 break;
1492 case Opt_cache_rw:
1493 vol->direct_io = false;
1494 vol->strict_io = false;
1495 vol->cache_ro = false;
1496 vol->cache_rw = true;
1497 break;
1498 default:
1499 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1500 return 1;
1501 }
1502 return 0;
1503 }
1504
1505 static int
cifs_parse_smb_version(char * value,struct smb_vol * vol,bool is_smb3)1506 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1507 {
1508 substring_t args[MAX_OPT_ARGS];
1509
1510 switch (match_token(value, cifs_smb_version_tokens, args)) {
1511 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1512 case Smb_1:
1513 if (disable_legacy_dialects) {
1514 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1515 return 1;
1516 }
1517 if (is_smb3) {
1518 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1519 return 1;
1520 }
1521 vol->ops = &smb1_operations;
1522 vol->vals = &smb1_values;
1523 break;
1524 case Smb_20:
1525 if (disable_legacy_dialects) {
1526 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1527 return 1;
1528 }
1529 if (is_smb3) {
1530 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1531 return 1;
1532 }
1533 vol->ops = &smb20_operations;
1534 vol->vals = &smb20_values;
1535 break;
1536 #else
1537 case Smb_1:
1538 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1539 return 1;
1540 case Smb_20:
1541 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1542 return 1;
1543 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1544 case Smb_21:
1545 vol->ops = &smb21_operations;
1546 vol->vals = &smb21_values;
1547 break;
1548 case Smb_30:
1549 vol->ops = &smb30_operations;
1550 vol->vals = &smb30_values;
1551 break;
1552 case Smb_302:
1553 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1554 vol->vals = &smb302_values;
1555 break;
1556 case Smb_311:
1557 vol->ops = &smb311_operations;
1558 vol->vals = &smb311_values;
1559 break;
1560 case Smb_3any:
1561 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1562 vol->vals = &smb3any_values;
1563 break;
1564 case Smb_default:
1565 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1566 vol->vals = &smbdefault_values;
1567 break;
1568 default:
1569 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1570 return 1;
1571 }
1572 return 0;
1573 }
1574
1575 /*
1576 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1577 * fields with the result. Returns 0 on success and an error otherwise.
1578 */
1579 static int
cifs_parse_devname(const char * devname,struct smb_vol * vol)1580 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1581 {
1582 char *pos;
1583 const char *delims = "/\\";
1584 size_t len;
1585
1586 if (unlikely(!devname || !*devname)) {
1587 cifs_dbg(VFS, "Device name not specified.\n");
1588 return -EINVAL;
1589 }
1590
1591 /* make sure we have a valid UNC double delimiter prefix */
1592 len = strspn(devname, delims);
1593 if (len != 2)
1594 return -EINVAL;
1595
1596 /* find delimiter between host and sharename */
1597 pos = strpbrk(devname + 2, delims);
1598 if (!pos)
1599 return -EINVAL;
1600
1601 /* skip past delimiter */
1602 ++pos;
1603
1604 /* now go until next delimiter or end of string */
1605 len = strcspn(pos, delims);
1606
1607 /* move "pos" up to delimiter or NULL */
1608 pos += len;
1609 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1610 if (!vol->UNC)
1611 return -ENOMEM;
1612
1613 convert_delimiter(vol->UNC, '\\');
1614
1615 /* skip any delimiter */
1616 if (*pos == '/' || *pos == '\\')
1617 pos++;
1618
1619 /* If pos is NULL then no prepath */
1620 if (!*pos)
1621 return 0;
1622
1623 vol->prepath = kstrdup(pos, GFP_KERNEL);
1624 if (!vol->prepath)
1625 return -ENOMEM;
1626
1627 return 0;
1628 }
1629
1630 static int
cifs_parse_mount_options(const char * mountdata,const char * devname,struct smb_vol * vol,bool is_smb3)1631 cifs_parse_mount_options(const char *mountdata, const char *devname,
1632 struct smb_vol *vol, bool is_smb3)
1633 {
1634 char *data, *end;
1635 char *mountdata_copy = NULL, *options;
1636 unsigned int temp_len, i, j;
1637 char separator[2];
1638 short int override_uid = -1;
1639 short int override_gid = -1;
1640 bool uid_specified = false;
1641 bool gid_specified = false;
1642 bool sloppy = false;
1643 char *invalid = NULL;
1644 char *nodename = utsname()->nodename;
1645 char *string = NULL;
1646 char *tmp_end, *value;
1647 char delim;
1648 bool got_ip = false;
1649 bool got_version = false;
1650 unsigned short port = 0;
1651 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1652
1653 separator[0] = ',';
1654 separator[1] = 0;
1655 delim = separator[0];
1656
1657 /* ensure we always start with zeroed-out smb_vol */
1658 memset(vol, 0, sizeof(*vol));
1659
1660 /*
1661 * does not have to be perfect mapping since field is
1662 * informational, only used for servers that do not support
1663 * port 445 and it can be overridden at mount time
1664 */
1665 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1666 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1667 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1668
1669 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1670 /* null target name indicates to use *SMBSERVR default called name
1671 if we end up sending RFC1001 session initialize */
1672 vol->target_rfc1001_name[0] = 0;
1673 vol->cred_uid = current_uid();
1674 vol->linux_uid = current_uid();
1675 vol->linux_gid = current_gid();
1676 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1677 /*
1678 * default to SFM style remapping of seven reserved characters
1679 * unless user overrides it or we negotiate CIFS POSIX where
1680 * it is unnecessary. Can not simultaneously use more than one mapping
1681 * since then readdir could list files that open could not open
1682 */
1683 vol->remap = true;
1684
1685 /* default to only allowing write access to owner of the mount */
1686 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1687
1688 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1689 /* default is always to request posix paths. */
1690 vol->posix_paths = 1;
1691 /* default to using server inode numbers where available */
1692 vol->server_ino = 1;
1693
1694 /* default is to use strict cifs caching semantics */
1695 vol->strict_io = true;
1696
1697 vol->actimeo = CIFS_DEF_ACTIMEO;
1698
1699 /* Most clients set timeout to 0, allows server to use its default */
1700 vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1701
1702 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1703 vol->ops = &smb30_operations;
1704 vol->vals = &smbdefault_values;
1705
1706 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1707
1708 if (!mountdata)
1709 goto cifs_parse_mount_err;
1710
1711 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1712 if (!mountdata_copy)
1713 goto cifs_parse_mount_err;
1714
1715 options = mountdata_copy;
1716 end = options + strlen(options);
1717
1718 if (strncmp(options, "sep=", 4) == 0) {
1719 if (options[4] != 0) {
1720 separator[0] = options[4];
1721 options += 5;
1722 } else {
1723 cifs_dbg(FYI, "Null separator not allowed\n");
1724 }
1725 }
1726 vol->backupuid_specified = false; /* no backup intent for a user */
1727 vol->backupgid_specified = false; /* no backup intent for a group */
1728
1729 switch (cifs_parse_devname(devname, vol)) {
1730 case 0:
1731 break;
1732 case -ENOMEM:
1733 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1734 goto cifs_parse_mount_err;
1735 case -EINVAL:
1736 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1737 goto cifs_parse_mount_err;
1738 default:
1739 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1740 goto cifs_parse_mount_err;
1741 }
1742
1743 while ((data = strsep(&options, separator)) != NULL) {
1744 substring_t args[MAX_OPT_ARGS];
1745 unsigned long option;
1746 int token;
1747
1748 if (!*data)
1749 continue;
1750
1751 token = match_token(data, cifs_mount_option_tokens, args);
1752
1753 switch (token) {
1754
1755 /* Ingnore the following */
1756 case Opt_ignore:
1757 break;
1758
1759 /* Boolean values */
1760 case Opt_user_xattr:
1761 vol->no_xattr = 0;
1762 break;
1763 case Opt_nouser_xattr:
1764 vol->no_xattr = 1;
1765 break;
1766 case Opt_forceuid:
1767 override_uid = 1;
1768 break;
1769 case Opt_noforceuid:
1770 override_uid = 0;
1771 break;
1772 case Opt_forcegid:
1773 override_gid = 1;
1774 break;
1775 case Opt_noforcegid:
1776 override_gid = 0;
1777 break;
1778 case Opt_noblocksend:
1779 vol->noblocksnd = 1;
1780 break;
1781 case Opt_noautotune:
1782 vol->noautotune = 1;
1783 break;
1784 case Opt_nolease:
1785 vol->no_lease = 1;
1786 break;
1787 case Opt_hard:
1788 vol->retry = 1;
1789 break;
1790 case Opt_soft:
1791 vol->retry = 0;
1792 break;
1793 case Opt_perm:
1794 vol->noperm = 0;
1795 break;
1796 case Opt_noperm:
1797 vol->noperm = 1;
1798 break;
1799 case Opt_mapchars:
1800 vol->sfu_remap = true;
1801 vol->remap = false; /* disable SFM mapping */
1802 break;
1803 case Opt_nomapchars:
1804 vol->sfu_remap = false;
1805 break;
1806 case Opt_mapposix:
1807 vol->remap = true;
1808 vol->sfu_remap = false; /* disable SFU mapping */
1809 break;
1810 case Opt_nomapposix:
1811 vol->remap = false;
1812 break;
1813 case Opt_sfu:
1814 vol->sfu_emul = 1;
1815 break;
1816 case Opt_nosfu:
1817 vol->sfu_emul = 0;
1818 break;
1819 case Opt_nodfs:
1820 vol->nodfs = 1;
1821 break;
1822 case Opt_rootfs:
1823 #ifdef CONFIG_CIFS_ROOT
1824 vol->rootfs = true;
1825 #endif
1826 break;
1827 case Opt_posixpaths:
1828 vol->posix_paths = 1;
1829 break;
1830 case Opt_noposixpaths:
1831 vol->posix_paths = 0;
1832 break;
1833 case Opt_nounix:
1834 if (vol->linux_ext)
1835 cifs_dbg(VFS,
1836 "conflicting unix mount options\n");
1837 vol->no_linux_ext = 1;
1838 break;
1839 case Opt_unix:
1840 if (vol->no_linux_ext)
1841 cifs_dbg(VFS,
1842 "conflicting unix mount options\n");
1843 vol->linux_ext = 1;
1844 break;
1845 case Opt_nocase:
1846 vol->nocase = 1;
1847 break;
1848 case Opt_brl:
1849 vol->nobrl = 0;
1850 break;
1851 case Opt_nobrl:
1852 vol->nobrl = 1;
1853 /*
1854 * turn off mandatory locking in mode
1855 * if remote locking is turned off since the
1856 * local vfs will do advisory
1857 */
1858 if (vol->file_mode ==
1859 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1860 vol->file_mode = S_IALLUGO;
1861 break;
1862 case Opt_nohandlecache:
1863 vol->nohandlecache = 1;
1864 break;
1865 case Opt_handlecache:
1866 vol->nohandlecache = 0;
1867 break;
1868 case Opt_forcemandatorylock:
1869 vol->mand_lock = 1;
1870 break;
1871 case Opt_setuids:
1872 vol->setuids = 1;
1873 break;
1874 case Opt_nosetuids:
1875 vol->setuids = 0;
1876 break;
1877 case Opt_setuidfromacl:
1878 vol->setuidfromacl = 1;
1879 break;
1880 case Opt_dynperm:
1881 vol->dynperm = true;
1882 break;
1883 case Opt_nodynperm:
1884 vol->dynperm = false;
1885 break;
1886 case Opt_nohard:
1887 vol->retry = 0;
1888 break;
1889 case Opt_nosoft:
1890 vol->retry = 1;
1891 break;
1892 case Opt_nointr:
1893 vol->intr = 0;
1894 break;
1895 case Opt_intr:
1896 vol->intr = 1;
1897 break;
1898 case Opt_nostrictsync:
1899 vol->nostrictsync = 1;
1900 break;
1901 case Opt_strictsync:
1902 vol->nostrictsync = 0;
1903 break;
1904 case Opt_serverino:
1905 vol->server_ino = 1;
1906 break;
1907 case Opt_noserverino:
1908 vol->server_ino = 0;
1909 break;
1910 case Opt_rwpidforward:
1911 vol->rwpidforward = 1;
1912 break;
1913 case Opt_modesid:
1914 vol->mode_ace = 1;
1915 break;
1916 case Opt_cifsacl:
1917 vol->cifs_acl = 1;
1918 break;
1919 case Opt_nocifsacl:
1920 vol->cifs_acl = 0;
1921 break;
1922 case Opt_acl:
1923 vol->no_psx_acl = 0;
1924 break;
1925 case Opt_noacl:
1926 vol->no_psx_acl = 1;
1927 break;
1928 case Opt_locallease:
1929 vol->local_lease = 1;
1930 break;
1931 case Opt_sign:
1932 vol->sign = true;
1933 break;
1934 case Opt_ignore_signature:
1935 vol->sign = true;
1936 vol->ignore_signature = true;
1937 break;
1938 case Opt_seal:
1939 /* we do not do the following in secFlags because seal
1940 * is a per tree connection (mount) not a per socket
1941 * or per-smb connection option in the protocol
1942 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1943 */
1944 vol->seal = 1;
1945 break;
1946 case Opt_noac:
1947 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1948 break;
1949 case Opt_fsc:
1950 #ifndef CONFIG_CIFS_FSCACHE
1951 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1952 goto cifs_parse_mount_err;
1953 #endif
1954 vol->fsc = true;
1955 break;
1956 case Opt_mfsymlinks:
1957 vol->mfsymlinks = true;
1958 break;
1959 case Opt_multiuser:
1960 vol->multiuser = true;
1961 break;
1962 case Opt_sloppy:
1963 sloppy = true;
1964 break;
1965 case Opt_nosharesock:
1966 vol->nosharesock = true;
1967 break;
1968 case Opt_nopersistent:
1969 vol->nopersistent = true;
1970 if (vol->persistent) {
1971 cifs_dbg(VFS,
1972 "persistenthandles mount options conflict\n");
1973 goto cifs_parse_mount_err;
1974 }
1975 break;
1976 case Opt_persistent:
1977 vol->persistent = true;
1978 if ((vol->nopersistent) || (vol->resilient)) {
1979 cifs_dbg(VFS,
1980 "persistenthandles mount options conflict\n");
1981 goto cifs_parse_mount_err;
1982 }
1983 break;
1984 case Opt_resilient:
1985 vol->resilient = true;
1986 if (vol->persistent) {
1987 cifs_dbg(VFS,
1988 "persistenthandles mount options conflict\n");
1989 goto cifs_parse_mount_err;
1990 }
1991 break;
1992 case Opt_noresilient:
1993 vol->resilient = false; /* already the default */
1994 break;
1995 case Opt_domainauto:
1996 vol->domainauto = true;
1997 break;
1998 case Opt_rdma:
1999 vol->rdma = true;
2000 break;
2001 case Opt_compress:
2002 vol->compression = UNKNOWN_TYPE;
2003 cifs_dbg(VFS,
2004 "SMB3 compression support is experimental\n");
2005 break;
2006
2007 /* Numeric Values */
2008 case Opt_backupuid:
2009 if (get_option_uid(args, &vol->backupuid)) {
2010 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
2011 __func__);
2012 goto cifs_parse_mount_err;
2013 }
2014 vol->backupuid_specified = true;
2015 break;
2016 case Opt_backupgid:
2017 if (get_option_gid(args, &vol->backupgid)) {
2018 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
2019 __func__);
2020 goto cifs_parse_mount_err;
2021 }
2022 vol->backupgid_specified = true;
2023 break;
2024 case Opt_uid:
2025 if (get_option_uid(args, &vol->linux_uid)) {
2026 cifs_dbg(VFS, "%s: Invalid uid value\n",
2027 __func__);
2028 goto cifs_parse_mount_err;
2029 }
2030 uid_specified = true;
2031 break;
2032 case Opt_cruid:
2033 if (get_option_uid(args, &vol->cred_uid)) {
2034 cifs_dbg(VFS, "%s: Invalid cruid value\n",
2035 __func__);
2036 goto cifs_parse_mount_err;
2037 }
2038 break;
2039 case Opt_gid:
2040 if (get_option_gid(args, &vol->linux_gid)) {
2041 cifs_dbg(VFS, "%s: Invalid gid value\n",
2042 __func__);
2043 goto cifs_parse_mount_err;
2044 }
2045 gid_specified = true;
2046 break;
2047 case Opt_file_mode:
2048 if (get_option_ul(args, &option)) {
2049 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2050 __func__);
2051 goto cifs_parse_mount_err;
2052 }
2053 vol->file_mode = option;
2054 break;
2055 case Opt_dirmode:
2056 if (get_option_ul(args, &option)) {
2057 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2058 __func__);
2059 goto cifs_parse_mount_err;
2060 }
2061 vol->dir_mode = option;
2062 break;
2063 case Opt_port:
2064 if (get_option_ul(args, &option) ||
2065 option > USHRT_MAX) {
2066 cifs_dbg(VFS, "%s: Invalid port value\n",
2067 __func__);
2068 goto cifs_parse_mount_err;
2069 }
2070 port = (unsigned short)option;
2071 break;
2072 case Opt_min_enc_offload:
2073 if (get_option_ul(args, &option)) {
2074 cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
2075 goto cifs_parse_mount_err;
2076 }
2077 vol->min_offload = option;
2078 break;
2079 case Opt_blocksize:
2080 if (get_option_ul(args, &option)) {
2081 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
2082 __func__);
2083 goto cifs_parse_mount_err;
2084 }
2085 /*
2086 * inode blocksize realistically should never need to be
2087 * less than 16K or greater than 16M and default is 1MB.
2088 * Note that small inode block sizes (e.g. 64K) can lead
2089 * to very poor performance of common tools like cp and scp
2090 */
2091 if ((option < CIFS_MAX_MSGSIZE) ||
2092 (option > (4 * SMB3_DEFAULT_IOSIZE))) {
2093 cifs_dbg(VFS, "%s: Invalid blocksize\n",
2094 __func__);
2095 goto cifs_parse_mount_err;
2096 }
2097 vol->bsize = option;
2098 break;
2099 case Opt_rsize:
2100 if (get_option_ul(args, &option)) {
2101 cifs_dbg(VFS, "%s: Invalid rsize value\n",
2102 __func__);
2103 goto cifs_parse_mount_err;
2104 }
2105 vol->rsize = option;
2106 break;
2107 case Opt_wsize:
2108 if (get_option_ul(args, &option)) {
2109 cifs_dbg(VFS, "%s: Invalid wsize value\n",
2110 __func__);
2111 goto cifs_parse_mount_err;
2112 }
2113 vol->wsize = option;
2114 break;
2115 case Opt_actimeo:
2116 if (get_option_ul(args, &option)) {
2117 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2118 __func__);
2119 goto cifs_parse_mount_err;
2120 }
2121 vol->actimeo = HZ * option;
2122 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2123 cifs_dbg(VFS, "attribute cache timeout too large\n");
2124 goto cifs_parse_mount_err;
2125 }
2126 break;
2127 case Opt_handletimeout:
2128 if (get_option_ul(args, &option)) {
2129 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2130 __func__);
2131 goto cifs_parse_mount_err;
2132 }
2133 vol->handle_timeout = option;
2134 if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2135 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2136 goto cifs_parse_mount_err;
2137 }
2138 break;
2139 case Opt_echo_interval:
2140 if (get_option_ul(args, &option)) {
2141 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2142 __func__);
2143 goto cifs_parse_mount_err;
2144 }
2145 vol->echo_interval = option;
2146 break;
2147 case Opt_snapshot:
2148 if (get_option_ul(args, &option)) {
2149 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2150 __func__);
2151 goto cifs_parse_mount_err;
2152 }
2153 vol->snapshot_time = option;
2154 break;
2155 case Opt_max_credits:
2156 if (get_option_ul(args, &option) || (option < 20) ||
2157 (option > 60000)) {
2158 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2159 __func__);
2160 goto cifs_parse_mount_err;
2161 }
2162 vol->max_credits = option;
2163 break;
2164
2165 /* String Arguments */
2166
2167 case Opt_blank_user:
2168 /* null user, ie. anonymous authentication */
2169 vol->nullauth = 1;
2170 vol->username = NULL;
2171 break;
2172 case Opt_user:
2173 string = match_strdup(args);
2174 if (string == NULL)
2175 goto out_nomem;
2176
2177 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2178 CIFS_MAX_USERNAME_LEN) {
2179 pr_warn("CIFS: username too long\n");
2180 goto cifs_parse_mount_err;
2181 }
2182
2183 kfree(vol->username);
2184 vol->username = kstrdup(string, GFP_KERNEL);
2185 if (!vol->username)
2186 goto cifs_parse_mount_err;
2187 break;
2188 case Opt_blank_pass:
2189 /* passwords have to be handled differently
2190 * to allow the character used for deliminator
2191 * to be passed within them
2192 */
2193
2194 /*
2195 * Check if this is a case where the password
2196 * starts with a delimiter
2197 */
2198 tmp_end = strchr(data, '=');
2199 tmp_end++;
2200 if (!(tmp_end < end && tmp_end[1] == delim)) {
2201 /* No it is not. Set the password to NULL */
2202 kzfree(vol->password);
2203 vol->password = NULL;
2204 break;
2205 }
2206 /* Fallthrough - to Opt_pass below.*/
2207 case Opt_pass:
2208 /* Obtain the value string */
2209 value = strchr(data, '=');
2210 value++;
2211
2212 /* Set tmp_end to end of the string */
2213 tmp_end = (char *) value + strlen(value);
2214
2215 /* Check if following character is the deliminator
2216 * If yes, we have encountered a double deliminator
2217 * reset the NULL character to the deliminator
2218 */
2219 if (tmp_end < end && tmp_end[1] == delim) {
2220 tmp_end[0] = delim;
2221
2222 /* Keep iterating until we get to a single
2223 * deliminator OR the end
2224 */
2225 while ((tmp_end = strchr(tmp_end, delim))
2226 != NULL && (tmp_end[1] == delim)) {
2227 tmp_end = (char *) &tmp_end[2];
2228 }
2229
2230 /* Reset var options to point to next element */
2231 if (tmp_end) {
2232 tmp_end[0] = '\0';
2233 options = (char *) &tmp_end[1];
2234 } else
2235 /* Reached the end of the mount option
2236 * string */
2237 options = end;
2238 }
2239
2240 kzfree(vol->password);
2241 /* Now build new password string */
2242 temp_len = strlen(value);
2243 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2244 if (vol->password == NULL) {
2245 pr_warn("CIFS: no memory for password\n");
2246 goto cifs_parse_mount_err;
2247 }
2248
2249 for (i = 0, j = 0; i < temp_len; i++, j++) {
2250 vol->password[j] = value[i];
2251 if ((value[i] == delim) &&
2252 value[i+1] == delim)
2253 /* skip the second deliminator */
2254 i++;
2255 }
2256 vol->password[j] = '\0';
2257 break;
2258 case Opt_blank_ip:
2259 /* FIXME: should this be an error instead? */
2260 got_ip = false;
2261 break;
2262 case Opt_ip:
2263 string = match_strdup(args);
2264 if (string == NULL)
2265 goto out_nomem;
2266
2267 if (!cifs_convert_address(dstaddr, string,
2268 strlen(string))) {
2269 pr_err("CIFS: bad ip= option (%s).\n", string);
2270 goto cifs_parse_mount_err;
2271 }
2272 got_ip = true;
2273 break;
2274 case Opt_domain:
2275 string = match_strdup(args);
2276 if (string == NULL)
2277 goto out_nomem;
2278
2279 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2280 == CIFS_MAX_DOMAINNAME_LEN) {
2281 pr_warn("CIFS: domain name too long\n");
2282 goto cifs_parse_mount_err;
2283 }
2284
2285 kfree(vol->domainname);
2286 vol->domainname = kstrdup(string, GFP_KERNEL);
2287 if (!vol->domainname) {
2288 pr_warn("CIFS: no memory for domainname\n");
2289 goto cifs_parse_mount_err;
2290 }
2291 cifs_dbg(FYI, "Domain name set\n");
2292 break;
2293 case Opt_srcaddr:
2294 string = match_strdup(args);
2295 if (string == NULL)
2296 goto out_nomem;
2297
2298 if (!cifs_convert_address(
2299 (struct sockaddr *)&vol->srcaddr,
2300 string, strlen(string))) {
2301 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2302 string);
2303 goto cifs_parse_mount_err;
2304 }
2305 break;
2306 case Opt_iocharset:
2307 string = match_strdup(args);
2308 if (string == NULL)
2309 goto out_nomem;
2310
2311 if (strnlen(string, 1024) >= 65) {
2312 pr_warn("CIFS: iocharset name too long.\n");
2313 goto cifs_parse_mount_err;
2314 }
2315
2316 if (strncasecmp(string, "default", 7) != 0) {
2317 kfree(vol->iocharset);
2318 vol->iocharset = kstrdup(string,
2319 GFP_KERNEL);
2320 if (!vol->iocharset) {
2321 pr_warn("CIFS: no memory for charset\n");
2322 goto cifs_parse_mount_err;
2323 }
2324 }
2325 /* if iocharset not set then load_nls_default
2326 * is used by caller
2327 */
2328 cifs_dbg(FYI, "iocharset set to %s\n", string);
2329 break;
2330 case Opt_netbiosname:
2331 string = match_strdup(args);
2332 if (string == NULL)
2333 goto out_nomem;
2334
2335 memset(vol->source_rfc1001_name, 0x20,
2336 RFC1001_NAME_LEN);
2337 /*
2338 * FIXME: are there cases in which a comma can
2339 * be valid in workstation netbios name (and
2340 * need special handling)?
2341 */
2342 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2343 /* don't ucase netbiosname for user */
2344 if (string[i] == 0)
2345 break;
2346 vol->source_rfc1001_name[i] = string[i];
2347 }
2348 /* The string has 16th byte zero still from
2349 * set at top of the function
2350 */
2351 if (i == RFC1001_NAME_LEN && string[i] != 0)
2352 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2353 break;
2354 case Opt_servern:
2355 /* servernetbiosname specified override *SMBSERVER */
2356 string = match_strdup(args);
2357 if (string == NULL)
2358 goto out_nomem;
2359
2360 /* last byte, type, is 0x20 for servr type */
2361 memset(vol->target_rfc1001_name, 0x20,
2362 RFC1001_NAME_LEN_WITH_NULL);
2363
2364 /* BB are there cases in which a comma can be
2365 valid in this workstation netbios name
2366 (and need special handling)? */
2367
2368 /* user or mount helper must uppercase the
2369 netbios name */
2370 for (i = 0; i < 15; i++) {
2371 if (string[i] == 0)
2372 break;
2373 vol->target_rfc1001_name[i] = string[i];
2374 }
2375 /* The string has 16th byte zero still from
2376 set at top of the function */
2377 if (i == RFC1001_NAME_LEN && string[i] != 0)
2378 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2379 break;
2380 case Opt_ver:
2381 /* version of mount userspace tools, not dialect */
2382 string = match_strdup(args);
2383 if (string == NULL)
2384 goto out_nomem;
2385
2386 /* If interface changes in mount.cifs bump to new ver */
2387 if (strncasecmp(string, "1", 1) == 0) {
2388 if (strlen(string) > 1) {
2389 pr_warn("Bad mount helper ver=%s. Did "
2390 "you want SMB1 (CIFS) dialect "
2391 "and mean to type vers=1.0 "
2392 "instead?\n", string);
2393 goto cifs_parse_mount_err;
2394 }
2395 /* This is the default */
2396 break;
2397 }
2398 /* For all other value, error */
2399 pr_warn("CIFS: Invalid mount helper version specified\n");
2400 goto cifs_parse_mount_err;
2401 case Opt_vers:
2402 /* protocol version (dialect) */
2403 string = match_strdup(args);
2404 if (string == NULL)
2405 goto out_nomem;
2406
2407 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2408 goto cifs_parse_mount_err;
2409 got_version = true;
2410 break;
2411 case Opt_sec:
2412 string = match_strdup(args);
2413 if (string == NULL)
2414 goto out_nomem;
2415
2416 if (cifs_parse_security_flavors(string, vol) != 0)
2417 goto cifs_parse_mount_err;
2418 break;
2419 case Opt_cache:
2420 string = match_strdup(args);
2421 if (string == NULL)
2422 goto out_nomem;
2423
2424 if (cifs_parse_cache_flavor(string, vol) != 0)
2425 goto cifs_parse_mount_err;
2426 break;
2427 default:
2428 /*
2429 * An option we don't recognize. Save it off for later
2430 * if we haven't already found one
2431 */
2432 if (!invalid)
2433 invalid = data;
2434 break;
2435 }
2436 /* Free up any allocated string */
2437 kfree(string);
2438 string = NULL;
2439 }
2440
2441 if (!sloppy && invalid) {
2442 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2443 goto cifs_parse_mount_err;
2444 }
2445
2446 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2447 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2448 goto cifs_parse_mount_err;
2449 }
2450
2451 #ifndef CONFIG_KEYS
2452 /* Muliuser mounts require CONFIG_KEYS support */
2453 if (vol->multiuser) {
2454 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2455 goto cifs_parse_mount_err;
2456 }
2457 #endif
2458 if (!vol->UNC) {
2459 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2460 goto cifs_parse_mount_err;
2461 }
2462
2463 /* make sure UNC has a share name */
2464 if (!strchr(vol->UNC + 3, '\\')) {
2465 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2466 goto cifs_parse_mount_err;
2467 }
2468
2469 if (!got_ip) {
2470 int len;
2471 const char *slash;
2472
2473 /* No ip= option specified? Try to get it from UNC */
2474 /* Use the address part of the UNC. */
2475 slash = strchr(&vol->UNC[2], '\\');
2476 len = slash - &vol->UNC[2];
2477 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2478 pr_err("Unable to determine destination address.\n");
2479 goto cifs_parse_mount_err;
2480 }
2481 }
2482
2483 /* set the port that we got earlier */
2484 cifs_set_port(dstaddr, port);
2485
2486 if (uid_specified)
2487 vol->override_uid = override_uid;
2488 else if (override_uid == 1)
2489 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2490
2491 if (gid_specified)
2492 vol->override_gid = override_gid;
2493 else if (override_gid == 1)
2494 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2495
2496 if (got_version == false)
2497 pr_warn("No dialect specified on mount. Default has changed to "
2498 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2499 "(SMB1). To use the less secure SMB1 dialect to access "
2500 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2501 " on mount.\n");
2502
2503 kfree(mountdata_copy);
2504 return 0;
2505
2506 out_nomem:
2507 pr_warn("Could not allocate temporary buffer\n");
2508 cifs_parse_mount_err:
2509 kfree(string);
2510 kfree(mountdata_copy);
2511 return 1;
2512 }
2513
2514 /** Returns true if srcaddr isn't specified and rhs isn't
2515 * specified, or if srcaddr is specified and
2516 * matches the IP address of the rhs argument.
2517 */
2518 static bool
srcip_matches(struct sockaddr * srcaddr,struct sockaddr * rhs)2519 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2520 {
2521 switch (srcaddr->sa_family) {
2522 case AF_UNSPEC:
2523 return (rhs->sa_family == AF_UNSPEC);
2524 case AF_INET: {
2525 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2526 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2527 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2528 }
2529 case AF_INET6: {
2530 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2531 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2532 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2533 }
2534 default:
2535 WARN_ON(1);
2536 return false; /* don't expect to be here */
2537 }
2538 }
2539
2540 /*
2541 * If no port is specified in addr structure, we try to match with 445 port
2542 * and if it fails - with 139 ports. It should be called only if address
2543 * families of server and addr are equal.
2544 */
2545 static bool
match_port(struct TCP_Server_Info * server,struct sockaddr * addr)2546 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2547 {
2548 __be16 port, *sport;
2549
2550 /* SMBDirect manages its own ports, don't match it here */
2551 if (server->rdma)
2552 return true;
2553
2554 switch (addr->sa_family) {
2555 case AF_INET:
2556 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2557 port = ((struct sockaddr_in *) addr)->sin_port;
2558 break;
2559 case AF_INET6:
2560 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2561 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2562 break;
2563 default:
2564 WARN_ON(1);
2565 return false;
2566 }
2567
2568 if (!port) {
2569 port = htons(CIFS_PORT);
2570 if (port == *sport)
2571 return true;
2572
2573 port = htons(RFC1001_PORT);
2574 }
2575
2576 return port == *sport;
2577 }
2578
2579 static bool
match_address(struct TCP_Server_Info * server,struct sockaddr * addr,struct sockaddr * srcaddr)2580 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2581 struct sockaddr *srcaddr)
2582 {
2583 switch (addr->sa_family) {
2584 case AF_INET: {
2585 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2586 struct sockaddr_in *srv_addr4 =
2587 (struct sockaddr_in *)&server->dstaddr;
2588
2589 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2590 return false;
2591 break;
2592 }
2593 case AF_INET6: {
2594 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2595 struct sockaddr_in6 *srv_addr6 =
2596 (struct sockaddr_in6 *)&server->dstaddr;
2597
2598 if (!ipv6_addr_equal(&addr6->sin6_addr,
2599 &srv_addr6->sin6_addr))
2600 return false;
2601 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2602 return false;
2603 break;
2604 }
2605 default:
2606 WARN_ON(1);
2607 return false; /* don't expect to be here */
2608 }
2609
2610 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2611 return false;
2612
2613 return true;
2614 }
2615
2616 static bool
match_security(struct TCP_Server_Info * server,struct smb_vol * vol)2617 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2618 {
2619 /*
2620 * The select_sectype function should either return the vol->sectype
2621 * that was specified, or "Unspecified" if that sectype was not
2622 * compatible with the given NEGOTIATE request.
2623 */
2624 if (server->ops->select_sectype(server, vol->sectype)
2625 == Unspecified)
2626 return false;
2627
2628 /*
2629 * Now check if signing mode is acceptable. No need to check
2630 * global_secflags at this point since if MUST_SIGN is set then
2631 * the server->sign had better be too.
2632 */
2633 if (vol->sign && !server->sign)
2634 return false;
2635
2636 return true;
2637 }
2638
match_server(struct TCP_Server_Info * server,struct smb_vol * vol)2639 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2640 {
2641 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2642
2643 if (vol->nosharesock)
2644 return 0;
2645
2646 /* If multidialect negotiation see if existing sessions match one */
2647 if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2648 if (server->vals->protocol_id < SMB30_PROT_ID)
2649 return 0;
2650 } else if (strcmp(vol->vals->version_string,
2651 SMBDEFAULT_VERSION_STRING) == 0) {
2652 if (server->vals->protocol_id < SMB21_PROT_ID)
2653 return 0;
2654 } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2655 return 0;
2656
2657 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2658 return 0;
2659
2660 if (!match_address(server, addr,
2661 (struct sockaddr *)&vol->srcaddr))
2662 return 0;
2663
2664 if (!match_port(server, addr))
2665 return 0;
2666
2667 if (!match_security(server, vol))
2668 return 0;
2669
2670 if (server->echo_interval != vol->echo_interval * HZ)
2671 return 0;
2672
2673 if (server->rdma != vol->rdma)
2674 return 0;
2675
2676 if (server->ignore_signature != vol->ignore_signature)
2677 return 0;
2678
2679 if (server->min_offload != vol->min_offload)
2680 return 0;
2681
2682 return 1;
2683 }
2684
2685 struct TCP_Server_Info *
cifs_find_tcp_session(struct smb_vol * vol)2686 cifs_find_tcp_session(struct smb_vol *vol)
2687 {
2688 struct TCP_Server_Info *server;
2689
2690 spin_lock(&cifs_tcp_ses_lock);
2691 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2692 if (!match_server(server, vol))
2693 continue;
2694
2695 ++server->srv_count;
2696 spin_unlock(&cifs_tcp_ses_lock);
2697 cifs_dbg(FYI, "Existing tcp session with server found\n");
2698 return server;
2699 }
2700 spin_unlock(&cifs_tcp_ses_lock);
2701 return NULL;
2702 }
2703
2704 void
cifs_put_tcp_session(struct TCP_Server_Info * server,int from_reconnect)2705 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2706 {
2707 struct task_struct *task;
2708
2709 spin_lock(&cifs_tcp_ses_lock);
2710 if (--server->srv_count > 0) {
2711 spin_unlock(&cifs_tcp_ses_lock);
2712 return;
2713 }
2714
2715 put_net(cifs_net_ns(server));
2716
2717 list_del_init(&server->tcp_ses_list);
2718 spin_unlock(&cifs_tcp_ses_lock);
2719
2720 cancel_delayed_work_sync(&server->echo);
2721
2722 if (from_reconnect)
2723 /*
2724 * Avoid deadlock here: reconnect work calls
2725 * cifs_put_tcp_session() at its end. Need to be sure
2726 * that reconnect work does nothing with server pointer after
2727 * that step.
2728 */
2729 cancel_delayed_work(&server->reconnect);
2730 else
2731 cancel_delayed_work_sync(&server->reconnect);
2732
2733 spin_lock(&GlobalMid_Lock);
2734 server->tcpStatus = CifsExiting;
2735 spin_unlock(&GlobalMid_Lock);
2736
2737 cifs_crypto_secmech_release(server);
2738 cifs_fscache_release_client_cookie(server);
2739
2740 kfree(server->session_key.response);
2741 server->session_key.response = NULL;
2742 server->session_key.len = 0;
2743
2744 task = xchg(&server->tsk, NULL);
2745 if (task)
2746 send_sig(SIGKILL, task, 1);
2747 }
2748
2749 static struct TCP_Server_Info *
cifs_get_tcp_session(struct smb_vol * volume_info)2750 cifs_get_tcp_session(struct smb_vol *volume_info)
2751 {
2752 struct TCP_Server_Info *tcp_ses = NULL;
2753 int rc;
2754
2755 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2756
2757 /* see if we already have a matching tcp_ses */
2758 tcp_ses = cifs_find_tcp_session(volume_info);
2759 if (tcp_ses)
2760 return tcp_ses;
2761
2762 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2763 if (!tcp_ses) {
2764 rc = -ENOMEM;
2765 goto out_err;
2766 }
2767
2768 tcp_ses->ops = volume_info->ops;
2769 tcp_ses->vals = volume_info->vals;
2770 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2771 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2772 if (IS_ERR(tcp_ses->hostname)) {
2773 rc = PTR_ERR(tcp_ses->hostname);
2774 goto out_err_crypto_release;
2775 }
2776
2777 tcp_ses->noblockcnt = volume_info->rootfs;
2778 tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2779 tcp_ses->noautotune = volume_info->noautotune;
2780 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2781 tcp_ses->rdma = volume_info->rdma;
2782 tcp_ses->in_flight = 0;
2783 tcp_ses->max_in_flight = 0;
2784 tcp_ses->credits = 1;
2785 init_waitqueue_head(&tcp_ses->response_q);
2786 init_waitqueue_head(&tcp_ses->request_q);
2787 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2788 mutex_init(&tcp_ses->srv_mutex);
2789 memcpy(tcp_ses->workstation_RFC1001_name,
2790 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2791 memcpy(tcp_ses->server_RFC1001_name,
2792 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2793 tcp_ses->session_estab = false;
2794 tcp_ses->sequence_number = 0;
2795 tcp_ses->reconnect_instance = 1;
2796 tcp_ses->lstrp = jiffies;
2797 tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2798 spin_lock_init(&tcp_ses->req_lock);
2799 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2800 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2801 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2802 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2803 mutex_init(&tcp_ses->reconnect_mutex);
2804 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2805 sizeof(tcp_ses->srcaddr));
2806 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2807 sizeof(tcp_ses->dstaddr));
2808 generate_random_uuid(tcp_ses->client_guid);
2809 /*
2810 * at this point we are the only ones with the pointer
2811 * to the struct since the kernel thread not created yet
2812 * no need to spinlock this init of tcpStatus or srv_count
2813 */
2814 tcp_ses->tcpStatus = CifsNew;
2815 ++tcp_ses->srv_count;
2816
2817 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2818 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2819 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2820 else
2821 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2822 if (tcp_ses->rdma) {
2823 #ifndef CONFIG_CIFS_SMB_DIRECT
2824 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2825 rc = -ENOENT;
2826 goto out_err_crypto_release;
2827 #endif
2828 tcp_ses->smbd_conn = smbd_get_connection(
2829 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2830 if (tcp_ses->smbd_conn) {
2831 cifs_dbg(VFS, "RDMA transport established\n");
2832 rc = 0;
2833 goto smbd_connected;
2834 } else {
2835 rc = -ENOENT;
2836 goto out_err_crypto_release;
2837 }
2838 }
2839 rc = ip_connect(tcp_ses);
2840 if (rc < 0) {
2841 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2842 goto out_err_crypto_release;
2843 }
2844 smbd_connected:
2845 /*
2846 * since we're in a cifs function already, we know that
2847 * this will succeed. No need for try_module_get().
2848 */
2849 __module_get(THIS_MODULE);
2850 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2851 tcp_ses, "cifsd");
2852 if (IS_ERR(tcp_ses->tsk)) {
2853 rc = PTR_ERR(tcp_ses->tsk);
2854 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2855 module_put(THIS_MODULE);
2856 goto out_err_crypto_release;
2857 }
2858 tcp_ses->min_offload = volume_info->min_offload;
2859 tcp_ses->tcpStatus = CifsNeedNegotiate;
2860
2861 tcp_ses->nr_targets = 1;
2862 tcp_ses->ignore_signature = volume_info->ignore_signature;
2863 /* thread spawned, put it on the list */
2864 spin_lock(&cifs_tcp_ses_lock);
2865 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2866 spin_unlock(&cifs_tcp_ses_lock);
2867
2868 cifs_fscache_get_client_cookie(tcp_ses);
2869
2870 /* queue echo request delayed work */
2871 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2872
2873 return tcp_ses;
2874
2875 out_err_crypto_release:
2876 cifs_crypto_secmech_release(tcp_ses);
2877
2878 put_net(cifs_net_ns(tcp_ses));
2879
2880 out_err:
2881 if (tcp_ses) {
2882 if (!IS_ERR(tcp_ses->hostname))
2883 kfree(tcp_ses->hostname);
2884 if (tcp_ses->ssocket)
2885 sock_release(tcp_ses->ssocket);
2886 kfree(tcp_ses);
2887 }
2888 return ERR_PTR(rc);
2889 }
2890
match_session(struct cifs_ses * ses,struct smb_vol * vol)2891 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2892 {
2893 if (vol->sectype != Unspecified &&
2894 vol->sectype != ses->sectype)
2895 return 0;
2896
2897 switch (ses->sectype) {
2898 case Kerberos:
2899 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2900 return 0;
2901 break;
2902 default:
2903 /* NULL username means anonymous session */
2904 if (ses->user_name == NULL) {
2905 if (!vol->nullauth)
2906 return 0;
2907 break;
2908 }
2909
2910 /* anything else takes username/password */
2911 if (strncmp(ses->user_name,
2912 vol->username ? vol->username : "",
2913 CIFS_MAX_USERNAME_LEN))
2914 return 0;
2915 if ((vol->username && strlen(vol->username) != 0) &&
2916 ses->password != NULL &&
2917 strncmp(ses->password,
2918 vol->password ? vol->password : "",
2919 CIFS_MAX_PASSWORD_LEN))
2920 return 0;
2921 }
2922 return 1;
2923 }
2924
2925 /**
2926 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2927 *
2928 * A new IPC connection is made and stored in the session
2929 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2930 */
2931 static int
cifs_setup_ipc(struct cifs_ses * ses,struct smb_vol * volume_info)2932 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2933 {
2934 int rc = 0, xid;
2935 struct cifs_tcon *tcon;
2936 struct nls_table *nls_codepage;
2937 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2938 bool seal = false;
2939 struct TCP_Server_Info *server = ses->server;
2940
2941 /*
2942 * If the mount request that resulted in the creation of the
2943 * session requires encryption, force IPC to be encrypted too.
2944 */
2945 if (volume_info->seal) {
2946 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2947 seal = true;
2948 else {
2949 cifs_server_dbg(VFS,
2950 "IPC: server doesn't support encryption\n");
2951 return -EOPNOTSUPP;
2952 }
2953 }
2954
2955 tcon = tconInfoAlloc();
2956 if (tcon == NULL)
2957 return -ENOMEM;
2958
2959 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2960
2961 /* cannot fail */
2962 nls_codepage = load_nls_default();
2963
2964 xid = get_xid();
2965 tcon->ses = ses;
2966 tcon->ipc = true;
2967 tcon->seal = seal;
2968 rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2969 free_xid(xid);
2970
2971 if (rc) {
2972 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2973 tconInfoFree(tcon);
2974 goto out;
2975 }
2976
2977 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2978
2979 ses->tcon_ipc = tcon;
2980 out:
2981 unload_nls(nls_codepage);
2982 return rc;
2983 }
2984
2985 /**
2986 * cifs_free_ipc - helper to release the session IPC tcon
2987 *
2988 * Needs to be called everytime a session is destroyed
2989 */
2990 static int
cifs_free_ipc(struct cifs_ses * ses)2991 cifs_free_ipc(struct cifs_ses *ses)
2992 {
2993 int rc = 0, xid;
2994 struct cifs_tcon *tcon = ses->tcon_ipc;
2995
2996 if (tcon == NULL)
2997 return 0;
2998
2999 if (ses->server->ops->tree_disconnect) {
3000 xid = get_xid();
3001 rc = ses->server->ops->tree_disconnect(xid, tcon);
3002 free_xid(xid);
3003 }
3004
3005 if (rc)
3006 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
3007
3008 tconInfoFree(tcon);
3009 ses->tcon_ipc = NULL;
3010 return rc;
3011 }
3012
3013 static struct cifs_ses *
cifs_find_smb_ses(struct TCP_Server_Info * server,struct smb_vol * vol)3014 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
3015 {
3016 struct cifs_ses *ses;
3017
3018 spin_lock(&cifs_tcp_ses_lock);
3019 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
3020 if (ses->status == CifsExiting)
3021 continue;
3022 if (!match_session(ses, vol))
3023 continue;
3024 ++ses->ses_count;
3025 spin_unlock(&cifs_tcp_ses_lock);
3026 return ses;
3027 }
3028 spin_unlock(&cifs_tcp_ses_lock);
3029 return NULL;
3030 }
3031
cifs_put_smb_ses(struct cifs_ses * ses)3032 void cifs_put_smb_ses(struct cifs_ses *ses)
3033 {
3034 unsigned int rc, xid;
3035 struct TCP_Server_Info *server = ses->server;
3036
3037 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
3038
3039 spin_lock(&cifs_tcp_ses_lock);
3040 if (ses->status == CifsExiting) {
3041 spin_unlock(&cifs_tcp_ses_lock);
3042 return;
3043 }
3044 if (--ses->ses_count > 0) {
3045 spin_unlock(&cifs_tcp_ses_lock);
3046 return;
3047 }
3048 if (ses->status == CifsGood)
3049 ses->status = CifsExiting;
3050 spin_unlock(&cifs_tcp_ses_lock);
3051
3052 cifs_free_ipc(ses);
3053
3054 if (ses->status == CifsExiting && server->ops->logoff) {
3055 xid = get_xid();
3056 rc = server->ops->logoff(xid, ses);
3057 if (rc)
3058 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3059 __func__, rc);
3060 _free_xid(xid);
3061 }
3062
3063 spin_lock(&cifs_tcp_ses_lock);
3064 list_del_init(&ses->smb_ses_list);
3065 spin_unlock(&cifs_tcp_ses_lock);
3066
3067 sesInfoFree(ses);
3068 cifs_put_tcp_session(server, 0);
3069 }
3070
3071 #ifdef CONFIG_KEYS
3072
3073 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3074 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3075
3076 /* Populate username and pw fields from keyring if possible */
3077 static int
cifs_set_cifscreds(struct smb_vol * vol,struct cifs_ses * ses)3078 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3079 {
3080 int rc = 0;
3081 int is_domain = 0;
3082 const char *delim, *payload;
3083 char *desc;
3084 ssize_t len;
3085 struct key *key;
3086 struct TCP_Server_Info *server = ses->server;
3087 struct sockaddr_in *sa;
3088 struct sockaddr_in6 *sa6;
3089 const struct user_key_payload *upayload;
3090
3091 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
3092 if (!desc)
3093 return -ENOMEM;
3094
3095 /* try to find an address key first */
3096 switch (server->dstaddr.ss_family) {
3097 case AF_INET:
3098 sa = (struct sockaddr_in *)&server->dstaddr;
3099 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
3100 break;
3101 case AF_INET6:
3102 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
3103 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
3104 break;
3105 default:
3106 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3107 server->dstaddr.ss_family);
3108 rc = -EINVAL;
3109 goto out_err;
3110 }
3111
3112 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3113 key = request_key(&key_type_logon, desc, "");
3114 if (IS_ERR(key)) {
3115 if (!ses->domainName) {
3116 cifs_dbg(FYI, "domainName is NULL\n");
3117 rc = PTR_ERR(key);
3118 goto out_err;
3119 }
3120
3121 /* didn't work, try to find a domain key */
3122 sprintf(desc, "cifs:d:%s", ses->domainName);
3123 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3124 key = request_key(&key_type_logon, desc, "");
3125 if (IS_ERR(key)) {
3126 rc = PTR_ERR(key);
3127 goto out_err;
3128 }
3129 is_domain = 1;
3130 }
3131
3132 down_read(&key->sem);
3133 upayload = user_key_payload_locked(key);
3134 if (IS_ERR_OR_NULL(upayload)) {
3135 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3136 goto out_key_put;
3137 }
3138
3139 /* find first : in payload */
3140 payload = upayload->data;
3141 delim = strnchr(payload, upayload->datalen, ':');
3142 cifs_dbg(FYI, "payload=%s\n", payload);
3143 if (!delim) {
3144 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3145 upayload->datalen);
3146 rc = -EINVAL;
3147 goto out_key_put;
3148 }
3149
3150 len = delim - payload;
3151 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3152 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3153 len);
3154 rc = -EINVAL;
3155 goto out_key_put;
3156 }
3157
3158 vol->username = kstrndup(payload, len, GFP_KERNEL);
3159 if (!vol->username) {
3160 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3161 len);
3162 rc = -ENOMEM;
3163 goto out_key_put;
3164 }
3165 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3166
3167 len = key->datalen - (len + 1);
3168 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3169 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3170 rc = -EINVAL;
3171 kfree(vol->username);
3172 vol->username = NULL;
3173 goto out_key_put;
3174 }
3175
3176 ++delim;
3177 vol->password = kstrndup(delim, len, GFP_KERNEL);
3178 if (!vol->password) {
3179 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3180 len);
3181 rc = -ENOMEM;
3182 kfree(vol->username);
3183 vol->username = NULL;
3184 goto out_key_put;
3185 }
3186
3187 /*
3188 * If we have a domain key then we must set the domainName in the
3189 * for the request.
3190 */
3191 if (is_domain && ses->domainName) {
3192 vol->domainname = kstrndup(ses->domainName,
3193 strlen(ses->domainName),
3194 GFP_KERNEL);
3195 if (!vol->domainname) {
3196 cifs_dbg(FYI, "Unable to allocate %zd bytes for "
3197 "domain\n", len);
3198 rc = -ENOMEM;
3199 kfree(vol->username);
3200 vol->username = NULL;
3201 kzfree(vol->password);
3202 vol->password = NULL;
3203 goto out_key_put;
3204 }
3205 }
3206
3207 out_key_put:
3208 up_read(&key->sem);
3209 key_put(key);
3210 out_err:
3211 kfree(desc);
3212 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3213 return rc;
3214 }
3215 #else /* ! CONFIG_KEYS */
3216 static inline int
cifs_set_cifscreds(struct smb_vol * vol,struct cifs_ses * ses)3217 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3218 struct cifs_ses *ses __attribute__((unused)))
3219 {
3220 return -ENOSYS;
3221 }
3222 #endif /* CONFIG_KEYS */
3223
3224 /**
3225 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3226 *
3227 * This function assumes it is being called from cifs_mount() where we
3228 * already got a server reference (server refcount +1). See
3229 * cifs_get_tcon() for refcount explanations.
3230 */
3231 struct cifs_ses *
cifs_get_smb_ses(struct TCP_Server_Info * server,struct smb_vol * volume_info)3232 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3233 {
3234 int rc = -ENOMEM;
3235 unsigned int xid;
3236 struct cifs_ses *ses;
3237 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3238 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3239
3240 xid = get_xid();
3241
3242 ses = cifs_find_smb_ses(server, volume_info);
3243 if (ses) {
3244 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3245 ses->status);
3246
3247 mutex_lock(&ses->session_mutex);
3248 rc = cifs_negotiate_protocol(xid, ses);
3249 if (rc) {
3250 mutex_unlock(&ses->session_mutex);
3251 /* problem -- put our ses reference */
3252 cifs_put_smb_ses(ses);
3253 free_xid(xid);
3254 return ERR_PTR(rc);
3255 }
3256 if (ses->need_reconnect) {
3257 cifs_dbg(FYI, "Session needs reconnect\n");
3258 rc = cifs_setup_session(xid, ses,
3259 volume_info->local_nls);
3260 if (rc) {
3261 mutex_unlock(&ses->session_mutex);
3262 /* problem -- put our reference */
3263 cifs_put_smb_ses(ses);
3264 free_xid(xid);
3265 return ERR_PTR(rc);
3266 }
3267 }
3268 mutex_unlock(&ses->session_mutex);
3269
3270 /* existing SMB ses has a server reference already */
3271 cifs_put_tcp_session(server, 0);
3272 free_xid(xid);
3273 return ses;
3274 }
3275
3276 cifs_dbg(FYI, "Existing smb sess not found\n");
3277 ses = sesInfoAlloc();
3278 if (ses == NULL)
3279 goto get_ses_fail;
3280
3281 /* new SMB session uses our server ref */
3282 ses->server = server;
3283 if (server->dstaddr.ss_family == AF_INET6)
3284 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3285 else
3286 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3287
3288 if (volume_info->username) {
3289 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3290 if (!ses->user_name)
3291 goto get_ses_fail;
3292 }
3293
3294 /* volume_info->password freed at unmount */
3295 if (volume_info->password) {
3296 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3297 if (!ses->password)
3298 goto get_ses_fail;
3299 }
3300 if (volume_info->domainname) {
3301 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3302 if (!ses->domainName)
3303 goto get_ses_fail;
3304 }
3305 if (volume_info->domainauto)
3306 ses->domainAuto = volume_info->domainauto;
3307 ses->cred_uid = volume_info->cred_uid;
3308 ses->linux_uid = volume_info->linux_uid;
3309
3310 ses->sectype = volume_info->sectype;
3311 ses->sign = volume_info->sign;
3312 mutex_lock(&ses->session_mutex);
3313 rc = cifs_negotiate_protocol(xid, ses);
3314 if (!rc)
3315 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3316 mutex_unlock(&ses->session_mutex);
3317 if (rc)
3318 goto get_ses_fail;
3319
3320 /* success, put it on the list */
3321 spin_lock(&cifs_tcp_ses_lock);
3322 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3323 spin_unlock(&cifs_tcp_ses_lock);
3324
3325 free_xid(xid);
3326
3327 cifs_setup_ipc(ses, volume_info);
3328
3329 return ses;
3330
3331 get_ses_fail:
3332 sesInfoFree(ses);
3333 free_xid(xid);
3334 return ERR_PTR(rc);
3335 }
3336
match_tcon(struct cifs_tcon * tcon,struct smb_vol * volume_info)3337 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3338 {
3339 if (tcon->tidStatus == CifsExiting)
3340 return 0;
3341 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3342 return 0;
3343 if (tcon->seal != volume_info->seal)
3344 return 0;
3345 if (tcon->snapshot_time != volume_info->snapshot_time)
3346 return 0;
3347 if (tcon->handle_timeout != volume_info->handle_timeout)
3348 return 0;
3349 if (tcon->no_lease != volume_info->no_lease)
3350 return 0;
3351 return 1;
3352 }
3353
3354 static struct cifs_tcon *
cifs_find_tcon(struct cifs_ses * ses,struct smb_vol * volume_info)3355 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3356 {
3357 struct list_head *tmp;
3358 struct cifs_tcon *tcon;
3359
3360 spin_lock(&cifs_tcp_ses_lock);
3361 list_for_each(tmp, &ses->tcon_list) {
3362 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3363 if (!match_tcon(tcon, volume_info))
3364 continue;
3365 ++tcon->tc_count;
3366 spin_unlock(&cifs_tcp_ses_lock);
3367 return tcon;
3368 }
3369 spin_unlock(&cifs_tcp_ses_lock);
3370 return NULL;
3371 }
3372
3373 void
cifs_put_tcon(struct cifs_tcon * tcon)3374 cifs_put_tcon(struct cifs_tcon *tcon)
3375 {
3376 unsigned int xid;
3377 struct cifs_ses *ses;
3378
3379 /*
3380 * IPC tcon share the lifetime of their session and are
3381 * destroyed in the session put function
3382 */
3383 if (tcon == NULL || tcon->ipc)
3384 return;
3385
3386 ses = tcon->ses;
3387 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3388 spin_lock(&cifs_tcp_ses_lock);
3389 if (--tcon->tc_count > 0) {
3390 spin_unlock(&cifs_tcp_ses_lock);
3391 return;
3392 }
3393
3394 list_del_init(&tcon->tcon_list);
3395 spin_unlock(&cifs_tcp_ses_lock);
3396
3397 xid = get_xid();
3398 if (ses->server->ops->tree_disconnect)
3399 ses->server->ops->tree_disconnect(xid, tcon);
3400 _free_xid(xid);
3401
3402 cifs_fscache_release_super_cookie(tcon);
3403 tconInfoFree(tcon);
3404 cifs_put_smb_ses(ses);
3405 }
3406
3407 /**
3408 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3409 *
3410 * - tcon refcount is the number of mount points using the tcon.
3411 * - ses refcount is the number of tcon using the session.
3412 *
3413 * 1. This function assumes it is being called from cifs_mount() where
3414 * we already got a session reference (ses refcount +1).
3415 *
3416 * 2. Since we're in the context of adding a mount point, the end
3417 * result should be either:
3418 *
3419 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3420 * its session refcount incremented (1 new tcon). This +1 was
3421 * already done in (1).
3422 *
3423 * b) an existing tcon with refcount+1 (add a mount point to it) and
3424 * identical ses refcount (no new tcon). Because of (1) we need to
3425 * decrement the ses refcount.
3426 */
3427 static struct cifs_tcon *
cifs_get_tcon(struct cifs_ses * ses,struct smb_vol * volume_info)3428 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3429 {
3430 int rc, xid;
3431 struct cifs_tcon *tcon;
3432
3433 tcon = cifs_find_tcon(ses, volume_info);
3434 if (tcon) {
3435 /*
3436 * tcon has refcount already incremented but we need to
3437 * decrement extra ses reference gotten by caller (case b)
3438 */
3439 cifs_dbg(FYI, "Found match on UNC path\n");
3440 cifs_put_smb_ses(ses);
3441 return tcon;
3442 }
3443
3444 if (!ses->server->ops->tree_connect) {
3445 rc = -ENOSYS;
3446 goto out_fail;
3447 }
3448
3449 tcon = tconInfoAlloc();
3450 if (tcon == NULL) {
3451 rc = -ENOMEM;
3452 goto out_fail;
3453 }
3454
3455 if (volume_info->snapshot_time) {
3456 if (ses->server->vals->protocol_id == 0) {
3457 cifs_dbg(VFS,
3458 "Use SMB2 or later for snapshot mount option\n");
3459 rc = -EOPNOTSUPP;
3460 goto out_fail;
3461 } else
3462 tcon->snapshot_time = volume_info->snapshot_time;
3463 }
3464
3465 if (volume_info->handle_timeout) {
3466 if (ses->server->vals->protocol_id == 0) {
3467 cifs_dbg(VFS,
3468 "Use SMB2.1 or later for handle timeout option\n");
3469 rc = -EOPNOTSUPP;
3470 goto out_fail;
3471 } else
3472 tcon->handle_timeout = volume_info->handle_timeout;
3473 }
3474
3475 tcon->ses = ses;
3476 if (volume_info->password) {
3477 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3478 if (!tcon->password) {
3479 rc = -ENOMEM;
3480 goto out_fail;
3481 }
3482 }
3483
3484 if (volume_info->seal) {
3485 if (ses->server->vals->protocol_id == 0) {
3486 cifs_dbg(VFS,
3487 "SMB3 or later required for encryption\n");
3488 rc = -EOPNOTSUPP;
3489 goto out_fail;
3490 } else if (tcon->ses->server->capabilities &
3491 SMB2_GLOBAL_CAP_ENCRYPTION)
3492 tcon->seal = true;
3493 else {
3494 cifs_dbg(VFS, "Encryption is not supported on share\n");
3495 rc = -EOPNOTSUPP;
3496 goto out_fail;
3497 }
3498 }
3499
3500 if (volume_info->linux_ext) {
3501 if (ses->server->posix_ext_supported) {
3502 tcon->posix_extensions = true;
3503 printk_once(KERN_WARNING
3504 "SMB3.11 POSIX Extensions are experimental\n");
3505 } else {
3506 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3507 rc = -EOPNOTSUPP;
3508 goto out_fail;
3509 }
3510 }
3511
3512 /*
3513 * BB Do we need to wrap session_mutex around this TCon call and Unix
3514 * SetFS as we do on SessSetup and reconnect?
3515 */
3516 xid = get_xid();
3517 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3518 volume_info->local_nls);
3519 free_xid(xid);
3520 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3521 if (rc)
3522 goto out_fail;
3523
3524 tcon->use_persistent = false;
3525 /* check if SMB2 or later, CIFS does not support persistent handles */
3526 if (volume_info->persistent) {
3527 if (ses->server->vals->protocol_id == 0) {
3528 cifs_dbg(VFS,
3529 "SMB3 or later required for persistent handles\n");
3530 rc = -EOPNOTSUPP;
3531 goto out_fail;
3532 } else if (ses->server->capabilities &
3533 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3534 tcon->use_persistent = true;
3535 else /* persistent handles requested but not supported */ {
3536 cifs_dbg(VFS,
3537 "Persistent handles not supported on share\n");
3538 rc = -EOPNOTSUPP;
3539 goto out_fail;
3540 }
3541 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3542 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3543 && (volume_info->nopersistent == false)) {
3544 cifs_dbg(FYI, "enabling persistent handles\n");
3545 tcon->use_persistent = true;
3546 } else if (volume_info->resilient) {
3547 if (ses->server->vals->protocol_id == 0) {
3548 cifs_dbg(VFS,
3549 "SMB2.1 or later required for resilient handles\n");
3550 rc = -EOPNOTSUPP;
3551 goto out_fail;
3552 }
3553 tcon->use_resilient = true;
3554 }
3555
3556 /* If the user really knows what they are doing they can override */
3557 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3558 if (volume_info->cache_ro)
3559 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3560 else if (volume_info->cache_rw)
3561 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3562 }
3563
3564 /*
3565 * We can have only one retry value for a connection to a share so for
3566 * resources mounted more than once to the same server share the last
3567 * value passed in for the retry flag is used.
3568 */
3569 tcon->retry = volume_info->retry;
3570 tcon->nocase = volume_info->nocase;
3571 tcon->nohandlecache = volume_info->nohandlecache;
3572 tcon->local_lease = volume_info->local_lease;
3573 tcon->no_lease = volume_info->no_lease;
3574 INIT_LIST_HEAD(&tcon->pending_opens);
3575
3576 spin_lock(&cifs_tcp_ses_lock);
3577 list_add(&tcon->tcon_list, &ses->tcon_list);
3578 spin_unlock(&cifs_tcp_ses_lock);
3579
3580 cifs_fscache_get_super_cookie(tcon);
3581
3582 return tcon;
3583
3584 out_fail:
3585 tconInfoFree(tcon);
3586 return ERR_PTR(rc);
3587 }
3588
3589 void
cifs_put_tlink(struct tcon_link * tlink)3590 cifs_put_tlink(struct tcon_link *tlink)
3591 {
3592 if (!tlink || IS_ERR(tlink))
3593 return;
3594
3595 if (!atomic_dec_and_test(&tlink->tl_count) ||
3596 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3597 tlink->tl_time = jiffies;
3598 return;
3599 }
3600
3601 if (!IS_ERR(tlink_tcon(tlink)))
3602 cifs_put_tcon(tlink_tcon(tlink));
3603 kfree(tlink);
3604 return;
3605 }
3606
3607 static int
compare_mount_options(struct super_block * sb,struct cifs_mnt_data * mnt_data)3608 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3609 {
3610 struct cifs_sb_info *old = CIFS_SB(sb);
3611 struct cifs_sb_info *new = mnt_data->cifs_sb;
3612 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3613 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3614
3615 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3616 return 0;
3617
3618 if (old->mnt_cifs_serverino_autodisabled)
3619 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3620
3621 if (oldflags != newflags)
3622 return 0;
3623
3624 /*
3625 * We want to share sb only if we don't specify an r/wsize or
3626 * specified r/wsize is greater than or equal to existing one.
3627 */
3628 if (new->wsize && new->wsize < old->wsize)
3629 return 0;
3630
3631 if (new->rsize && new->rsize < old->rsize)
3632 return 0;
3633
3634 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3635 return 0;
3636
3637 if (old->mnt_file_mode != new->mnt_file_mode ||
3638 old->mnt_dir_mode != new->mnt_dir_mode)
3639 return 0;
3640
3641 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3642 return 0;
3643
3644 if (old->actimeo != new->actimeo)
3645 return 0;
3646
3647 return 1;
3648 }
3649
3650 static int
match_prepath(struct super_block * sb,struct cifs_mnt_data * mnt_data)3651 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3652 {
3653 struct cifs_sb_info *old = CIFS_SB(sb);
3654 struct cifs_sb_info *new = mnt_data->cifs_sb;
3655 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3656 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3657
3658 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3659 return 1;
3660 else if (!old_set && !new_set)
3661 return 1;
3662
3663 return 0;
3664 }
3665
3666 int
cifs_match_super(struct super_block * sb,void * data)3667 cifs_match_super(struct super_block *sb, void *data)
3668 {
3669 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3670 struct smb_vol *volume_info;
3671 struct cifs_sb_info *cifs_sb;
3672 struct TCP_Server_Info *tcp_srv;
3673 struct cifs_ses *ses;
3674 struct cifs_tcon *tcon;
3675 struct tcon_link *tlink;
3676 int rc = 0;
3677
3678 spin_lock(&cifs_tcp_ses_lock);
3679 cifs_sb = CIFS_SB(sb);
3680 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3681 if (IS_ERR(tlink)) {
3682 spin_unlock(&cifs_tcp_ses_lock);
3683 return rc;
3684 }
3685 tcon = tlink_tcon(tlink);
3686 ses = tcon->ses;
3687 tcp_srv = ses->server;
3688
3689 volume_info = mnt_data->vol;
3690
3691 if (!match_server(tcp_srv, volume_info) ||
3692 !match_session(ses, volume_info) ||
3693 !match_tcon(tcon, volume_info) ||
3694 !match_prepath(sb, mnt_data)) {
3695 rc = 0;
3696 goto out;
3697 }
3698
3699 rc = compare_mount_options(sb, mnt_data);
3700 out:
3701 spin_unlock(&cifs_tcp_ses_lock);
3702 cifs_put_tlink(tlink);
3703 return rc;
3704 }
3705
3706 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3707 static struct lock_class_key cifs_key[2];
3708 static struct lock_class_key cifs_slock_key[2];
3709
3710 static inline void
cifs_reclassify_socket4(struct socket * sock)3711 cifs_reclassify_socket4(struct socket *sock)
3712 {
3713 struct sock *sk = sock->sk;
3714 BUG_ON(!sock_allow_reclassification(sk));
3715 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3716 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3717 }
3718
3719 static inline void
cifs_reclassify_socket6(struct socket * sock)3720 cifs_reclassify_socket6(struct socket *sock)
3721 {
3722 struct sock *sk = sock->sk;
3723 BUG_ON(!sock_allow_reclassification(sk));
3724 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3725 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3726 }
3727 #else
3728 static inline void
cifs_reclassify_socket4(struct socket * sock)3729 cifs_reclassify_socket4(struct socket *sock)
3730 {
3731 }
3732
3733 static inline void
cifs_reclassify_socket6(struct socket * sock)3734 cifs_reclassify_socket6(struct socket *sock)
3735 {
3736 }
3737 #endif
3738
3739 /* See RFC1001 section 14 on representation of Netbios names */
rfc1002mangle(char * target,char * source,unsigned int length)3740 static void rfc1002mangle(char *target, char *source, unsigned int length)
3741 {
3742 unsigned int i, j;
3743
3744 for (i = 0, j = 0; i < (length); i++) {
3745 /* mask a nibble at a time and encode */
3746 target[j] = 'A' + (0x0F & (source[i] >> 4));
3747 target[j+1] = 'A' + (0x0F & source[i]);
3748 j += 2;
3749 }
3750
3751 }
3752
3753 static int
bind_socket(struct TCP_Server_Info * server)3754 bind_socket(struct TCP_Server_Info *server)
3755 {
3756 int rc = 0;
3757 if (server->srcaddr.ss_family != AF_UNSPEC) {
3758 /* Bind to the specified local IP address */
3759 struct socket *socket = server->ssocket;
3760 rc = socket->ops->bind(socket,
3761 (struct sockaddr *) &server->srcaddr,
3762 sizeof(server->srcaddr));
3763 if (rc < 0) {
3764 struct sockaddr_in *saddr4;
3765 struct sockaddr_in6 *saddr6;
3766 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3767 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3768 if (saddr6->sin6_family == AF_INET6)
3769 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3770 &saddr6->sin6_addr, rc);
3771 else
3772 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3773 &saddr4->sin_addr.s_addr, rc);
3774 }
3775 }
3776 return rc;
3777 }
3778
3779 static int
ip_rfc1001_connect(struct TCP_Server_Info * server)3780 ip_rfc1001_connect(struct TCP_Server_Info *server)
3781 {
3782 int rc = 0;
3783 /*
3784 * some servers require RFC1001 sessinit before sending
3785 * negprot - BB check reconnection in case where second
3786 * sessinit is sent but no second negprot
3787 */
3788 struct rfc1002_session_packet *ses_init_buf;
3789 struct smb_hdr *smb_buf;
3790 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3791 GFP_KERNEL);
3792 if (ses_init_buf) {
3793 ses_init_buf->trailer.session_req.called_len = 32;
3794
3795 if (server->server_RFC1001_name[0] != 0)
3796 rfc1002mangle(ses_init_buf->trailer.
3797 session_req.called_name,
3798 server->server_RFC1001_name,
3799 RFC1001_NAME_LEN_WITH_NULL);
3800 else
3801 rfc1002mangle(ses_init_buf->trailer.
3802 session_req.called_name,
3803 DEFAULT_CIFS_CALLED_NAME,
3804 RFC1001_NAME_LEN_WITH_NULL);
3805
3806 ses_init_buf->trailer.session_req.calling_len = 32;
3807
3808 /*
3809 * calling name ends in null (byte 16) from old smb
3810 * convention.
3811 */
3812 if (server->workstation_RFC1001_name[0] != 0)
3813 rfc1002mangle(ses_init_buf->trailer.
3814 session_req.calling_name,
3815 server->workstation_RFC1001_name,
3816 RFC1001_NAME_LEN_WITH_NULL);
3817 else
3818 rfc1002mangle(ses_init_buf->trailer.
3819 session_req.calling_name,
3820 "LINUX_CIFS_CLNT",
3821 RFC1001_NAME_LEN_WITH_NULL);
3822
3823 ses_init_buf->trailer.session_req.scope1 = 0;
3824 ses_init_buf->trailer.session_req.scope2 = 0;
3825 smb_buf = (struct smb_hdr *)ses_init_buf;
3826
3827 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3828 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3829 rc = smb_send(server, smb_buf, 0x44);
3830 kfree(ses_init_buf);
3831 /*
3832 * RFC1001 layer in at least one server
3833 * requires very short break before negprot
3834 * presumably because not expecting negprot
3835 * to follow so fast. This is a simple
3836 * solution that works without
3837 * complicating the code and causes no
3838 * significant slowing down on mount
3839 * for everyone else
3840 */
3841 usleep_range(1000, 2000);
3842 }
3843 /*
3844 * else the negprot may still work without this
3845 * even though malloc failed
3846 */
3847
3848 return rc;
3849 }
3850
3851 static int
generic_ip_connect(struct TCP_Server_Info * server)3852 generic_ip_connect(struct TCP_Server_Info *server)
3853 {
3854 int rc = 0;
3855 __be16 sport;
3856 int slen, sfamily;
3857 struct socket *socket = server->ssocket;
3858 struct sockaddr *saddr;
3859
3860 saddr = (struct sockaddr *) &server->dstaddr;
3861
3862 if (server->dstaddr.ss_family == AF_INET6) {
3863 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3864 slen = sizeof(struct sockaddr_in6);
3865 sfamily = AF_INET6;
3866 } else {
3867 sport = ((struct sockaddr_in *) saddr)->sin_port;
3868 slen = sizeof(struct sockaddr_in);
3869 sfamily = AF_INET;
3870 }
3871
3872 if (socket == NULL) {
3873 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3874 IPPROTO_TCP, &socket, 1);
3875 if (rc < 0) {
3876 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3877 server->ssocket = NULL;
3878 return rc;
3879 }
3880
3881 /* BB other socket options to set KEEPALIVE, NODELAY? */
3882 cifs_dbg(FYI, "Socket created\n");
3883 server->ssocket = socket;
3884 socket->sk->sk_allocation = GFP_NOFS;
3885 if (sfamily == AF_INET6)
3886 cifs_reclassify_socket6(socket);
3887 else
3888 cifs_reclassify_socket4(socket);
3889 }
3890
3891 rc = bind_socket(server);
3892 if (rc < 0)
3893 return rc;
3894
3895 /*
3896 * Eventually check for other socket options to change from
3897 * the default. sock_setsockopt not used because it expects
3898 * user space buffer
3899 */
3900 socket->sk->sk_rcvtimeo = 7 * HZ;
3901 socket->sk->sk_sndtimeo = 5 * HZ;
3902
3903 /* make the bufsizes depend on wsize/rsize and max requests */
3904 if (server->noautotune) {
3905 if (socket->sk->sk_sndbuf < (200 * 1024))
3906 socket->sk->sk_sndbuf = 200 * 1024;
3907 if (socket->sk->sk_rcvbuf < (140 * 1024))
3908 socket->sk->sk_rcvbuf = 140 * 1024;
3909 }
3910
3911 if (server->tcp_nodelay) {
3912 int val = 1;
3913 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3914 (char *)&val, sizeof(val));
3915 if (rc)
3916 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3917 rc);
3918 }
3919
3920 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3921 socket->sk->sk_sndbuf,
3922 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3923
3924 rc = socket->ops->connect(socket, saddr, slen,
3925 server->noblockcnt ? O_NONBLOCK : 0);
3926 /*
3927 * When mounting SMB root file systems, we do not want to block in
3928 * connect. Otherwise bail out and then let cifs_reconnect() perform
3929 * reconnect failover - if possible.
3930 */
3931 if (server->noblockcnt && rc == -EINPROGRESS)
3932 rc = 0;
3933 if (rc < 0) {
3934 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3935 sock_release(socket);
3936 server->ssocket = NULL;
3937 return rc;
3938 }
3939
3940 if (sport == htons(RFC1001_PORT))
3941 rc = ip_rfc1001_connect(server);
3942
3943 return rc;
3944 }
3945
3946 static int
ip_connect(struct TCP_Server_Info * server)3947 ip_connect(struct TCP_Server_Info *server)
3948 {
3949 __be16 *sport;
3950 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3951 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3952
3953 if (server->dstaddr.ss_family == AF_INET6)
3954 sport = &addr6->sin6_port;
3955 else
3956 sport = &addr->sin_port;
3957
3958 if (*sport == 0) {
3959 int rc;
3960
3961 /* try with 445 port at first */
3962 *sport = htons(CIFS_PORT);
3963
3964 rc = generic_ip_connect(server);
3965 if (rc >= 0)
3966 return rc;
3967
3968 /* if it failed, try with 139 port */
3969 *sport = htons(RFC1001_PORT);
3970 }
3971
3972 return generic_ip_connect(server);
3973 }
3974
reset_cifs_unix_caps(unsigned int xid,struct cifs_tcon * tcon,struct cifs_sb_info * cifs_sb,struct smb_vol * vol_info)3975 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3976 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3977 {
3978 /* if we are reconnecting then should we check to see if
3979 * any requested capabilities changed locally e.g. via
3980 * remount but we can not do much about it here
3981 * if they have (even if we could detect it by the following)
3982 * Perhaps we could add a backpointer to array of sb from tcon
3983 * or if we change to make all sb to same share the same
3984 * sb as NFS - then we only have one backpointer to sb.
3985 * What if we wanted to mount the server share twice once with
3986 * and once without posixacls or posix paths? */
3987 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3988
3989 if (vol_info && vol_info->no_linux_ext) {
3990 tcon->fsUnixInfo.Capability = 0;
3991 tcon->unix_ext = 0; /* Unix Extensions disabled */
3992 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3993 return;
3994 } else if (vol_info)
3995 tcon->unix_ext = 1; /* Unix Extensions supported */
3996
3997 if (tcon->unix_ext == 0) {
3998 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3999 return;
4000 }
4001
4002 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
4003 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4004 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
4005 /* check for reconnect case in which we do not
4006 want to change the mount behavior if we can avoid it */
4007 if (vol_info == NULL) {
4008 /* turn off POSIX ACL and PATHNAMES if not set
4009 originally at mount time */
4010 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
4011 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4012 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4013 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4014 cifs_dbg(VFS, "POSIXPATH support change\n");
4015 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4016 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4017 cifs_dbg(VFS, "possible reconnect error\n");
4018 cifs_dbg(VFS, "server disabled POSIX path support\n");
4019 }
4020 }
4021
4022 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4023 cifs_dbg(VFS, "per-share encryption not supported yet\n");
4024
4025 cap &= CIFS_UNIX_CAP_MASK;
4026 if (vol_info && vol_info->no_psx_acl)
4027 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4028 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
4029 cifs_dbg(FYI, "negotiated posix acl support\n");
4030 if (cifs_sb)
4031 cifs_sb->mnt_cifs_flags |=
4032 CIFS_MOUNT_POSIXACL;
4033 }
4034
4035 if (vol_info && vol_info->posix_paths == 0)
4036 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4037 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
4038 cifs_dbg(FYI, "negotiate posix pathnames\n");
4039 if (cifs_sb)
4040 cifs_sb->mnt_cifs_flags |=
4041 CIFS_MOUNT_POSIX_PATHS;
4042 }
4043
4044 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4045 #ifdef CONFIG_CIFS_DEBUG2
4046 if (cap & CIFS_UNIX_FCNTL_CAP)
4047 cifs_dbg(FYI, "FCNTL cap\n");
4048 if (cap & CIFS_UNIX_EXTATTR_CAP)
4049 cifs_dbg(FYI, "EXTATTR cap\n");
4050 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4051 cifs_dbg(FYI, "POSIX path cap\n");
4052 if (cap & CIFS_UNIX_XATTR_CAP)
4053 cifs_dbg(FYI, "XATTR cap\n");
4054 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4055 cifs_dbg(FYI, "POSIX ACL cap\n");
4056 if (cap & CIFS_UNIX_LARGE_READ_CAP)
4057 cifs_dbg(FYI, "very large read cap\n");
4058 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4059 cifs_dbg(FYI, "very large write cap\n");
4060 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4061 cifs_dbg(FYI, "transport encryption cap\n");
4062 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4063 cifs_dbg(FYI, "mandatory transport encryption cap\n");
4064 #endif /* CIFS_DEBUG2 */
4065 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4066 if (vol_info == NULL) {
4067 cifs_dbg(FYI, "resetting capabilities failed\n");
4068 } else
4069 cifs_dbg(VFS, "Negotiating Unix capabilities with the server failed. Consider mounting with the Unix Extensions disabled if problems are found by specifying the nounix mount option.\n");
4070
4071 }
4072 }
4073 }
4074
cifs_setup_cifs_sb(struct smb_vol * pvolume_info,struct cifs_sb_info * cifs_sb)4075 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4076 struct cifs_sb_info *cifs_sb)
4077 {
4078 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4079
4080 spin_lock_init(&cifs_sb->tlink_tree_lock);
4081 cifs_sb->tlink_tree = RB_ROOT;
4082
4083 cifs_sb->bsize = pvolume_info->bsize;
4084 /*
4085 * Temporarily set r/wsize for matching superblock. If we end up using
4086 * new sb then client will later negotiate it downward if needed.
4087 */
4088 cifs_sb->rsize = pvolume_info->rsize;
4089 cifs_sb->wsize = pvolume_info->wsize;
4090
4091 cifs_sb->mnt_uid = pvolume_info->linux_uid;
4092 cifs_sb->mnt_gid = pvolume_info->linux_gid;
4093 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
4094 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
4095 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
4096 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
4097
4098 cifs_sb->actimeo = pvolume_info->actimeo;
4099 cifs_sb->local_nls = pvolume_info->local_nls;
4100
4101 if (pvolume_info->nodfs)
4102 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
4103 if (pvolume_info->noperm)
4104 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
4105 if (pvolume_info->setuids)
4106 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
4107 if (pvolume_info->setuidfromacl)
4108 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4109 if (pvolume_info->server_ino)
4110 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4111 if (pvolume_info->remap)
4112 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4113 if (pvolume_info->sfu_remap)
4114 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
4115 if (pvolume_info->no_xattr)
4116 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
4117 if (pvolume_info->sfu_emul)
4118 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
4119 if (pvolume_info->nobrl)
4120 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
4121 if (pvolume_info->nohandlecache)
4122 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4123 if (pvolume_info->nostrictsync)
4124 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4125 if (pvolume_info->mand_lock)
4126 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4127 if (pvolume_info->rwpidforward)
4128 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4129 if (pvolume_info->mode_ace)
4130 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4131 if (pvolume_info->cifs_acl)
4132 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4133 if (pvolume_info->backupuid_specified) {
4134 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4135 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4136 }
4137 if (pvolume_info->backupgid_specified) {
4138 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4139 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4140 }
4141 if (pvolume_info->override_uid)
4142 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
4143 if (pvolume_info->override_gid)
4144 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
4145 if (pvolume_info->dynperm)
4146 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
4147 if (pvolume_info->fsc)
4148 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4149 if (pvolume_info->multiuser)
4150 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4151 CIFS_MOUNT_NO_PERM);
4152 if (pvolume_info->strict_io)
4153 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4154 if (pvolume_info->direct_io) {
4155 cifs_dbg(FYI, "mounting share using direct i/o\n");
4156 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4157 }
4158 if (pvolume_info->cache_ro) {
4159 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4160 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4161 } else if (pvolume_info->cache_rw) {
4162 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4163 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4164 CIFS_MOUNT_RW_CACHE);
4165 }
4166 if (pvolume_info->mfsymlinks) {
4167 if (pvolume_info->sfu_emul) {
4168 /*
4169 * Our SFU ("Services for Unix" emulation does not allow
4170 * creating symlinks but does allow reading existing SFU
4171 * symlinks (it does allow both creating and reading SFU
4172 * style mknod and FIFOs though). When "mfsymlinks" and
4173 * "sfu" are both enabled at the same time, it allows
4174 * reading both types of symlinks, but will only create
4175 * them with mfsymlinks format. This allows better
4176 * Apple compatibility (probably better for Samba too)
4177 * while still recognizing old Windows style symlinks.
4178 */
4179 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4180 }
4181 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4182 }
4183
4184 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4185 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4186
4187 if (pvolume_info->prepath) {
4188 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4189 if (cifs_sb->prepath == NULL)
4190 return -ENOMEM;
4191 }
4192
4193 return 0;
4194 }
4195
4196 void
cifs_cleanup_volume_info_contents(struct smb_vol * volume_info)4197 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4198 {
4199 kfree(volume_info->username);
4200 kzfree(volume_info->password);
4201 kfree(volume_info->UNC);
4202 kfree(volume_info->domainname);
4203 kfree(volume_info->iocharset);
4204 kfree(volume_info->prepath);
4205 }
4206
4207 void
cifs_cleanup_volume_info(struct smb_vol * volume_info)4208 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4209 {
4210 if (!volume_info)
4211 return;
4212 cifs_cleanup_volume_info_contents(volume_info);
4213 kfree(volume_info);
4214 }
4215
4216 /* Release all succeed connections */
mount_put_conns(struct cifs_sb_info * cifs_sb,unsigned int xid,struct TCP_Server_Info * server,struct cifs_ses * ses,struct cifs_tcon * tcon)4217 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4218 unsigned int xid,
4219 struct TCP_Server_Info *server,
4220 struct cifs_ses *ses, struct cifs_tcon *tcon)
4221 {
4222 int rc = 0;
4223
4224 if (tcon)
4225 cifs_put_tcon(tcon);
4226 else if (ses)
4227 cifs_put_smb_ses(ses);
4228 else if (server)
4229 cifs_put_tcp_session(server, 0);
4230 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4231 free_xid(xid);
4232 }
4233
4234 /* Get connections for tcp, ses and tcon */
mount_get_conns(struct smb_vol * vol,struct cifs_sb_info * cifs_sb,unsigned int * xid,struct TCP_Server_Info ** nserver,struct cifs_ses ** nses,struct cifs_tcon ** ntcon)4235 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4236 unsigned int *xid,
4237 struct TCP_Server_Info **nserver,
4238 struct cifs_ses **nses, struct cifs_tcon **ntcon)
4239 {
4240 int rc = 0;
4241 struct TCP_Server_Info *server;
4242 struct cifs_ses *ses;
4243 struct cifs_tcon *tcon;
4244
4245 *nserver = NULL;
4246 *nses = NULL;
4247 *ntcon = NULL;
4248
4249 *xid = get_xid();
4250
4251 /* get a reference to a tcp session */
4252 server = cifs_get_tcp_session(vol);
4253 if (IS_ERR(server)) {
4254 rc = PTR_ERR(server);
4255 return rc;
4256 }
4257
4258 *nserver = server;
4259
4260 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4261 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4262 else
4263 server->max_credits = vol->max_credits;
4264
4265 /* get a reference to a SMB session */
4266 ses = cifs_get_smb_ses(server, vol);
4267 if (IS_ERR(ses)) {
4268 rc = PTR_ERR(ses);
4269 return rc;
4270 }
4271
4272 *nses = ses;
4273
4274 if ((vol->persistent == true) && (!(ses->server->capabilities &
4275 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4276 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4277 return -EOPNOTSUPP;
4278 }
4279
4280 /* search for existing tcon to this server share */
4281 tcon = cifs_get_tcon(ses, vol);
4282 if (IS_ERR(tcon)) {
4283 rc = PTR_ERR(tcon);
4284 return rc;
4285 }
4286
4287 *ntcon = tcon;
4288
4289 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4290 if (tcon->posix_extensions)
4291 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4292
4293 /* tell server which Unix caps we support */
4294 if (cap_unix(tcon->ses)) {
4295 /*
4296 * reset of caps checks mount to see if unix extensions disabled
4297 * for just this mount.
4298 */
4299 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4300 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4301 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4302 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4303 return -EACCES;
4304 } else
4305 tcon->unix_ext = 0; /* server does not support them */
4306
4307 /* do not care if a following call succeed - informational */
4308 if (!tcon->pipe && server->ops->qfs_tcon) {
4309 server->ops->qfs_tcon(*xid, tcon);
4310 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4311 if (tcon->fsDevInfo.DeviceCharacteristics &
4312 cpu_to_le32(FILE_READ_ONLY_DEVICE))
4313 cifs_dbg(VFS, "mounted to read only share\n");
4314 else if ((cifs_sb->mnt_cifs_flags &
4315 CIFS_MOUNT_RW_CACHE) == 0)
4316 cifs_dbg(VFS, "read only mount of RW share\n");
4317 /* no need to log a RW mount of a typical RW share */
4318 }
4319 }
4320
4321 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4322 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4323
4324 return 0;
4325 }
4326
mount_setup_tlink(struct cifs_sb_info * cifs_sb,struct cifs_ses * ses,struct cifs_tcon * tcon)4327 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4328 struct cifs_tcon *tcon)
4329 {
4330 struct tcon_link *tlink;
4331
4332 /* hang the tcon off of the superblock */
4333 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4334 if (tlink == NULL)
4335 return -ENOMEM;
4336
4337 tlink->tl_uid = ses->linux_uid;
4338 tlink->tl_tcon = tcon;
4339 tlink->tl_time = jiffies;
4340 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4341 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4342
4343 cifs_sb->master_tlink = tlink;
4344 spin_lock(&cifs_sb->tlink_tree_lock);
4345 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4346 spin_unlock(&cifs_sb->tlink_tree_lock);
4347
4348 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4349 TLINK_IDLE_EXPIRE);
4350 return 0;
4351 }
4352
4353 #ifdef CONFIG_CIFS_DFS_UPCALL
4354 /*
4355 * cifs_build_path_to_root returns full path to root when we do not have an
4356 * exiting connection (tcon)
4357 */
4358 static char *
build_unc_path_to_root(const struct smb_vol * vol,const struct cifs_sb_info * cifs_sb,bool useppath)4359 build_unc_path_to_root(const struct smb_vol *vol,
4360 const struct cifs_sb_info *cifs_sb, bool useppath)
4361 {
4362 char *full_path, *pos;
4363 unsigned int pplen = useppath && vol->prepath ?
4364 strlen(vol->prepath) + 1 : 0;
4365 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4366
4367 if (unc_len > MAX_TREE_SIZE)
4368 return ERR_PTR(-EINVAL);
4369
4370 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4371 if (full_path == NULL)
4372 return ERR_PTR(-ENOMEM);
4373
4374 memcpy(full_path, vol->UNC, unc_len);
4375 pos = full_path + unc_len;
4376
4377 if (pplen) {
4378 *pos = CIFS_DIR_SEP(cifs_sb);
4379 memcpy(pos + 1, vol->prepath, pplen);
4380 pos += pplen;
4381 }
4382
4383 *pos = '\0'; /* add trailing null */
4384 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4385 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4386 return full_path;
4387 }
4388
4389 /**
4390 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4391 *
4392 *
4393 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4394 * to a string containing updated options for the submount. Otherwise it
4395 * will be left untouched.
4396 *
4397 * Returns the rc from get_dfs_path to the caller, which can be used to
4398 * determine whether there were referrals.
4399 */
4400 static int
expand_dfs_referral(const unsigned int xid,struct cifs_ses * ses,struct smb_vol * volume_info,struct cifs_sb_info * cifs_sb,int check_prefix)4401 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4402 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4403 int check_prefix)
4404 {
4405 int rc;
4406 struct dfs_info3_param referral = {0};
4407 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4408
4409 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4410 return -EREMOTE;
4411
4412 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4413 if (IS_ERR(full_path))
4414 return PTR_ERR(full_path);
4415
4416 /* For DFS paths, skip the first '\' of the UNC */
4417 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4418
4419 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4420 ref_path, &referral, NULL);
4421 if (!rc) {
4422 char *fake_devname = NULL;
4423
4424 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4425 full_path + 1, &referral,
4426 &fake_devname);
4427 free_dfs_info_param(&referral);
4428
4429 if (IS_ERR(mdata)) {
4430 rc = PTR_ERR(mdata);
4431 mdata = NULL;
4432 } else {
4433 cifs_cleanup_volume_info_contents(volume_info);
4434 rc = cifs_setup_volume_info(volume_info, mdata,
4435 fake_devname, false);
4436 }
4437 kfree(fake_devname);
4438 kfree(cifs_sb->mountdata);
4439 cifs_sb->mountdata = mdata;
4440 }
4441 kfree(full_path);
4442 return rc;
4443 }
4444
get_next_dfs_tgt(const char * path,struct dfs_cache_tgt_list * tgt_list,struct dfs_cache_tgt_iterator ** tgt_it)4445 static inline int get_next_dfs_tgt(const char *path,
4446 struct dfs_cache_tgt_list *tgt_list,
4447 struct dfs_cache_tgt_iterator **tgt_it)
4448 {
4449 if (!*tgt_it)
4450 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4451 else
4452 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4453 return !*tgt_it ? -EHOSTDOWN : 0;
4454 }
4455
update_vol_info(const struct dfs_cache_tgt_iterator * tgt_it,struct smb_vol * fake_vol,struct smb_vol * vol)4456 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4457 struct smb_vol *fake_vol, struct smb_vol *vol)
4458 {
4459 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4460 int len = strlen(tgt) + 2;
4461 char *new_unc;
4462
4463 new_unc = kmalloc(len, GFP_KERNEL);
4464 if (!new_unc)
4465 return -ENOMEM;
4466 scnprintf(new_unc, len, "\\%s", tgt);
4467
4468 kfree(vol->UNC);
4469 vol->UNC = new_unc;
4470
4471 if (fake_vol->prepath) {
4472 kfree(vol->prepath);
4473 vol->prepath = fake_vol->prepath;
4474 fake_vol->prepath = NULL;
4475 }
4476 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4477
4478 return 0;
4479 }
4480
setup_dfs_tgt_conn(const char * path,const struct dfs_cache_tgt_iterator * tgt_it,struct cifs_sb_info * cifs_sb,struct smb_vol * vol,unsigned int * xid,struct TCP_Server_Info ** server,struct cifs_ses ** ses,struct cifs_tcon ** tcon)4481 static int setup_dfs_tgt_conn(const char *path,
4482 const struct dfs_cache_tgt_iterator *tgt_it,
4483 struct cifs_sb_info *cifs_sb,
4484 struct smb_vol *vol,
4485 unsigned int *xid,
4486 struct TCP_Server_Info **server,
4487 struct cifs_ses **ses,
4488 struct cifs_tcon **tcon)
4489 {
4490 int rc;
4491 struct dfs_info3_param ref = {0};
4492 char *mdata = NULL, *fake_devname = NULL;
4493 struct smb_vol fake_vol = {NULL};
4494
4495 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4496
4497 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4498 if (rc)
4499 return rc;
4500
4501 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4502 &fake_devname);
4503 free_dfs_info_param(&ref);
4504
4505 if (IS_ERR(mdata)) {
4506 rc = PTR_ERR(mdata);
4507 mdata = NULL;
4508 } else {
4509 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4510 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4511 false);
4512 }
4513 kfree(mdata);
4514 kfree(fake_devname);
4515
4516 if (!rc) {
4517 /*
4518 * We use a 'fake_vol' here because we need pass it down to the
4519 * mount_{get,put} functions to test connection against new DFS
4520 * targets.
4521 */
4522 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4523 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4524 tcon);
4525 if (!rc) {
4526 /*
4527 * We were able to connect to new target server.
4528 * Update current volume info with new target server.
4529 */
4530 rc = update_vol_info(tgt_it, &fake_vol, vol);
4531 }
4532 }
4533 cifs_cleanup_volume_info_contents(&fake_vol);
4534 return rc;
4535 }
4536
mount_do_dfs_failover(const char * path,struct cifs_sb_info * cifs_sb,struct smb_vol * vol,struct cifs_ses * root_ses,unsigned int * xid,struct TCP_Server_Info ** server,struct cifs_ses ** ses,struct cifs_tcon ** tcon)4537 static int mount_do_dfs_failover(const char *path,
4538 struct cifs_sb_info *cifs_sb,
4539 struct smb_vol *vol,
4540 struct cifs_ses *root_ses,
4541 unsigned int *xid,
4542 struct TCP_Server_Info **server,
4543 struct cifs_ses **ses,
4544 struct cifs_tcon **tcon)
4545 {
4546 int rc;
4547 struct dfs_cache_tgt_list tgt_list;
4548 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4549
4550 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4551 return -EOPNOTSUPP;
4552
4553 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4554 if (rc)
4555 return rc;
4556
4557 for (;;) {
4558 /* Get next DFS target server - if any */
4559 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4560 if (rc)
4561 break;
4562 /* Connect to next DFS target */
4563 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4564 ses, tcon);
4565 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4566 break;
4567 }
4568 if (!rc) {
4569 /*
4570 * Update DFS target hint in DFS referral cache with the target
4571 * server we successfully reconnected to.
4572 */
4573 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4574 cifs_sb->local_nls,
4575 cifs_remap(cifs_sb), path,
4576 tgt_it);
4577 }
4578 dfs_cache_free_tgts(&tgt_list);
4579 return rc;
4580 }
4581 #endif
4582
4583 int
cifs_setup_volume_info(struct smb_vol * volume_info,char * mount_data,const char * devname,bool is_smb3)4584 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4585 const char *devname, bool is_smb3)
4586 {
4587 int rc = 0;
4588
4589 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4590 return -EINVAL;
4591
4592 if (volume_info->nullauth) {
4593 cifs_dbg(FYI, "Anonymous login\n");
4594 kfree(volume_info->username);
4595 volume_info->username = NULL;
4596 } else if (volume_info->username) {
4597 /* BB fixme parse for domain name here */
4598 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4599 } else {
4600 cifs_dbg(VFS, "No username specified\n");
4601 /* In userspace mount helper we can get user name from alternate
4602 locations such as env variables and files on disk */
4603 return -EINVAL;
4604 }
4605
4606 /* this is needed for ASCII cp to Unicode converts */
4607 if (volume_info->iocharset == NULL) {
4608 /* load_nls_default cannot return null */
4609 volume_info->local_nls = load_nls_default();
4610 } else {
4611 volume_info->local_nls = load_nls(volume_info->iocharset);
4612 if (volume_info->local_nls == NULL) {
4613 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4614 volume_info->iocharset);
4615 return -ELIBACC;
4616 }
4617 }
4618
4619 return rc;
4620 }
4621
4622 struct smb_vol *
cifs_get_volume_info(char * mount_data,const char * devname,bool is_smb3)4623 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4624 {
4625 int rc;
4626 struct smb_vol *volume_info;
4627
4628 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4629 if (!volume_info)
4630 return ERR_PTR(-ENOMEM);
4631
4632 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4633 if (rc) {
4634 cifs_cleanup_volume_info(volume_info);
4635 volume_info = ERR_PTR(rc);
4636 }
4637
4638 return volume_info;
4639 }
4640
4641 static int
cifs_are_all_path_components_accessible(struct TCP_Server_Info * server,unsigned int xid,struct cifs_tcon * tcon,struct cifs_sb_info * cifs_sb,char * full_path,int added_treename)4642 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4643 unsigned int xid,
4644 struct cifs_tcon *tcon,
4645 struct cifs_sb_info *cifs_sb,
4646 char *full_path,
4647 int added_treename)
4648 {
4649 int rc;
4650 char *s;
4651 char sep, tmp;
4652 int skip = added_treename ? 1 : 0;
4653
4654 sep = CIFS_DIR_SEP(cifs_sb);
4655 s = full_path;
4656
4657 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4658 while (rc == 0) {
4659 /* skip separators */
4660 while (*s == sep)
4661 s++;
4662 if (!*s)
4663 break;
4664 /* next separator */
4665 while (*s && *s != sep)
4666 s++;
4667 /*
4668 * if the treename is added, we then have to skip the first
4669 * part within the separators
4670 */
4671 if (skip) {
4672 skip = 0;
4673 continue;
4674 }
4675 /*
4676 * temporarily null-terminate the path at the end of
4677 * the current component
4678 */
4679 tmp = *s;
4680 *s = 0;
4681 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4682 full_path);
4683 *s = tmp;
4684 }
4685 return rc;
4686 }
4687
4688 /*
4689 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4690 * otherwise 0.
4691 */
is_path_remote(struct cifs_sb_info * cifs_sb,struct smb_vol * vol,const unsigned int xid,struct TCP_Server_Info * server,struct cifs_tcon * tcon)4692 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4693 const unsigned int xid,
4694 struct TCP_Server_Info *server,
4695 struct cifs_tcon *tcon)
4696 {
4697 int rc;
4698 char *full_path;
4699
4700 if (!server->ops->is_path_accessible)
4701 return -EOPNOTSUPP;
4702
4703 /*
4704 * cifs_build_path_to_root works only when we have a valid tcon
4705 */
4706 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4707 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4708 if (full_path == NULL)
4709 return -ENOMEM;
4710
4711 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4712
4713 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4714 full_path);
4715 if (rc != 0 && rc != -EREMOTE) {
4716 kfree(full_path);
4717 return rc;
4718 }
4719
4720 if (rc != -EREMOTE) {
4721 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4722 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4723 if (rc != 0) {
4724 cifs_server_dbg(VFS, "cannot query dirs between root and final path, "
4725 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4726 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4727 rc = 0;
4728 }
4729 }
4730
4731 kfree(full_path);
4732 return rc;
4733 }
4734
4735 #ifdef CONFIG_CIFS_DFS_UPCALL
set_root_tcon(struct cifs_sb_info * cifs_sb,struct cifs_tcon * tcon,struct cifs_tcon ** root)4736 static inline void set_root_tcon(struct cifs_sb_info *cifs_sb,
4737 struct cifs_tcon *tcon,
4738 struct cifs_tcon **root)
4739 {
4740 spin_lock(&cifs_tcp_ses_lock);
4741 tcon->tc_count++;
4742 tcon->remap = cifs_remap(cifs_sb);
4743 spin_unlock(&cifs_tcp_ses_lock);
4744 *root = tcon;
4745 }
4746
cifs_mount(struct cifs_sb_info * cifs_sb,struct smb_vol * vol)4747 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4748 {
4749 int rc = 0;
4750 unsigned int xid;
4751 struct cifs_ses *ses;
4752 struct cifs_tcon *root_tcon = NULL;
4753 struct cifs_tcon *tcon = NULL;
4754 struct TCP_Server_Info *server;
4755 char *root_path = NULL, *full_path = NULL;
4756 char *old_mountdata, *origin_mountdata = NULL;
4757 int count;
4758
4759 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4760 if (!rc && tcon) {
4761 /* If not a standalone DFS root, then check if path is remote */
4762 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4763 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4764 NULL);
4765 if (rc) {
4766 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4767 if (!rc)
4768 goto out;
4769 if (rc != -EREMOTE)
4770 goto error;
4771 }
4772 }
4773 /*
4774 * If first DFS target server went offline and we failed to connect it,
4775 * server and ses pointers are NULL at this point, though we still have
4776 * chance to get a cached DFS referral in expand_dfs_referral() and
4777 * retry next target available in it.
4778 *
4779 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4780 * performed against DFS path and *no* requests will be sent to server
4781 * for any new DFS referrals. Hence it's safe to skip checking whether
4782 * server or ses ptr is NULL.
4783 */
4784 if (rc == -EACCES || rc == -EOPNOTSUPP)
4785 goto error;
4786
4787 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4788 if (IS_ERR(root_path)) {
4789 rc = PTR_ERR(root_path);
4790 root_path = NULL;
4791 goto error;
4792 }
4793
4794 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4795 if (IS_ERR(full_path)) {
4796 rc = PTR_ERR(full_path);
4797 full_path = NULL;
4798 goto error;
4799 }
4800 /*
4801 * Perform an unconditional check for whether there are DFS
4802 * referrals for this path without prefix, to provide support
4803 * for DFS referrals from w2k8 servers which don't seem to respond
4804 * with PATH_NOT_COVERED to requests that include the prefix.
4805 * Chase the referral if found, otherwise continue normally.
4806 */
4807 old_mountdata = cifs_sb->mountdata;
4808 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4809
4810 if (cifs_sb->mountdata == NULL) {
4811 rc = -ENOENT;
4812 goto error;
4813 }
4814
4815 /* Save DFS root volume information for DFS refresh worker */
4816 origin_mountdata = kstrndup(cifs_sb->mountdata,
4817 strlen(cifs_sb->mountdata), GFP_KERNEL);
4818 if (!origin_mountdata) {
4819 rc = -ENOMEM;
4820 goto error;
4821 }
4822
4823 if (cifs_sb->mountdata != old_mountdata) {
4824 /* If we were redirected, reconnect to new target server */
4825 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4826 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4827 }
4828 if (rc) {
4829 if (rc == -EACCES || rc == -EOPNOTSUPP)
4830 goto error;
4831 /* Perform DFS failover to any other DFS targets */
4832 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4833 &xid, &server, &ses, &tcon);
4834 if (rc)
4835 goto error;
4836 }
4837
4838 kfree(root_path);
4839 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4840 if (IS_ERR(root_path)) {
4841 rc = PTR_ERR(root_path);
4842 root_path = NULL;
4843 goto error;
4844 }
4845 /* Cache out resolved root server */
4846 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4847 root_path + 1, NULL, NULL);
4848 kfree(root_path);
4849 root_path = NULL;
4850
4851 set_root_tcon(cifs_sb, tcon, &root_tcon);
4852
4853 for (count = 1; ;) {
4854 if (!rc && tcon) {
4855 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4856 if (!rc || rc != -EREMOTE)
4857 break;
4858 }
4859 /*
4860 * BB: when we implement proper loop detection,
4861 * we will remove this check. But now we need it
4862 * to prevent an indefinite loop if 'DFS tree' is
4863 * misconfigured (i.e. has loops).
4864 */
4865 if (count++ > MAX_NESTED_LINKS) {
4866 rc = -ELOOP;
4867 break;
4868 }
4869
4870 kfree(full_path);
4871 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4872 if (IS_ERR(full_path)) {
4873 rc = PTR_ERR(full_path);
4874 full_path = NULL;
4875 break;
4876 }
4877
4878 old_mountdata = cifs_sb->mountdata;
4879 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4880 true);
4881 if (rc)
4882 break;
4883
4884 if (cifs_sb->mountdata != old_mountdata) {
4885 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4886 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4887 &tcon);
4888 /*
4889 * Ensure that DFS referrals go through new root server.
4890 */
4891 if (!rc && tcon &&
4892 (tcon->share_flags & (SHI1005_FLAGS_DFS |
4893 SHI1005_FLAGS_DFS_ROOT))) {
4894 cifs_put_tcon(root_tcon);
4895 set_root_tcon(cifs_sb, tcon, &root_tcon);
4896 }
4897 }
4898 if (rc) {
4899 if (rc == -EACCES || rc == -EOPNOTSUPP)
4900 break;
4901 /* Perform DFS failover to any other DFS targets */
4902 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4903 root_tcon->ses, &xid,
4904 &server, &ses, &tcon);
4905 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4906 !ses)
4907 goto error;
4908 }
4909 }
4910 cifs_put_tcon(root_tcon);
4911
4912 if (rc)
4913 goto error;
4914
4915 spin_lock(&cifs_tcp_ses_lock);
4916 if (!tcon->dfs_path) {
4917 /* Save full path in new tcon to do failover when reconnecting tcons */
4918 tcon->dfs_path = full_path;
4919 full_path = NULL;
4920 tcon->remap = cifs_remap(cifs_sb);
4921 }
4922 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4923 strlen(tcon->dfs_path),
4924 GFP_ATOMIC);
4925 if (!cifs_sb->origin_fullpath) {
4926 spin_unlock(&cifs_tcp_ses_lock);
4927 rc = -ENOMEM;
4928 goto error;
4929 }
4930 spin_unlock(&cifs_tcp_ses_lock);
4931
4932 rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4933 if (rc) {
4934 kfree(cifs_sb->origin_fullpath);
4935 goto error;
4936 }
4937 /*
4938 * After reconnecting to a different server, unique ids won't
4939 * match anymore, so we disable serverino. This prevents
4940 * dentry revalidation to think the dentry are stale (ESTALE).
4941 */
4942 cifs_autodisable_serverino(cifs_sb);
4943 out:
4944 free_xid(xid);
4945 return mount_setup_tlink(cifs_sb, ses, tcon);
4946
4947 error:
4948 kfree(full_path);
4949 kfree(root_path);
4950 kfree(origin_mountdata);
4951 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4952 return rc;
4953 }
4954 #else
cifs_mount(struct cifs_sb_info * cifs_sb,struct smb_vol * vol)4955 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4956 {
4957 int rc = 0;
4958 unsigned int xid;
4959 struct cifs_ses *ses;
4960 struct cifs_tcon *tcon;
4961 struct TCP_Server_Info *server;
4962
4963 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4964 if (rc)
4965 goto error;
4966
4967 if (tcon) {
4968 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4969 if (rc == -EREMOTE)
4970 rc = -EOPNOTSUPP;
4971 if (rc)
4972 goto error;
4973 }
4974
4975 free_xid(xid);
4976
4977 return mount_setup_tlink(cifs_sb, ses, tcon);
4978
4979 error:
4980 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4981 return rc;
4982 }
4983 #endif
4984
4985 /*
4986 * Issue a TREE_CONNECT request.
4987 */
4988 int
CIFSTCon(const unsigned int xid,struct cifs_ses * ses,const char * tree,struct cifs_tcon * tcon,const struct nls_table * nls_codepage)4989 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4990 const char *tree, struct cifs_tcon *tcon,
4991 const struct nls_table *nls_codepage)
4992 {
4993 struct smb_hdr *smb_buffer;
4994 struct smb_hdr *smb_buffer_response;
4995 TCONX_REQ *pSMB;
4996 TCONX_RSP *pSMBr;
4997 unsigned char *bcc_ptr;
4998 int rc = 0;
4999 int length;
5000 __u16 bytes_left, count;
5001
5002 if (ses == NULL)
5003 return -EIO;
5004
5005 smb_buffer = cifs_buf_get();
5006 if (smb_buffer == NULL)
5007 return -ENOMEM;
5008
5009 smb_buffer_response = smb_buffer;
5010
5011 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
5012 NULL /*no tid */ , 4 /*wct */ );
5013
5014 smb_buffer->Mid = get_next_mid(ses->server);
5015 smb_buffer->Uid = ses->Suid;
5016 pSMB = (TCONX_REQ *) smb_buffer;
5017 pSMBr = (TCONX_RSP *) smb_buffer_response;
5018
5019 pSMB->AndXCommand = 0xFF;
5020 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
5021 bcc_ptr = &pSMB->Password[0];
5022 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
5023 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
5024 *bcc_ptr = 0; /* password is null byte */
5025 bcc_ptr++; /* skip password */
5026 /* already aligned so no need to do it below */
5027 } else {
5028 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
5029 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
5030 specified as required (when that support is added to
5031 the vfs in the future) as only NTLM or the much
5032 weaker LANMAN (which we do not send by default) is accepted
5033 by Samba (not sure whether other servers allow
5034 NTLMv2 password here) */
5035 #ifdef CONFIG_CIFS_WEAK_PW_HASH
5036 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
5037 (ses->sectype == LANMAN))
5038 calc_lanman_hash(tcon->password, ses->server->cryptkey,
5039 ses->server->sec_mode &
5040 SECMODE_PW_ENCRYPT ? true : false,
5041 bcc_ptr);
5042 else
5043 #endif /* CIFS_WEAK_PW_HASH */
5044 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5045 bcc_ptr, nls_codepage);
5046 if (rc) {
5047 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
5048 __func__, rc);
5049 cifs_buf_release(smb_buffer);
5050 return rc;
5051 }
5052
5053 bcc_ptr += CIFS_AUTH_RESP_SIZE;
5054 if (ses->capabilities & CAP_UNICODE) {
5055 /* must align unicode strings */
5056 *bcc_ptr = 0; /* null byte password */
5057 bcc_ptr++;
5058 }
5059 }
5060
5061 if (ses->server->sign)
5062 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5063
5064 if (ses->capabilities & CAP_STATUS32) {
5065 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5066 }
5067 if (ses->capabilities & CAP_DFS) {
5068 smb_buffer->Flags2 |= SMBFLG2_DFS;
5069 }
5070 if (ses->capabilities & CAP_UNICODE) {
5071 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5072 length =
5073 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5074 6 /* max utf8 char length in bytes */ *
5075 (/* server len*/ + 256 /* share len */), nls_codepage);
5076 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
5077 bcc_ptr += 2; /* skip trailing null */
5078 } else { /* ASCII */
5079 strcpy(bcc_ptr, tree);
5080 bcc_ptr += strlen(tree) + 1;
5081 }
5082 strcpy(bcc_ptr, "?????");
5083 bcc_ptr += strlen("?????");
5084 bcc_ptr += 1;
5085 count = bcc_ptr - &pSMB->Password[0];
5086 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
5087 pSMB->hdr.smb_buf_length) + count);
5088 pSMB->ByteCount = cpu_to_le16(count);
5089
5090 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5091 0);
5092
5093 /* above now done in SendReceive */
5094 if (rc == 0) {
5095 bool is_unicode;
5096
5097 tcon->tidStatus = CifsGood;
5098 tcon->need_reconnect = false;
5099 tcon->tid = smb_buffer_response->Tid;
5100 bcc_ptr = pByteArea(smb_buffer_response);
5101 bytes_left = get_bcc(smb_buffer_response);
5102 length = strnlen(bcc_ptr, bytes_left - 2);
5103 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5104 is_unicode = true;
5105 else
5106 is_unicode = false;
5107
5108
5109 /* skip service field (NB: this field is always ASCII) */
5110 if (length == 3) {
5111 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5112 (bcc_ptr[2] == 'C')) {
5113 cifs_dbg(FYI, "IPC connection\n");
5114 tcon->ipc = true;
5115 tcon->pipe = true;
5116 }
5117 } else if (length == 2) {
5118 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5119 /* the most common case */
5120 cifs_dbg(FYI, "disk share connection\n");
5121 }
5122 }
5123 bcc_ptr += length + 1;
5124 bytes_left -= (length + 1);
5125 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5126
5127 /* mostly informational -- no need to fail on error here */
5128 kfree(tcon->nativeFileSystem);
5129 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5130 bytes_left, is_unicode,
5131 nls_codepage);
5132
5133 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5134
5135 if ((smb_buffer_response->WordCount == 3) ||
5136 (smb_buffer_response->WordCount == 7))
5137 /* field is in same location */
5138 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5139 else
5140 tcon->Flags = 0;
5141 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5142 }
5143
5144 cifs_buf_release(smb_buffer);
5145 return rc;
5146 }
5147
delayed_free(struct rcu_head * p)5148 static void delayed_free(struct rcu_head *p)
5149 {
5150 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
5151 unload_nls(sbi->local_nls);
5152 kfree(sbi);
5153 }
5154
5155 void
cifs_umount(struct cifs_sb_info * cifs_sb)5156 cifs_umount(struct cifs_sb_info *cifs_sb)
5157 {
5158 struct rb_root *root = &cifs_sb->tlink_tree;
5159 struct rb_node *node;
5160 struct tcon_link *tlink;
5161
5162 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5163
5164 spin_lock(&cifs_sb->tlink_tree_lock);
5165 while ((node = rb_first(root))) {
5166 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5167 cifs_get_tlink(tlink);
5168 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5169 rb_erase(node, root);
5170
5171 spin_unlock(&cifs_sb->tlink_tree_lock);
5172 cifs_put_tlink(tlink);
5173 spin_lock(&cifs_sb->tlink_tree_lock);
5174 }
5175 spin_unlock(&cifs_sb->tlink_tree_lock);
5176
5177 kfree(cifs_sb->mountdata);
5178 kfree(cifs_sb->prepath);
5179 #ifdef CONFIG_CIFS_DFS_UPCALL
5180 dfs_cache_del_vol(cifs_sb->origin_fullpath);
5181 kfree(cifs_sb->origin_fullpath);
5182 #endif
5183 call_rcu(&cifs_sb->rcu, delayed_free);
5184 }
5185
5186 int
cifs_negotiate_protocol(const unsigned int xid,struct cifs_ses * ses)5187 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5188 {
5189 int rc = 0;
5190 struct TCP_Server_Info *server = ses->server;
5191
5192 if (!server->ops->need_neg || !server->ops->negotiate)
5193 return -ENOSYS;
5194
5195 /* only send once per connect */
5196 if (!server->ops->need_neg(server))
5197 return 0;
5198
5199 rc = server->ops->negotiate(xid, ses);
5200 if (rc == 0) {
5201 spin_lock(&GlobalMid_Lock);
5202 if (server->tcpStatus == CifsNeedNegotiate)
5203 server->tcpStatus = CifsGood;
5204 else
5205 rc = -EHOSTDOWN;
5206 spin_unlock(&GlobalMid_Lock);
5207 }
5208
5209 return rc;
5210 }
5211
5212 int
cifs_setup_session(const unsigned int xid,struct cifs_ses * ses,struct nls_table * nls_info)5213 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5214 struct nls_table *nls_info)
5215 {
5216 int rc = -ENOSYS;
5217 struct TCP_Server_Info *server = ses->server;
5218
5219 ses->capabilities = server->capabilities;
5220 if (linuxExtEnabled == 0)
5221 ses->capabilities &= (~server->vals->cap_unix);
5222
5223 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5224 server->sec_mode, server->capabilities, server->timeAdj);
5225
5226 if (ses->auth_key.response) {
5227 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5228 ses->auth_key.response);
5229 kfree(ses->auth_key.response);
5230 ses->auth_key.response = NULL;
5231 ses->auth_key.len = 0;
5232 }
5233
5234 if (server->ops->sess_setup)
5235 rc = server->ops->sess_setup(xid, ses, nls_info);
5236
5237 if (rc)
5238 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5239
5240 return rc;
5241 }
5242
5243 static int
cifs_set_vol_auth(struct smb_vol * vol,struct cifs_ses * ses)5244 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5245 {
5246 vol->sectype = ses->sectype;
5247
5248 /* krb5 is special, since we don't need username or pw */
5249 if (vol->sectype == Kerberos)
5250 return 0;
5251
5252 return cifs_set_cifscreds(vol, ses);
5253 }
5254
5255 static struct cifs_tcon *
cifs_construct_tcon(struct cifs_sb_info * cifs_sb,kuid_t fsuid)5256 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5257 {
5258 int rc;
5259 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5260 struct cifs_ses *ses;
5261 struct cifs_tcon *tcon = NULL;
5262 struct smb_vol *vol_info;
5263
5264 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5265 if (vol_info == NULL)
5266 return ERR_PTR(-ENOMEM);
5267
5268 vol_info->local_nls = cifs_sb->local_nls;
5269 vol_info->linux_uid = fsuid;
5270 vol_info->cred_uid = fsuid;
5271 vol_info->UNC = master_tcon->treeName;
5272 vol_info->retry = master_tcon->retry;
5273 vol_info->nocase = master_tcon->nocase;
5274 vol_info->nohandlecache = master_tcon->nohandlecache;
5275 vol_info->local_lease = master_tcon->local_lease;
5276 vol_info->no_linux_ext = !master_tcon->unix_ext;
5277 vol_info->sectype = master_tcon->ses->sectype;
5278 vol_info->sign = master_tcon->ses->sign;
5279
5280 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5281 if (rc) {
5282 tcon = ERR_PTR(rc);
5283 goto out;
5284 }
5285
5286 /* get a reference for the same TCP session */
5287 spin_lock(&cifs_tcp_ses_lock);
5288 ++master_tcon->ses->server->srv_count;
5289 spin_unlock(&cifs_tcp_ses_lock);
5290
5291 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5292 if (IS_ERR(ses)) {
5293 tcon = (struct cifs_tcon *)ses;
5294 cifs_put_tcp_session(master_tcon->ses->server, 0);
5295 goto out;
5296 }
5297
5298 tcon = cifs_get_tcon(ses, vol_info);
5299 if (IS_ERR(tcon)) {
5300 cifs_put_smb_ses(ses);
5301 goto out;
5302 }
5303
5304 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
5305 if (tcon->posix_extensions)
5306 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
5307
5308 if (cap_unix(ses))
5309 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5310
5311 out:
5312 kfree(vol_info->username);
5313 kzfree(vol_info->password);
5314 kfree(vol_info);
5315
5316 return tcon;
5317 }
5318
5319 struct cifs_tcon *
cifs_sb_master_tcon(struct cifs_sb_info * cifs_sb)5320 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5321 {
5322 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5323 }
5324
5325 /* find and return a tlink with given uid */
5326 static struct tcon_link *
tlink_rb_search(struct rb_root * root,kuid_t uid)5327 tlink_rb_search(struct rb_root *root, kuid_t uid)
5328 {
5329 struct rb_node *node = root->rb_node;
5330 struct tcon_link *tlink;
5331
5332 while (node) {
5333 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5334
5335 if (uid_gt(tlink->tl_uid, uid))
5336 node = node->rb_left;
5337 else if (uid_lt(tlink->tl_uid, uid))
5338 node = node->rb_right;
5339 else
5340 return tlink;
5341 }
5342 return NULL;
5343 }
5344
5345 /* insert a tcon_link into the tree */
5346 static void
tlink_rb_insert(struct rb_root * root,struct tcon_link * new_tlink)5347 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5348 {
5349 struct rb_node **new = &(root->rb_node), *parent = NULL;
5350 struct tcon_link *tlink;
5351
5352 while (*new) {
5353 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5354 parent = *new;
5355
5356 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5357 new = &((*new)->rb_left);
5358 else
5359 new = &((*new)->rb_right);
5360 }
5361
5362 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5363 rb_insert_color(&new_tlink->tl_rbnode, root);
5364 }
5365
5366 /*
5367 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5368 * current task.
5369 *
5370 * If the superblock doesn't refer to a multiuser mount, then just return
5371 * the master tcon for the mount.
5372 *
5373 * First, search the rbtree for an existing tcon for this fsuid. If one
5374 * exists, then check to see if it's pending construction. If it is then wait
5375 * for construction to complete. Once it's no longer pending, check to see if
5376 * it failed and either return an error or retry construction, depending on
5377 * the timeout.
5378 *
5379 * If one doesn't exist then insert a new tcon_link struct into the tree and
5380 * try to construct a new one.
5381 */
5382 struct tcon_link *
cifs_sb_tlink(struct cifs_sb_info * cifs_sb)5383 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5384 {
5385 int ret;
5386 kuid_t fsuid = current_fsuid();
5387 struct tcon_link *tlink, *newtlink;
5388
5389 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5390 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5391
5392 spin_lock(&cifs_sb->tlink_tree_lock);
5393 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5394 if (tlink)
5395 cifs_get_tlink(tlink);
5396 spin_unlock(&cifs_sb->tlink_tree_lock);
5397
5398 if (tlink == NULL) {
5399 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5400 if (newtlink == NULL)
5401 return ERR_PTR(-ENOMEM);
5402 newtlink->tl_uid = fsuid;
5403 newtlink->tl_tcon = ERR_PTR(-EACCES);
5404 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5405 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5406 cifs_get_tlink(newtlink);
5407
5408 spin_lock(&cifs_sb->tlink_tree_lock);
5409 /* was one inserted after previous search? */
5410 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5411 if (tlink) {
5412 cifs_get_tlink(tlink);
5413 spin_unlock(&cifs_sb->tlink_tree_lock);
5414 kfree(newtlink);
5415 goto wait_for_construction;
5416 }
5417 tlink = newtlink;
5418 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5419 spin_unlock(&cifs_sb->tlink_tree_lock);
5420 } else {
5421 wait_for_construction:
5422 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5423 TASK_INTERRUPTIBLE);
5424 if (ret) {
5425 cifs_put_tlink(tlink);
5426 return ERR_PTR(-ERESTARTSYS);
5427 }
5428
5429 /* if it's good, return it */
5430 if (!IS_ERR(tlink->tl_tcon))
5431 return tlink;
5432
5433 /* return error if we tried this already recently */
5434 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5435 cifs_put_tlink(tlink);
5436 return ERR_PTR(-EACCES);
5437 }
5438
5439 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5440 goto wait_for_construction;
5441 }
5442
5443 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5444 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5445 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5446
5447 if (IS_ERR(tlink->tl_tcon)) {
5448 cifs_put_tlink(tlink);
5449 return ERR_PTR(-EACCES);
5450 }
5451
5452 return tlink;
5453 }
5454
5455 /*
5456 * periodic workqueue job that scans tcon_tree for a superblock and closes
5457 * out tcons.
5458 */
5459 static void
cifs_prune_tlinks(struct work_struct * work)5460 cifs_prune_tlinks(struct work_struct *work)
5461 {
5462 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5463 prune_tlinks.work);
5464 struct rb_root *root = &cifs_sb->tlink_tree;
5465 struct rb_node *node;
5466 struct rb_node *tmp;
5467 struct tcon_link *tlink;
5468
5469 /*
5470 * Because we drop the spinlock in the loop in order to put the tlink
5471 * it's not guarded against removal of links from the tree. The only
5472 * places that remove entries from the tree are this function and
5473 * umounts. Because this function is non-reentrant and is canceled
5474 * before umount can proceed, this is safe.
5475 */
5476 spin_lock(&cifs_sb->tlink_tree_lock);
5477 node = rb_first(root);
5478 while (node != NULL) {
5479 tmp = node;
5480 node = rb_next(tmp);
5481 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5482
5483 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5484 atomic_read(&tlink->tl_count) != 0 ||
5485 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5486 continue;
5487
5488 cifs_get_tlink(tlink);
5489 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5490 rb_erase(tmp, root);
5491
5492 spin_unlock(&cifs_sb->tlink_tree_lock);
5493 cifs_put_tlink(tlink);
5494 spin_lock(&cifs_sb->tlink_tree_lock);
5495 }
5496 spin_unlock(&cifs_sb->tlink_tree_lock);
5497
5498 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
5499 TLINK_IDLE_EXPIRE);
5500 }
5501