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