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