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