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