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