]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - fs/cifs/connect.c
cifs NTLMv2/NTLMSSP ntlmv2 within ntlmssp autentication code
[mirror_ubuntu-bionic-kernel.git] / fs / cifs / connect.c
CommitLineData
1da177e4
LT
1/*
2 * fs/cifs/connect.c
3 *
d185cda7 4 * Copyright (C) International Business Machines Corp., 2002,2009
1da177e4
LT
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
fb8c4b14 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1da177e4
LT
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>
5a0e3ad6 26#include <linux/slab.h>
1da177e4
LT
27#include <linux/pagemap.h>
28#include <linux/ctype.h>
29#include <linux/utsname.h>
30#include <linux/mempool.h>
b8643e1b 31#include <linux/delay.h>
f191401f 32#include <linux/completion.h>
aaf737ad 33#include <linux/kthread.h>
0ae0efad 34#include <linux/pagevec.h>
7dfb7103 35#include <linux/freezer.h>
5c2503a8 36#include <linux/namei.h>
1da177e4
LT
37#include <asm/uaccess.h>
38#include <asm/processor.h>
50b64e3b 39#include <linux/inet.h>
0e2bedaa 40#include <net/ipv6.h>
1da177e4
LT
41#include "cifspdu.h"
42#include "cifsglob.h"
43#include "cifsproto.h"
44#include "cifs_unicode.h"
45#include "cifs_debug.h"
46#include "cifs_fs_sb.h"
47#include "ntlmssp.h"
48#include "nterr.h"
49#include "rfc1002pdu.h"
a2653eba 50#include "cn_cifs.h"
488f1d2d 51#include "fscache.h"
1da177e4
LT
52
53#define CIFS_PORT 445
54#define RFC1001_PORT 139
55
1da177e4
LT
56extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
57 unsigned char *p24);
58
59extern mempool_t *cifs_req_poolp;
60
61struct smb_vol {
62 char *username;
63 char *password;
64 char *domainname;
65 char *UNC;
66 char *UNCip;
1da177e4
LT
67 char *iocharset; /* local code page for mapping to and from Unicode */
68 char source_rfc1001_name[16]; /* netbios name of client */
a10faeb2 69 char target_rfc1001_name[16]; /* netbios name of server for Win9x/ME */
3e4b3e1f 70 uid_t cred_uid;
1da177e4
LT
71 uid_t linux_uid;
72 gid_t linux_gid;
73 mode_t file_mode;
74 mode_t dir_mode;
189acaae 75 unsigned secFlg;
4b18f2a9
SF
76 bool retry:1;
77 bool intr:1;
78 bool setuids:1;
79 bool override_uid:1;
80 bool override_gid:1;
d0a9c078 81 bool dynperm:1;
4b18f2a9
SF
82 bool noperm:1;
83 bool no_psx_acl:1; /* set if posix acl support should be disabled */
84 bool cifs_acl:1;
85 bool no_xattr:1; /* set if xattr (EA) support should be disabled*/
86 bool server_ino:1; /* use inode numbers from server ie UniqueId */
87 bool direct_io:1;
95b1cb90
SF
88 bool remap:1; /* set to remap seven reserved chars in filenames */
89 bool posix_paths:1; /* unset to not ask for posix pathnames. */
4b18f2a9
SF
90 bool no_linux_ext:1;
91 bool sfu_emul:1;
95b1cb90
SF
92 bool nullauth:1; /* attempt to authenticate with null user */
93 bool nocase:1; /* request case insensitive filenames */
94 bool nobrl:1; /* disable sending byte range locks to srv */
13a6e42a 95 bool mand_lock:1; /* send mandatory not posix byte range lock reqs */
95b1cb90 96 bool seal:1; /* request transport encryption on share */
84210e91
SF
97 bool nodfs:1; /* Do not request DFS, even if available */
98 bool local_lease:1; /* check leases only on local system, not remote */
edf1ae40
SF
99 bool noblocksnd:1;
100 bool noautotune:1;
be652445 101 bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
fa1df75d 102 bool fsc:1; /* enable fscache */
1da177e4
LT
103 unsigned int rsize;
104 unsigned int wsize;
6a5fa236 105 bool sockopt_tcp_nodelay:1;
1da177e4 106 unsigned short int port;
fb8c4b14 107 char *prepath;
a5fc4ce0 108 struct nls_table *local_nls;
1da177e4
LT
109};
110
bcf4b106 111static int ipv4_connect(struct TCP_Server_Info *server);
d5c5605c 112static int ipv6_connect(struct TCP_Server_Info *server);
1da177e4 113
d5c5605c
JL
114/*
115 * cifs tcp session reconnection
116 *
117 * mark tcp session as reconnecting so temporarily locked
118 * mark all smb sessions as reconnecting for tcp session
119 * reconnect tcp session
120 * wake up waiters on reconnection? - (not needed currently)
121 */
2cd646a2 122static int
1da177e4
LT
123cifs_reconnect(struct TCP_Server_Info *server)
124{
125 int rc = 0;
f1987b44 126 struct list_head *tmp, *tmp2;
1da177e4
LT
127 struct cifsSesInfo *ses;
128 struct cifsTconInfo *tcon;
fb8c4b14 129 struct mid_q_entry *mid_entry;
50c2f753 130
1da177e4 131 spin_lock(&GlobalMid_Lock);
469ee614 132 if (server->tcpStatus == CifsExiting) {
fb8c4b14 133 /* the demux thread will exit normally
1da177e4
LT
134 next time through the loop */
135 spin_unlock(&GlobalMid_Lock);
136 return rc;
137 } else
138 server->tcpStatus = CifsNeedReconnect;
139 spin_unlock(&GlobalMid_Lock);
140 server->maxBuf = 0;
141
b6b38f70 142 cFYI(1, "Reconnecting tcp session");
1da177e4
LT
143
144 /* before reconnecting the tcp session, mark the smb session (uid)
145 and the tid bad so they are not used until reconnected */
14fbf50d
JL
146 read_lock(&cifs_tcp_ses_lock);
147 list_for_each(tmp, &server->smb_ses_list) {
148 ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
149 ses->need_reconnect = true;
150 ses->ipc_tid = 0;
f1987b44
JL
151 list_for_each(tmp2, &ses->tcon_list) {
152 tcon = list_entry(tmp2, struct cifsTconInfo, tcon_list);
3b795210 153 tcon->need_reconnect = true;
1da177e4 154 }
1da177e4 155 }
f1987b44 156 read_unlock(&cifs_tcp_ses_lock);
1da177e4 157 /* do not want to be sending data on a socket we are freeing */
72ca545b 158 mutex_lock(&server->srv_mutex);
fb8c4b14 159 if (server->ssocket) {
b6b38f70
JP
160 cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state,
161 server->ssocket->flags);
91cf45f0 162 kernel_sock_shutdown(server->ssocket, SHUT_WR);
b6b38f70 163 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
467a8f8d 164 server->ssocket->state,
b6b38f70 165 server->ssocket->flags);
1da177e4
LT
166 sock_release(server->ssocket);
167 server->ssocket = NULL;
168 }
169
170 spin_lock(&GlobalMid_Lock);
171 list_for_each(tmp, &server->pending_mid_q) {
172 mid_entry = list_entry(tmp, struct
173 mid_q_entry,
174 qhead);
ad8b15f0 175 if (mid_entry->midState == MID_REQUEST_SUBMITTED) {
09d1db5c
SF
176 /* Mark other intransit requests as needing
177 retry so we do not immediately mark the
178 session bad again (ie after we reconnect
179 below) as they timeout too */
ad8b15f0 180 mid_entry->midState = MID_RETRY_NEEDED;
1da177e4
LT
181 }
182 }
183 spin_unlock(&GlobalMid_Lock);
72ca545b 184 mutex_unlock(&server->srv_mutex);
1da177e4 185
469ee614
JL
186 while ((server->tcpStatus != CifsExiting) &&
187 (server->tcpStatus != CifsGood)) {
6c3d8909 188 try_to_freeze();
bcf4b106 189 if (server->addr.sockAddr6.sin6_family == AF_INET6)
d5c5605c 190 rc = ipv6_connect(server);
bcf4b106
JL
191 else
192 rc = ipv4_connect(server);
fb8c4b14 193 if (rc) {
b6b38f70 194 cFYI(1, "reconnect error %d", rc);
0cb766ae 195 msleep(3000);
1da177e4
LT
196 } else {
197 atomic_inc(&tcpSesReconnectCount);
198 spin_lock(&GlobalMid_Lock);
469ee614 199 if (server->tcpStatus != CifsExiting)
1da177e4 200 server->tcpStatus = CifsGood;
ad009ac9 201 server->sequence_number = 0;
fb8c4b14 202 spin_unlock(&GlobalMid_Lock);
1da177e4
LT
203 /* atomic_set(&server->inFlight,0);*/
204 wake_up(&server->response_q);
205 }
206 }
207 return rc;
208}
209
fb8c4b14 210/*
e4eb295d
SF
211 return codes:
212 0 not a transact2, or all data present
213 >0 transact2 with that much data missing
214 -EINVAL = invalid transact2
215
216 */
fb8c4b14 217static int check2ndT2(struct smb_hdr *pSMB, unsigned int maxBufSize)
e4eb295d 218{
fb8c4b14
SF
219 struct smb_t2_rsp *pSMBt;
220 int total_data_size;
e4eb295d
SF
221 int data_in_this_rsp;
222 int remaining;
223
fb8c4b14 224 if (pSMB->Command != SMB_COM_TRANSACTION2)
e4eb295d
SF
225 return 0;
226
fb8c4b14
SF
227 /* check for plausible wct, bcc and t2 data and parm sizes */
228 /* check for parm and data offset going beyond end of smb */
229 if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */
b6b38f70 230 cFYI(1, "invalid transact2 word count");
e4eb295d
SF
231 return -EINVAL;
232 }
233
234 pSMBt = (struct smb_t2_rsp *)pSMB;
235
236 total_data_size = le16_to_cpu(pSMBt->t2_rsp.TotalDataCount);
237 data_in_this_rsp = le16_to_cpu(pSMBt->t2_rsp.DataCount);
238
239 remaining = total_data_size - data_in_this_rsp;
240
fb8c4b14 241 if (remaining == 0)
e4eb295d 242 return 0;
fb8c4b14 243 else if (remaining < 0) {
b6b38f70
JP
244 cFYI(1, "total data %d smaller than data in frame %d",
245 total_data_size, data_in_this_rsp);
e4eb295d
SF
246 return -EINVAL;
247 } else {
b6b38f70
JP
248 cFYI(1, "missing %d bytes from transact2, check next response",
249 remaining);
fb8c4b14 250 if (total_data_size > maxBufSize) {
b6b38f70
JP
251 cERROR(1, "TotalDataSize %d is over maximum buffer %d",
252 total_data_size, maxBufSize);
fb8c4b14 253 return -EINVAL;
e4eb295d
SF
254 }
255 return remaining;
256 }
257}
258
fb8c4b14 259static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB)
e4eb295d
SF
260{
261 struct smb_t2_rsp *pSMB2 = (struct smb_t2_rsp *)psecond;
262 struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB;
263 int total_data_size;
264 int total_in_buf;
265 int remaining;
266 int total_in_buf2;
fb8c4b14
SF
267 char *data_area_of_target;
268 char *data_area_of_buf2;
e4eb295d
SF
269 __u16 byte_count;
270
271 total_data_size = le16_to_cpu(pSMBt->t2_rsp.TotalDataCount);
272
fb8c4b14 273 if (total_data_size != le16_to_cpu(pSMB2->t2_rsp.TotalDataCount)) {
b6b38f70 274 cFYI(1, "total data size of primary and secondary t2 differ");
e4eb295d
SF
275 }
276
277 total_in_buf = le16_to_cpu(pSMBt->t2_rsp.DataCount);
278
279 remaining = total_data_size - total_in_buf;
50c2f753 280
fb8c4b14 281 if (remaining < 0)
e4eb295d
SF
282 return -EINVAL;
283
fb8c4b14 284 if (remaining == 0) /* nothing to do, ignore */
e4eb295d 285 return 0;
50c2f753 286
e4eb295d 287 total_in_buf2 = le16_to_cpu(pSMB2->t2_rsp.DataCount);
fb8c4b14 288 if (remaining < total_in_buf2) {
b6b38f70 289 cFYI(1, "transact2 2nd response contains too much data");
e4eb295d
SF
290 }
291
292 /* find end of first SMB data area */
fb8c4b14 293 data_area_of_target = (char *)&pSMBt->hdr.Protocol +
e4eb295d
SF
294 le16_to_cpu(pSMBt->t2_rsp.DataOffset);
295 /* validate target area */
296
297 data_area_of_buf2 = (char *) &pSMB2->hdr.Protocol +
fb8c4b14 298 le16_to_cpu(pSMB2->t2_rsp.DataOffset);
e4eb295d
SF
299
300 data_area_of_target += total_in_buf;
301
302 /* copy second buffer into end of first buffer */
fb8c4b14 303 memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2);
e4eb295d
SF
304 total_in_buf += total_in_buf2;
305 pSMBt->t2_rsp.DataCount = cpu_to_le16(total_in_buf);
306 byte_count = le16_to_cpu(BCC_LE(pTargetSMB));
307 byte_count += total_in_buf2;
308 BCC_LE(pTargetSMB) = cpu_to_le16(byte_count);
309
70ca734a 310 byte_count = pTargetSMB->smb_buf_length;
e4eb295d
SF
311 byte_count += total_in_buf2;
312
313 /* BB also add check that we are not beyond maximum buffer size */
50c2f753 314
70ca734a 315 pTargetSMB->smb_buf_length = byte_count;
e4eb295d 316
fb8c4b14 317 if (remaining == total_in_buf2) {
b6b38f70 318 cFYI(1, "found the last secondary response");
e4eb295d
SF
319 return 0; /* we are done */
320 } else /* more responses to go */
321 return 1;
322
323}
324
1da177e4
LT
325static int
326cifs_demultiplex_thread(struct TCP_Server_Info *server)
327{
328 int length;
329 unsigned int pdu_length, total_read;
330 struct smb_hdr *smb_buffer = NULL;
b8643e1b
SF
331 struct smb_hdr *bigbuf = NULL;
332 struct smb_hdr *smallbuf = NULL;
1da177e4
LT
333 struct msghdr smb_msg;
334 struct kvec iov;
335 struct socket *csocket = server->ssocket;
336 struct list_head *tmp;
337 struct cifsSesInfo *ses;
338 struct task_struct *task_to_wake = NULL;
339 struct mid_q_entry *mid_entry;
70ca734a 340 char temp;
4b18f2a9
SF
341 bool isLargeBuf = false;
342 bool isMultiRsp;
e4eb295d 343 int reconnect;
1da177e4 344
1da177e4 345 current->flags |= PF_MEMALLOC;
b6b38f70 346 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
93d0ec85
JL
347
348 length = atomic_inc_return(&tcpSesAllocCount);
349 if (length > 1)
26f57364
SF
350 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
351 GFP_KERNEL);
1da177e4 352
83144186 353 set_freezable();
469ee614 354 while (server->tcpStatus != CifsExiting) {
ede1327e
SF
355 if (try_to_freeze())
356 continue;
b8643e1b
SF
357 if (bigbuf == NULL) {
358 bigbuf = cifs_buf_get();
0fd1ffe0 359 if (!bigbuf) {
b6b38f70 360 cERROR(1, "No memory for large SMB response");
b8643e1b
SF
361 msleep(3000);
362 /* retry will check if exiting */
363 continue;
364 }
0fd1ffe0
PM
365 } else if (isLargeBuf) {
366 /* we are reusing a dirty large buf, clear its start */
26f57364 367 memset(bigbuf, 0, sizeof(struct smb_hdr));
1da177e4 368 }
b8643e1b
SF
369
370 if (smallbuf == NULL) {
371 smallbuf = cifs_small_buf_get();
0fd1ffe0 372 if (!smallbuf) {
b6b38f70 373 cERROR(1, "No memory for SMB response");
b8643e1b
SF
374 msleep(1000);
375 /* retry will check if exiting */
376 continue;
377 }
378 /* beginning of smb buffer is cleared in our buf_get */
379 } else /* if existing small buf clear beginning */
26f57364 380 memset(smallbuf, 0, sizeof(struct smb_hdr));
b8643e1b 381
4b18f2a9
SF
382 isLargeBuf = false;
383 isMultiRsp = false;
b8643e1b 384 smb_buffer = smallbuf;
1da177e4
LT
385 iov.iov_base = smb_buffer;
386 iov.iov_len = 4;
387 smb_msg.msg_control = NULL;
388 smb_msg.msg_controllen = 0;
f01d5e14
SF
389 pdu_length = 4; /* enough to get RFC1001 header */
390incomplete_rcv:
1da177e4
LT
391 length =
392 kernel_recvmsg(csocket, &smb_msg,
f01d5e14 393 &iov, 1, pdu_length, 0 /* BB other flags? */);
1da177e4 394
469ee614 395 if (server->tcpStatus == CifsExiting) {
1da177e4
LT
396 break;
397 } else if (server->tcpStatus == CifsNeedReconnect) {
b6b38f70 398 cFYI(1, "Reconnect after server stopped responding");
1da177e4 399 cifs_reconnect(server);
b6b38f70 400 cFYI(1, "call to reconnect done");
1da177e4
LT
401 csocket = server->ssocket;
402 continue;
522bbe65
JL
403 } else if (length == -ERESTARTSYS ||
404 length == -EAGAIN ||
405 length == -EINTR) {
b8643e1b 406 msleep(1); /* minimum sleep to prevent looping
1da177e4
LT
407 allowing socket to clear and app threads to set
408 tcpStatus CifsNeedReconnect if server hung */
c527c8a7
SF
409 if (pdu_length < 4) {
410 iov.iov_base = (4 - pdu_length) +
411 (char *)smb_buffer;
412 iov.iov_len = pdu_length;
413 smb_msg.msg_control = NULL;
414 smb_msg.msg_controllen = 0;
c18c732e 415 goto incomplete_rcv;
c527c8a7 416 } else
c18c732e 417 continue;
1da177e4 418 } else if (length <= 0) {
b6b38f70
JP
419 cFYI(1, "Reconnect after unexpected peek error %d",
420 length);
1da177e4
LT
421 cifs_reconnect(server);
422 csocket = server->ssocket;
423 wake_up(&server->response_q);
424 continue;
2a974680 425 } else if (length < pdu_length) {
b6b38f70
JP
426 cFYI(1, "requested %d bytes but only got %d bytes",
427 pdu_length, length);
f01d5e14 428 pdu_length -= length;
f01d5e14
SF
429 msleep(1);
430 goto incomplete_rcv;
46810cbf 431 }
1da177e4 432
70ca734a
SF
433 /* The right amount was read from socket - 4 bytes */
434 /* so we can now interpret the length field */
46810cbf 435
70ca734a
SF
436 /* the first byte big endian of the length field,
437 is actually not part of the length but the type
438 with the most common, zero, as regular data */
439 temp = *((char *) smb_buffer);
46810cbf 440
fb8c4b14 441 /* Note that FC 1001 length is big endian on the wire,
70ca734a
SF
442 but we convert it here so it is always manipulated
443 as host byte order */
5ca33c6a 444 pdu_length = be32_to_cpu((__force __be32)smb_buffer->smb_buf_length);
70ca734a
SF
445 smb_buffer->smb_buf_length = pdu_length;
446
b6b38f70 447 cFYI(1, "rfc1002 length 0x%x", pdu_length+4);
46810cbf 448
70ca734a 449 if (temp == (char) RFC1002_SESSION_KEEP_ALIVE) {
fb8c4b14 450 continue;
70ca734a 451 } else if (temp == (char)RFC1002_POSITIVE_SESSION_RESPONSE) {
b6b38f70 452 cFYI(1, "Good RFC 1002 session rsp");
e4eb295d 453 continue;
70ca734a 454 } else if (temp == (char)RFC1002_NEGATIVE_SESSION_RESPONSE) {
fb8c4b14 455 /* we get this from Windows 98 instead of
46810cbf 456 an error on SMB negprot response */
b6b38f70
JP
457 cFYI(1, "Negative RFC1002 Session Response Error 0x%x)",
458 pdu_length);
7332f2a6
JL
459 /* give server a second to clean up */
460 msleep(1000);
461 /* always try 445 first on reconnect since we get NACK
462 * on some if we ever connected to port 139 (the NACK
463 * is since we do not begin with RFC1001 session
464 * initialize frame)
465 */
32670396
JL
466 cifs_set_port((struct sockaddr *)
467 &server->addr.sockAddr, CIFS_PORT);
7332f2a6
JL
468 cifs_reconnect(server);
469 csocket = server->ssocket;
470 wake_up(&server->response_q);
471 continue;
70ca734a 472 } else if (temp != (char) 0) {
b6b38f70 473 cERROR(1, "Unknown RFC 1002 frame");
70ca734a
SF
474 cifs_dump_mem(" Received Data: ", (char *)smb_buffer,
475 length);
46810cbf
SF
476 cifs_reconnect(server);
477 csocket = server->ssocket;
478 continue;
e4eb295d
SF
479 }
480
481 /* else we have an SMB response */
fb8c4b14 482 if ((pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) ||
26f57364 483 (pdu_length < sizeof(struct smb_hdr) - 1 - 4)) {
b6b38f70
JP
484 cERROR(1, "Invalid size SMB length %d pdu_length %d",
485 length, pdu_length+4);
e4eb295d
SF
486 cifs_reconnect(server);
487 csocket = server->ssocket;
488 wake_up(&server->response_q);
489 continue;
fb8c4b14 490 }
e4eb295d
SF
491
492 /* else length ok */
493 reconnect = 0;
494
fb8c4b14 495 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
4b18f2a9 496 isLargeBuf = true;
e4eb295d
SF
497 memcpy(bigbuf, smallbuf, 4);
498 smb_buffer = bigbuf;
499 }
500 length = 0;
501 iov.iov_base = 4 + (char *)smb_buffer;
502 iov.iov_len = pdu_length;
fb8c4b14 503 for (total_read = 0; total_read < pdu_length;
e4eb295d
SF
504 total_read += length) {
505 length = kernel_recvmsg(csocket, &smb_msg, &iov, 1,
506 pdu_length - total_read, 0);
522bbe65 507 if (server->tcpStatus == CifsExiting) {
e4eb295d
SF
508 /* then will exit */
509 reconnect = 2;
510 break;
511 } else if (server->tcpStatus == CifsNeedReconnect) {
46810cbf
SF
512 cifs_reconnect(server);
513 csocket = server->ssocket;
fb8c4b14 514 /* Reconnect wakes up rspns q */
e4eb295d
SF
515 /* Now we will reread sock */
516 reconnect = 1;
517 break;
522bbe65
JL
518 } else if (length == -ERESTARTSYS ||
519 length == -EAGAIN ||
520 length == -EINTR) {
e4eb295d 521 msleep(1); /* minimum sleep to prevent looping,
fb8c4b14 522 allowing socket to clear and app
e4eb295d
SF
523 threads to set tcpStatus
524 CifsNeedReconnect if server hung*/
c18c732e 525 length = 0;
46810cbf 526 continue;
e4eb295d 527 } else if (length <= 0) {
b6b38f70
JP
528 cERROR(1, "Received no data, expecting %d",
529 pdu_length - total_read);
e4eb295d
SF
530 cifs_reconnect(server);
531 csocket = server->ssocket;
532 reconnect = 1;
533 break;
46810cbf 534 }
e4eb295d 535 }
fb8c4b14 536 if (reconnect == 2)
e4eb295d 537 break;
fb8c4b14 538 else if (reconnect == 1)
e4eb295d 539 continue;
1da177e4 540
e4eb295d 541 length += 4; /* account for rfc1002 hdr */
50c2f753 542
09d1db5c 543
e4eb295d 544 dump_smb(smb_buffer, length);
184ed211 545 if (checkSMB(smb_buffer, smb_buffer->Mid, total_read+4)) {
b387eaeb 546 cifs_dump_mem("Bad SMB: ", smb_buffer, 48);
e4eb295d
SF
547 continue;
548 }
1da177e4 549
e4eb295d
SF
550
551 task_to_wake = NULL;
552 spin_lock(&GlobalMid_Lock);
553 list_for_each(tmp, &server->pending_mid_q) {
554 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
555
50c2f753 556 if ((mid_entry->mid == smb_buffer->Mid) &&
e4eb295d
SF
557 (mid_entry->midState == MID_REQUEST_SUBMITTED) &&
558 (mid_entry->command == smb_buffer->Command)) {
fb8c4b14 559 if (check2ndT2(smb_buffer,server->maxBuf) > 0) {
e4eb295d 560 /* We have a multipart transact2 resp */
4b18f2a9 561 isMultiRsp = true;
fb8c4b14 562 if (mid_entry->resp_buf) {
e4eb295d 563 /* merge response - fix up 1st*/
50c2f753 564 if (coalesce_t2(smb_buffer,
e4eb295d 565 mid_entry->resp_buf)) {
4b18f2a9
SF
566 mid_entry->multiRsp =
567 true;
e4eb295d
SF
568 break;
569 } else {
570 /* all parts received */
4b18f2a9
SF
571 mid_entry->multiEnd =
572 true;
50c2f753 573 goto multi_t2_fnd;
e4eb295d
SF
574 }
575 } else {
fb8c4b14 576 if (!isLargeBuf) {
b6b38f70 577 cERROR(1, "1st trans2 resp needs bigbuf");
e4eb295d 578 /* BB maybe we can fix this up, switch
50c2f753 579 to already allocated large buffer? */
e4eb295d 580 } else {
cd63499c 581 /* Have first buffer */
e4eb295d
SF
582 mid_entry->resp_buf =
583 smb_buffer;
4b18f2a9
SF
584 mid_entry->largeBuf =
585 true;
e4eb295d
SF
586 bigbuf = NULL;
587 }
588 }
589 break;
50c2f753 590 }
e4eb295d 591 mid_entry->resp_buf = smb_buffer;
4b18f2a9 592 mid_entry->largeBuf = isLargeBuf;
e4eb295d
SF
593multi_t2_fnd:
594 task_to_wake = mid_entry->tsk;
595 mid_entry->midState = MID_RESPONSE_RECEIVED;
1047abc1
SF
596#ifdef CONFIG_CIFS_STATS2
597 mid_entry->when_received = jiffies;
598#endif
3a5ff61c
SF
599 /* so we do not time out requests to server
600 which is still responding (since server could
601 be busy but not dead) */
602 server->lstrp = jiffies;
e4eb295d 603 break;
46810cbf 604 }
1da177e4 605 }
e4eb295d
SF
606 spin_unlock(&GlobalMid_Lock);
607 if (task_to_wake) {
cd63499c 608 /* Was previous buf put in mpx struct for multi-rsp? */
fb8c4b14 609 if (!isMultiRsp) {
cd63499c 610 /* smb buffer will be freed by user thread */
26f57364 611 if (isLargeBuf)
cd63499c 612 bigbuf = NULL;
26f57364 613 else
cd63499c
SF
614 smallbuf = NULL;
615 }
e4eb295d 616 wake_up_process(task_to_wake);
4b18f2a9
SF
617 } else if (!is_valid_oplock_break(smb_buffer, server) &&
618 !isMultiRsp) {
b6b38f70
JP
619 cERROR(1, "No task to wake, unknown frame received! "
620 "NumMids %d", midCount.counter);
50c2f753 621 cifs_dump_mem("Received Data is: ", (char *)smb_buffer,
70ca734a 622 sizeof(struct smb_hdr));
3979877e
SF
623#ifdef CONFIG_CIFS_DEBUG2
624 cifs_dump_detail(smb_buffer);
625 cifs_dump_mids(server);
626#endif /* CIFS_DEBUG2 */
50c2f753 627
e4eb295d
SF
628 }
629 } /* end while !EXITING */
630
e7ddee90
JL
631 /* take it off the list, if it's not already */
632 write_lock(&cifs_tcp_ses_lock);
633 list_del_init(&server->tcp_ses_list);
634 write_unlock(&cifs_tcp_ses_lock);
635
1da177e4
LT
636 spin_lock(&GlobalMid_Lock);
637 server->tcpStatus = CifsExiting;
e691b9d1 638 spin_unlock(&GlobalMid_Lock);
dbdbb876 639 wake_up_all(&server->response_q);
e691b9d1 640
31ca3bc3
SF
641 /* check if we have blocked requests that need to free */
642 /* Note that cifs_max_pending is normally 50, but
643 can be set at module install time to as little as two */
e691b9d1 644 spin_lock(&GlobalMid_Lock);
fb8c4b14 645 if (atomic_read(&server->inFlight) >= cifs_max_pending)
31ca3bc3
SF
646 atomic_set(&server->inFlight, cifs_max_pending - 1);
647 /* We do not want to set the max_pending too low or we
648 could end up with the counter going negative */
1da177e4 649 spin_unlock(&GlobalMid_Lock);
50c2f753 650 /* Although there should not be any requests blocked on
1da177e4 651 this queue it can not hurt to be paranoid and try to wake up requests
09d1db5c 652 that may haven been blocked when more than 50 at time were on the wire
1da177e4
LT
653 to the same server - they now will see the session is in exit state
654 and get out of SendReceive. */
655 wake_up_all(&server->request_q);
656 /* give those requests time to exit */
b8643e1b 657 msleep(125);
50c2f753 658
fb8c4b14 659 if (server->ssocket) {
1da177e4
LT
660 sock_release(csocket);
661 server->ssocket = NULL;
662 }
b8643e1b 663 /* buffer usuallly freed in free_mid - need to free it here on exit */
a8a11d39
MK
664 cifs_buf_release(bigbuf);
665 if (smallbuf) /* no sense logging a debug message if NULL */
b8643e1b 666 cifs_small_buf_release(smallbuf);
1da177e4 667
14fbf50d
JL
668 /*
669 * BB: we shouldn't have to do any of this. It shouldn't be
670 * possible to exit from the thread with active SMB sessions
671 */
672 read_lock(&cifs_tcp_ses_lock);
1da177e4 673 if (list_empty(&server->pending_mid_q)) {
09d1db5c
SF
674 /* loop through server session structures attached to this and
675 mark them dead */
14fbf50d
JL
676 list_for_each(tmp, &server->smb_ses_list) {
677 ses = list_entry(tmp, struct cifsSesInfo,
678 smb_ses_list);
679 ses->status = CifsExiting;
680 ses->server = NULL;
1da177e4 681 }
14fbf50d 682 read_unlock(&cifs_tcp_ses_lock);
1da177e4 683 } else {
31ca3bc3
SF
684 /* although we can not zero the server struct pointer yet,
685 since there are active requests which may depnd on them,
686 mark the corresponding SMB sessions as exiting too */
14fbf50d 687 list_for_each(tmp, &server->smb_ses_list) {
31ca3bc3 688 ses = list_entry(tmp, struct cifsSesInfo,
14fbf50d
JL
689 smb_ses_list);
690 ses->status = CifsExiting;
31ca3bc3
SF
691 }
692
1da177e4
LT
693 spin_lock(&GlobalMid_Lock);
694 list_for_each(tmp, &server->pending_mid_q) {
695 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
696 if (mid_entry->midState == MID_REQUEST_SUBMITTED) {
b6b38f70
JP
697 cFYI(1, "Clearing Mid 0x%x - waking up ",
698 mid_entry->mid);
1da177e4 699 task_to_wake = mid_entry->tsk;
26f57364 700 if (task_to_wake)
1da177e4 701 wake_up_process(task_to_wake);
1da177e4
LT
702 }
703 }
704 spin_unlock(&GlobalMid_Lock);
14fbf50d 705 read_unlock(&cifs_tcp_ses_lock);
1da177e4 706 /* 1/8th of sec is more than enough time for them to exit */
b8643e1b 707 msleep(125);
1da177e4
LT
708 }
709
f191401f 710 if (!list_empty(&server->pending_mid_q)) {
50c2f753 711 /* mpx threads have not exited yet give them
1da177e4 712 at least the smb send timeout time for long ops */
31ca3bc3
SF
713 /* due to delays on oplock break requests, we need
714 to wait at least 45 seconds before giving up
715 on a request getting a response and going ahead
716 and killing cifsd */
b6b38f70 717 cFYI(1, "Wait for exit from demultiplex thread");
31ca3bc3 718 msleep(46000);
1da177e4
LT
719 /* if threads still have not exited they are probably never
720 coming home not much else we can do but free the memory */
721 }
1da177e4 722
31ca3bc3
SF
723 /* last chance to mark ses pointers invalid
724 if there are any pointing to this (e.g
50c2f753 725 if a crazy root user tried to kill cifsd
31ca3bc3 726 kernel thread explicitly this might happen) */
14fbf50d
JL
727 /* BB: This shouldn't be necessary, see above */
728 read_lock(&cifs_tcp_ses_lock);
729 list_for_each(tmp, &server->smb_ses_list) {
730 ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
731 ses->server = NULL;
31ca3bc3 732 }
14fbf50d 733 read_unlock(&cifs_tcp_ses_lock);
31ca3bc3 734
c359cf3c 735 kfree(server->hostname);
b1c8d2b4 736 task_to_wake = xchg(&server->tsk, NULL);
31ca3bc3 737 kfree(server);
93d0ec85
JL
738
739 length = atomic_dec_return(&tcpSesAllocCount);
26f57364
SF
740 if (length > 0)
741 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
742 GFP_KERNEL);
50c2f753 743
b1c8d2b4
JL
744 /* if server->tsk was NULL then wait for a signal before exiting */
745 if (!task_to_wake) {
746 set_current_state(TASK_INTERRUPTIBLE);
747 while (!signal_pending(current)) {
748 schedule();
749 set_current_state(TASK_INTERRUPTIBLE);
750 }
751 set_current_state(TASK_RUNNING);
752 }
753
0468a2cf 754 module_put_and_exit(0);
1da177e4
LT
755}
756
c359cf3c
JL
757/* extract the host portion of the UNC string */
758static char *
759extract_hostname(const char *unc)
760{
761 const char *src;
762 char *dst, *delim;
763 unsigned int len;
764
765 /* skip double chars at beginning of string */
766 /* BB: check validity of these bytes? */
767 src = unc + 2;
768
769 /* delimiter between hostname and sharename is always '\\' now */
770 delim = strchr(src, '\\');
771 if (!delim)
772 return ERR_PTR(-EINVAL);
773
774 len = delim - src;
775 dst = kmalloc((len + 1), GFP_KERNEL);
776 if (dst == NULL)
777 return ERR_PTR(-ENOMEM);
778
779 memcpy(dst, src, len);
780 dst[len] = '\0';
781
782 return dst;
783}
784
1da177e4 785static int
50c2f753
SF
786cifs_parse_mount_options(char *options, const char *devname,
787 struct smb_vol *vol)
1da177e4
LT
788{
789 char *value;
790 char *data;
791 unsigned int temp_len, i, j;
792 char separator[2];
9b9d6b24
JL
793 short int override_uid = -1;
794 short int override_gid = -1;
795 bool uid_specified = false;
796 bool gid_specified = false;
1da177e4
LT
797
798 separator[0] = ',';
50c2f753 799 separator[1] = 0;
1da177e4 800
12e36b2f 801 if (Local_System_Name[0] != 0)
50c2f753 802 memcpy(vol->source_rfc1001_name, Local_System_Name, 15);
2cd646a2 803 else {
12e36b2f 804 char *nodename = utsname()->nodename;
50c2f753
SF
805 int n = strnlen(nodename, 15);
806 memset(vol->source_rfc1001_name, 0x20, 15);
807 for (i = 0; i < n; i++) {
2cd646a2
SF
808 /* does not have to be perfect mapping since field is
809 informational, only used for servers that do not support
810 port 445 and it can be overridden at mount time */
12e36b2f 811 vol->source_rfc1001_name[i] = toupper(nodename[i]);
2cd646a2 812 }
1da177e4
LT
813 }
814 vol->source_rfc1001_name[15] = 0;
a10faeb2
SF
815 /* null target name indicates to use *SMBSERVR default called name
816 if we end up sending RFC1001 session initialize */
817 vol->target_rfc1001_name[0] = 0;
3e4b3e1f
JL
818 vol->cred_uid = current_uid();
819 vol->linux_uid = current_uid();
a001e5b5 820 vol->linux_gid = current_gid();
f55ed1a8
JL
821
822 /* default to only allowing write access to owner of the mount */
823 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1da177e4
LT
824
825 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
ac67055e
JA
826 /* default is always to request posix paths. */
827 vol->posix_paths = 1;
a0c9217f
JL
828 /* default to using server inode numbers where available */
829 vol->server_ino = 1;
ac67055e 830
1da177e4
LT
831 if (!options)
832 return 1;
833
50c2f753 834 if (strncmp(options, "sep=", 4) == 0) {
fb8c4b14 835 if (options[4] != 0) {
1da177e4
LT
836 separator[0] = options[4];
837 options += 5;
838 } else {
b6b38f70 839 cFYI(1, "Null separator not allowed");
1da177e4
LT
840 }
841 }
50c2f753 842
1da177e4
LT
843 while ((data = strsep(&options, separator)) != NULL) {
844 if (!*data)
845 continue;
846 if ((value = strchr(data, '=')) != NULL)
847 *value++ = '\0';
848
50c2f753
SF
849 /* Have to parse this before we parse for "user" */
850 if (strnicmp(data, "user_xattr", 10) == 0) {
1da177e4 851 vol->no_xattr = 0;
50c2f753 852 } else if (strnicmp(data, "nouser_xattr", 12) == 0) {
1da177e4
LT
853 vol->no_xattr = 1;
854 } else if (strnicmp(data, "user", 4) == 0) {
4b952a9b 855 if (!value) {
1da177e4
LT
856 printk(KERN_WARNING
857 "CIFS: invalid or missing username\n");
858 return 1; /* needs_arg; */
fb8c4b14 859 } else if (!*value) {
4b952a9b
SF
860 /* null user, ie anonymous, authentication */
861 vol->nullauth = 1;
1da177e4
LT
862 }
863 if (strnlen(value, 200) < 200) {
864 vol->username = value;
865 } else {
866 printk(KERN_WARNING "CIFS: username too long\n");
867 return 1;
868 }
869 } else if (strnicmp(data, "pass", 4) == 0) {
870 if (!value) {
871 vol->password = NULL;
872 continue;
fb8c4b14 873 } else if (value[0] == 0) {
1da177e4
LT
874 /* check if string begins with double comma
875 since that would mean the password really
876 does start with a comma, and would not
877 indicate an empty string */
fb8c4b14 878 if (value[1] != separator[0]) {
1da177e4
LT
879 vol->password = NULL;
880 continue;
881 }
882 }
883 temp_len = strlen(value);
884 /* removed password length check, NTLM passwords
885 can be arbitrarily long */
886
50c2f753 887 /* if comma in password, the string will be
1da177e4
LT
888 prematurely null terminated. Commas in password are
889 specified across the cifs mount interface by a double
890 comma ie ,, and a comma used as in other cases ie ','
891 as a parameter delimiter/separator is single and due
892 to the strsep above is temporarily zeroed. */
893
894 /* NB: password legally can have multiple commas and
895 the only illegal character in a password is null */
896
50c2f753 897 if ((value[temp_len] == 0) &&
09d1db5c 898 (value[temp_len+1] == separator[0])) {
1da177e4
LT
899 /* reinsert comma */
900 value[temp_len] = separator[0];
50c2f753
SF
901 temp_len += 2; /* move after second comma */
902 while (value[temp_len] != 0) {
1da177e4 903 if (value[temp_len] == separator[0]) {
50c2f753 904 if (value[temp_len+1] ==
09d1db5c
SF
905 separator[0]) {
906 /* skip second comma */
907 temp_len++;
50c2f753 908 } else {
1da177e4
LT
909 /* single comma indicating start
910 of next parm */
911 break;
912 }
913 }
914 temp_len++;
915 }
fb8c4b14 916 if (value[temp_len] == 0) {
1da177e4
LT
917 options = NULL;
918 } else {
919 value[temp_len] = 0;
920 /* point option to start of next parm */
921 options = value + temp_len + 1;
922 }
50c2f753 923 /* go from value to value + temp_len condensing
1da177e4
LT
924 double commas to singles. Note that this ends up
925 allocating a few bytes too many, which is ok */
e915fc49 926 vol->password = kzalloc(temp_len, GFP_KERNEL);
fb8c4b14 927 if (vol->password == NULL) {
50c2f753
SF
928 printk(KERN_WARNING "CIFS: no memory "
929 "for password\n");
433dc24f
SF
930 return 1;
931 }
50c2f753 932 for (i = 0, j = 0; i < temp_len; i++, j++) {
1da177e4 933 vol->password[j] = value[i];
fb8c4b14 934 if (value[i] == separator[0]
09d1db5c 935 && value[i+1] == separator[0]) {
1da177e4
LT
936 /* skip second comma */
937 i++;
938 }
939 }
940 vol->password[j] = 0;
941 } else {
e915fc49 942 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
fb8c4b14 943 if (vol->password == NULL) {
50c2f753
SF
944 printk(KERN_WARNING "CIFS: no memory "
945 "for password\n");
433dc24f
SF
946 return 1;
947 }
1da177e4
LT
948 strcpy(vol->password, value);
949 }
58f7f68f
JL
950 } else if (!strnicmp(data, "ip", 2) ||
951 !strnicmp(data, "addr", 4)) {
1da177e4
LT
952 if (!value || !*value) {
953 vol->UNCip = NULL;
50b64e3b
JL
954 } else if (strnlen(value, INET6_ADDRSTRLEN) <
955 INET6_ADDRSTRLEN) {
1da177e4
LT
956 vol->UNCip = value;
957 } else {
50c2f753
SF
958 printk(KERN_WARNING "CIFS: ip address "
959 "too long\n");
1da177e4
LT
960 return 1;
961 }
50c2f753
SF
962 } else if (strnicmp(data, "sec", 3) == 0) {
963 if (!value || !*value) {
b6b38f70 964 cERROR(1, "no security value specified");
50c2f753
SF
965 continue;
966 } else if (strnicmp(value, "krb5i", 5) == 0) {
967 vol->secFlg |= CIFSSEC_MAY_KRB5 |
189acaae 968 CIFSSEC_MUST_SIGN;
bf820679 969 } else if (strnicmp(value, "krb5p", 5) == 0) {
50c2f753
SF
970 /* vol->secFlg |= CIFSSEC_MUST_SEAL |
971 CIFSSEC_MAY_KRB5; */
b6b38f70 972 cERROR(1, "Krb5 cifs privacy not supported");
bf820679
SF
973 return 1;
974 } else if (strnicmp(value, "krb5", 4) == 0) {
750d1151 975 vol->secFlg |= CIFSSEC_MAY_KRB5;
ac683924
SF
976#ifdef CONFIG_CIFS_EXPERIMENTAL
977 } else if (strnicmp(value, "ntlmsspi", 8) == 0) {
978 vol->secFlg |= CIFSSEC_MAY_NTLMSSP |
979 CIFSSEC_MUST_SIGN;
980 } else if (strnicmp(value, "ntlmssp", 7) == 0) {
981 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
982#endif
bf820679 983 } else if (strnicmp(value, "ntlmv2i", 7) == 0) {
750d1151 984 vol->secFlg |= CIFSSEC_MAY_NTLMV2 |
189acaae 985 CIFSSEC_MUST_SIGN;
bf820679 986 } else if (strnicmp(value, "ntlmv2", 6) == 0) {
750d1151 987 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
bf820679 988 } else if (strnicmp(value, "ntlmi", 5) == 0) {
750d1151 989 vol->secFlg |= CIFSSEC_MAY_NTLM |
189acaae 990 CIFSSEC_MUST_SIGN;
bf820679
SF
991 } else if (strnicmp(value, "ntlm", 4) == 0) {
992 /* ntlm is default so can be turned off too */
750d1151 993 vol->secFlg |= CIFSSEC_MAY_NTLM;
bf820679 994 } else if (strnicmp(value, "nontlm", 6) == 0) {
189acaae 995 /* BB is there a better way to do this? */
750d1151 996 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
189acaae
SF
997#ifdef CONFIG_CIFS_WEAK_PW_HASH
998 } else if (strnicmp(value, "lanman", 6) == 0) {
50c2f753 999 vol->secFlg |= CIFSSEC_MAY_LANMAN;
189acaae 1000#endif
bf820679 1001 } else if (strnicmp(value, "none", 4) == 0) {
189acaae 1002 vol->nullauth = 1;
50c2f753 1003 } else {
b6b38f70 1004 cERROR(1, "bad security option: %s", value);
50c2f753
SF
1005 return 1;
1006 }
1da177e4
LT
1007 } else if ((strnicmp(data, "unc", 3) == 0)
1008 || (strnicmp(data, "target", 6) == 0)
1009 || (strnicmp(data, "path", 4) == 0)) {
1010 if (!value || !*value) {
50c2f753
SF
1011 printk(KERN_WARNING "CIFS: invalid path to "
1012 "network resource\n");
1da177e4
LT
1013 return 1; /* needs_arg; */
1014 }
1015 if ((temp_len = strnlen(value, 300)) < 300) {
50c2f753 1016 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
4523cc30 1017 if (vol->UNC == NULL)
1da177e4 1018 return 1;
50c2f753 1019 strcpy(vol->UNC, value);
1da177e4
LT
1020 if (strncmp(vol->UNC, "//", 2) == 0) {
1021 vol->UNC[0] = '\\';
1022 vol->UNC[1] = '\\';
50c2f753 1023 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1da177e4 1024 printk(KERN_WARNING
50c2f753
SF
1025 "CIFS: UNC Path does not begin "
1026 "with // or \\\\ \n");
1da177e4
LT
1027 return 1;
1028 }
1029 } else {
1030 printk(KERN_WARNING "CIFS: UNC name too long\n");
1031 return 1;
1032 }
1033 } else if ((strnicmp(data, "domain", 3) == 0)
1034 || (strnicmp(data, "workgroup", 5) == 0)) {
1035 if (!value || !*value) {
1036 printk(KERN_WARNING "CIFS: invalid domain name\n");
1037 return 1; /* needs_arg; */
1038 }
1039 /* BB are there cases in which a comma can be valid in
1040 a domain name and need special handling? */
3979877e 1041 if (strnlen(value, 256) < 256) {
1da177e4 1042 vol->domainname = value;
b6b38f70 1043 cFYI(1, "Domain name set");
1da177e4 1044 } else {
50c2f753
SF
1045 printk(KERN_WARNING "CIFS: domain name too "
1046 "long\n");
1da177e4
LT
1047 return 1;
1048 }
50c2f753
SF
1049 } else if (strnicmp(data, "prefixpath", 10) == 0) {
1050 if (!value || !*value) {
1051 printk(KERN_WARNING
1052 "CIFS: invalid path prefix\n");
1053 return 1; /* needs_argument */
1054 }
1055 if ((temp_len = strnlen(value, 1024)) < 1024) {
4523cc30 1056 if (value[0] != '/')
2fe87f02 1057 temp_len++; /* missing leading slash */
50c2f753
SF
1058 vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
1059 if (vol->prepath == NULL)
1060 return 1;
4523cc30 1061 if (value[0] != '/') {
2fe87f02 1062 vol->prepath[0] = '/';
50c2f753 1063 strcpy(vol->prepath+1, value);
2fe87f02 1064 } else
50c2f753 1065 strcpy(vol->prepath, value);
b6b38f70 1066 cFYI(1, "prefix path %s", vol->prepath);
50c2f753
SF
1067 } else {
1068 printk(KERN_WARNING "CIFS: prefix too long\n");
1069 return 1;
1070 }
1da177e4
LT
1071 } else if (strnicmp(data, "iocharset", 9) == 0) {
1072 if (!value || !*value) {
63135e08
SF
1073 printk(KERN_WARNING "CIFS: invalid iocharset "
1074 "specified\n");
1da177e4
LT
1075 return 1; /* needs_arg; */
1076 }
1077 if (strnlen(value, 65) < 65) {
50c2f753 1078 if (strnicmp(value, "default", 7))
1da177e4 1079 vol->iocharset = value;
50c2f753
SF
1080 /* if iocharset not set then load_nls_default
1081 is used by caller */
b6b38f70 1082 cFYI(1, "iocharset set to %s", value);
1da177e4 1083 } else {
63135e08
SF
1084 printk(KERN_WARNING "CIFS: iocharset name "
1085 "too long.\n");
1da177e4
LT
1086 return 1;
1087 }
9b9d6b24
JL
1088 } else if (!strnicmp(data, "uid", 3) && value && *value) {
1089 vol->linux_uid = simple_strtoul(value, &value, 0);
1090 uid_specified = true;
1091 } else if (!strnicmp(data, "forceuid", 8)) {
1092 override_uid = 1;
1093 } else if (!strnicmp(data, "noforceuid", 10)) {
1094 override_uid = 0;
1095 } else if (!strnicmp(data, "gid", 3) && value && *value) {
1096 vol->linux_gid = simple_strtoul(value, &value, 0);
1097 gid_specified = true;
1098 } else if (!strnicmp(data, "forcegid", 8)) {
1099 override_gid = 1;
1100 } else if (!strnicmp(data, "noforcegid", 10)) {
1101 override_gid = 0;
1da177e4
LT
1102 } else if (strnicmp(data, "file_mode", 4) == 0) {
1103 if (value && *value) {
1104 vol->file_mode =
1105 simple_strtoul(value, &value, 0);
1106 }
1107 } else if (strnicmp(data, "dir_mode", 4) == 0) {
1108 if (value && *value) {
1109 vol->dir_mode =
1110 simple_strtoul(value, &value, 0);
1111 }
1112 } else if (strnicmp(data, "dirmode", 4) == 0) {
1113 if (value && *value) {
1114 vol->dir_mode =
1115 simple_strtoul(value, &value, 0);
1116 }
1117 } else if (strnicmp(data, "port", 4) == 0) {
1118 if (value && *value) {
1119 vol->port =
1120 simple_strtoul(value, &value, 0);
1121 }
1122 } else if (strnicmp(data, "rsize", 5) == 0) {
1123 if (value && *value) {
1124 vol->rsize =
1125 simple_strtoul(value, &value, 0);
1126 }
1127 } else if (strnicmp(data, "wsize", 5) == 0) {
1128 if (value && *value) {
1129 vol->wsize =
1130 simple_strtoul(value, &value, 0);
1131 }
1132 } else if (strnicmp(data, "sockopt", 5) == 0) {
6a5fa236 1133 if (!value || !*value) {
b6b38f70 1134 cERROR(1, "no socket option specified");
6a5fa236
SF
1135 continue;
1136 } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) {
1137 vol->sockopt_tcp_nodelay = 1;
1da177e4
LT
1138 }
1139 } else if (strnicmp(data, "netbiosname", 4) == 0) {
1140 if (!value || !*value || (*value == ' ')) {
b6b38f70 1141 cFYI(1, "invalid (empty) netbiosname");
1da177e4 1142 } else {
50c2f753
SF
1143 memset(vol->source_rfc1001_name, 0x20, 15);
1144 for (i = 0; i < 15; i++) {
1145 /* BB are there cases in which a comma can be
1da177e4
LT
1146 valid in this workstation netbios name (and need
1147 special handling)? */
1148
1149 /* We do not uppercase netbiosname for user */
50c2f753 1150 if (value[i] == 0)
1da177e4 1151 break;
50c2f753
SF
1152 else
1153 vol->source_rfc1001_name[i] =
1154 value[i];
1da177e4
LT
1155 }
1156 /* The string has 16th byte zero still from
1157 set at top of the function */
50c2f753
SF
1158 if ((i == 15) && (value[i] != 0))
1159 printk(KERN_WARNING "CIFS: netbiosname"
1160 " longer than 15 truncated.\n");
a10faeb2
SF
1161 }
1162 } else if (strnicmp(data, "servern", 7) == 0) {
1163 /* servernetbiosname specified override *SMBSERVER */
1164 if (!value || !*value || (*value == ' ')) {
b6b38f70 1165 cFYI(1, "empty server netbiosname specified");
a10faeb2
SF
1166 } else {
1167 /* last byte, type, is 0x20 for servr type */
50c2f753 1168 memset(vol->target_rfc1001_name, 0x20, 16);
a10faeb2 1169
50c2f753 1170 for (i = 0; i < 15; i++) {
a10faeb2 1171 /* BB are there cases in which a comma can be
50c2f753
SF
1172 valid in this workstation netbios name
1173 (and need special handling)? */
a10faeb2 1174
50c2f753
SF
1175 /* user or mount helper must uppercase
1176 the netbiosname */
1177 if (value[i] == 0)
a10faeb2
SF
1178 break;
1179 else
50c2f753
SF
1180 vol->target_rfc1001_name[i] =
1181 value[i];
a10faeb2
SF
1182 }
1183 /* The string has 16th byte zero still from
1184 set at top of the function */
50c2f753
SF
1185 if ((i == 15) && (value[i] != 0))
1186 printk(KERN_WARNING "CIFS: server net"
1187 "biosname longer than 15 truncated.\n");
1da177e4
LT
1188 }
1189 } else if (strnicmp(data, "credentials", 4) == 0) {
1190 /* ignore */
1191 } else if (strnicmp(data, "version", 3) == 0) {
1192 /* ignore */
50c2f753 1193 } else if (strnicmp(data, "guest", 5) == 0) {
1da177e4 1194 /* ignore */
71a394fa
SF
1195 } else if (strnicmp(data, "rw", 2) == 0) {
1196 /* ignore */
1197 } else if (strnicmp(data, "ro", 2) == 0) {
1198 /* ignore */
edf1ae40
SF
1199 } else if (strnicmp(data, "noblocksend", 11) == 0) {
1200 vol->noblocksnd = 1;
1201 } else if (strnicmp(data, "noautotune", 10) == 0) {
1202 vol->noautotune = 1;
1da177e4
LT
1203 } else if ((strnicmp(data, "suid", 4) == 0) ||
1204 (strnicmp(data, "nosuid", 6) == 0) ||
1205 (strnicmp(data, "exec", 4) == 0) ||
1206 (strnicmp(data, "noexec", 6) == 0) ||
1207 (strnicmp(data, "nodev", 5) == 0) ||
1208 (strnicmp(data, "noauto", 6) == 0) ||
1209 (strnicmp(data, "dev", 3) == 0)) {
1210 /* The mount tool or mount.cifs helper (if present)
50c2f753
SF
1211 uses these opts to set flags, and the flags are read
1212 by the kernel vfs layer before we get here (ie
1213 before read super) so there is no point trying to
1214 parse these options again and set anything and it
1215 is ok to just ignore them */
1da177e4 1216 continue;
1da177e4
LT
1217 } else if (strnicmp(data, "hard", 4) == 0) {
1218 vol->retry = 1;
1219 } else if (strnicmp(data, "soft", 4) == 0) {
1220 vol->retry = 0;
1221 } else if (strnicmp(data, "perm", 4) == 0) {
1222 vol->noperm = 0;
1223 } else if (strnicmp(data, "noperm", 6) == 0) {
1224 vol->noperm = 1;
6a0b4824
SF
1225 } else if (strnicmp(data, "mapchars", 8) == 0) {
1226 vol->remap = 1;
1227 } else if (strnicmp(data, "nomapchars", 10) == 0) {
1228 vol->remap = 0;
50c2f753
SF
1229 } else if (strnicmp(data, "sfu", 3) == 0) {
1230 vol->sfu_emul = 1;
1231 } else if (strnicmp(data, "nosfu", 5) == 0) {
1232 vol->sfu_emul = 0;
2c1b8615
SF
1233 } else if (strnicmp(data, "nodfs", 5) == 0) {
1234 vol->nodfs = 1;
ac67055e
JA
1235 } else if (strnicmp(data, "posixpaths", 10) == 0) {
1236 vol->posix_paths = 1;
1237 } else if (strnicmp(data, "noposixpaths", 12) == 0) {
1238 vol->posix_paths = 0;
c18c842b
SF
1239 } else if (strnicmp(data, "nounix", 6) == 0) {
1240 vol->no_linux_ext = 1;
1241 } else if (strnicmp(data, "nolinux", 7) == 0) {
1242 vol->no_linux_ext = 1;
50c2f753 1243 } else if ((strnicmp(data, "nocase", 6) == 0) ||
a10faeb2 1244 (strnicmp(data, "ignorecase", 10) == 0)) {
50c2f753 1245 vol->nocase = 1;
f636a348
JL
1246 } else if (strnicmp(data, "mand", 4) == 0) {
1247 /* ignore */
1248 } else if (strnicmp(data, "nomand", 6) == 0) {
1249 /* ignore */
1250 } else if (strnicmp(data, "_netdev", 7) == 0) {
1251 /* ignore */
c46fa8ac
SF
1252 } else if (strnicmp(data, "brl", 3) == 0) {
1253 vol->nobrl = 0;
50c2f753 1254 } else if ((strnicmp(data, "nobrl", 5) == 0) ||
1c955187 1255 (strnicmp(data, "nolock", 6) == 0)) {
c46fa8ac 1256 vol->nobrl = 1;
d3485d37
SF
1257 /* turn off mandatory locking in mode
1258 if remote locking is turned off since the
1259 local vfs will do advisory */
50c2f753
SF
1260 if (vol->file_mode ==
1261 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
d3485d37 1262 vol->file_mode = S_IALLUGO;
13a6e42a
SF
1263 } else if (strnicmp(data, "forcemandatorylock", 9) == 0) {
1264 /* will take the shorter form "forcemand" as well */
1265 /* This mount option will force use of mandatory
1266 (DOS/Windows style) byte range locks, instead of
1267 using posix advisory byte range locks, even if the
1268 Unix extensions are available and posix locks would
1269 be supported otherwise. If Unix extensions are not
1270 negotiated this has no effect since mandatory locks
1271 would be used (mandatory locks is all that those
1272 those servers support) */
1273 vol->mand_lock = 1;
1da177e4
LT
1274 } else if (strnicmp(data, "setuids", 7) == 0) {
1275 vol->setuids = 1;
1276 } else if (strnicmp(data, "nosetuids", 9) == 0) {
1277 vol->setuids = 0;
d0a9c078
JL
1278 } else if (strnicmp(data, "dynperm", 7) == 0) {
1279 vol->dynperm = true;
1280 } else if (strnicmp(data, "nodynperm", 9) == 0) {
1281 vol->dynperm = false;
1da177e4
LT
1282 } else if (strnicmp(data, "nohard", 6) == 0) {
1283 vol->retry = 0;
1284 } else if (strnicmp(data, "nosoft", 6) == 0) {
1285 vol->retry = 1;
1286 } else if (strnicmp(data, "nointr", 6) == 0) {
1287 vol->intr = 0;
1288 } else if (strnicmp(data, "intr", 4) == 0) {
1289 vol->intr = 1;
be652445
SF
1290 } else if (strnicmp(data, "nostrictsync", 12) == 0) {
1291 vol->nostrictsync = 1;
1292 } else if (strnicmp(data, "strictsync", 10) == 0) {
1293 vol->nostrictsync = 0;
50c2f753 1294 } else if (strnicmp(data, "serverino", 7) == 0) {
1da177e4 1295 vol->server_ino = 1;
50c2f753 1296 } else if (strnicmp(data, "noserverino", 9) == 0) {
1da177e4 1297 vol->server_ino = 0;
50c2f753 1298 } else if (strnicmp(data, "cifsacl", 7) == 0) {
0a4b92c0
SF
1299 vol->cifs_acl = 1;
1300 } else if (strnicmp(data, "nocifsacl", 9) == 0) {
1301 vol->cifs_acl = 0;
50c2f753 1302 } else if (strnicmp(data, "acl", 3) == 0) {
1da177e4 1303 vol->no_psx_acl = 0;
50c2f753 1304 } else if (strnicmp(data, "noacl", 5) == 0) {
1da177e4 1305 vol->no_psx_acl = 1;
84210e91
SF
1306#ifdef CONFIG_CIFS_EXPERIMENTAL
1307 } else if (strnicmp(data, "locallease", 6) == 0) {
1308 vol->local_lease = 1;
1309#endif
50c2f753 1310 } else if (strnicmp(data, "sign", 4) == 0) {
750d1151 1311 vol->secFlg |= CIFSSEC_MUST_SIGN;
95b1cb90
SF
1312 } else if (strnicmp(data, "seal", 4) == 0) {
1313 /* we do not do the following in secFlags because seal
1314 is a per tree connection (mount) not a per socket
1315 or per-smb connection option in the protocol */
1316 /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1317 vol->seal = 1;
50c2f753 1318 } else if (strnicmp(data, "direct", 6) == 0) {
1da177e4 1319 vol->direct_io = 1;
50c2f753 1320 } else if (strnicmp(data, "forcedirectio", 13) == 0) {
1da177e4 1321 vol->direct_io = 1;
1da177e4 1322 } else if (strnicmp(data, "noac", 4) == 0) {
50c2f753
SF
1323 printk(KERN_WARNING "CIFS: Mount option noac not "
1324 "supported. Instead set "
1325 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
fa1df75d
SJ
1326 } else if (strnicmp(data, "fsc", 3) == 0) {
1327 vol->fsc = true;
1da177e4 1328 } else
50c2f753
SF
1329 printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
1330 data);
1da177e4
LT
1331 }
1332 if (vol->UNC == NULL) {
4523cc30 1333 if (devname == NULL) {
50c2f753
SF
1334 printk(KERN_WARNING "CIFS: Missing UNC name for mount "
1335 "target\n");
1da177e4
LT
1336 return 1;
1337 }
1338 if ((temp_len = strnlen(devname, 300)) < 300) {
50c2f753 1339 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
4523cc30 1340 if (vol->UNC == NULL)
1da177e4 1341 return 1;
50c2f753 1342 strcpy(vol->UNC, devname);
1da177e4
LT
1343 if (strncmp(vol->UNC, "//", 2) == 0) {
1344 vol->UNC[0] = '\\';
1345 vol->UNC[1] = '\\';
1346 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
50c2f753
SF
1347 printk(KERN_WARNING "CIFS: UNC Path does not "
1348 "begin with // or \\\\ \n");
1da177e4
LT
1349 return 1;
1350 }
7c5e628f
IM
1351 value = strpbrk(vol->UNC+2, "/\\");
1352 if (value)
1353 *value = '\\';
1da177e4
LT
1354 } else {
1355 printk(KERN_WARNING "CIFS: UNC name too long\n");
1356 return 1;
1357 }
1358 }
fb8c4b14 1359 if (vol->UNCip == NULL)
1da177e4
LT
1360 vol->UNCip = &vol->UNC[2];
1361
9b9d6b24
JL
1362 if (uid_specified)
1363 vol->override_uid = override_uid;
1364 else if (override_uid == 1)
1365 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1366 "specified with no uid= option.\n");
1367
1368 if (gid_specified)
1369 vol->override_gid = override_gid;
1370 else if (override_gid == 1)
1371 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1372 "specified with no gid= option.\n");
1373
1da177e4
LT
1374 return 0;
1375}
1376
4515148e
JL
1377static bool
1378match_address(struct TCP_Server_Info *server, struct sockaddr *addr)
1379{
1380 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1381 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1382
1383 switch (addr->sa_family) {
1384 case AF_INET:
1385 if (addr4->sin_addr.s_addr !=
1386 server->addr.sockAddr.sin_addr.s_addr)
1387 return false;
1388 if (addr4->sin_port &&
1389 addr4->sin_port != server->addr.sockAddr.sin_port)
1390 return false;
1391 break;
1392 case AF_INET6:
1393 if (!ipv6_addr_equal(&addr6->sin6_addr,
1394 &server->addr.sockAddr6.sin6_addr))
1395 return false;
1396 if (addr6->sin6_scope_id !=
1397 server->addr.sockAddr6.sin6_scope_id)
1398 return false;
1399 if (addr6->sin6_port &&
1400 addr6->sin6_port != server->addr.sockAddr6.sin6_port)
1401 return false;
1402 break;
1403 }
1404
1405 return true;
1406}
1407
daf5b0b6
JL
1408static bool
1409match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1410{
1411 unsigned int secFlags;
1412
1413 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
1414 secFlags = vol->secFlg;
1415 else
1416 secFlags = global_secflags | vol->secFlg;
1417
1418 switch (server->secType) {
1419 case LANMAN:
1420 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
1421 return false;
1422 break;
1423 case NTLMv2:
1424 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
1425 return false;
1426 break;
1427 case NTLM:
1428 if (!(secFlags & CIFSSEC_MAY_NTLM))
1429 return false;
1430 break;
1431 case Kerberos:
1432 if (!(secFlags & CIFSSEC_MAY_KRB5))
1433 return false;
1434 break;
1435 case RawNTLMSSP:
1436 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
1437 return false;
1438 break;
1439 default:
1440 /* shouldn't happen */
1441 return false;
1442 }
1443
1444 /* now check if signing mode is acceptible */
1445 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
1446 (server->secMode & SECMODE_SIGN_REQUIRED))
1447 return false;
1448 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
1449 (server->secMode &
1450 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
1451 return false;
1452
1453 return true;
1454}
1455
e7ddee90 1456static struct TCP_Server_Info *
daf5b0b6 1457cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
1da177e4 1458{
e7ddee90 1459 struct TCP_Server_Info *server;
e7ddee90
JL
1460
1461 write_lock(&cifs_tcp_ses_lock);
4515148e 1462 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
e7ddee90
JL
1463 /*
1464 * the demux thread can exit on its own while still in CifsNew
1465 * so don't accept any sockets in that state. Since the
1466 * tcpStatus never changes back to CifsNew it's safe to check
1467 * for this without a lock.
1468 */
1469 if (server->tcpStatus == CifsNew)
1b20d672 1470 continue;
1da177e4 1471
4515148e
JL
1472 if (!match_address(server, addr))
1473 continue;
1b20d672 1474
daf5b0b6
JL
1475 if (!match_security(server, vol))
1476 continue;
1477
e7ddee90
JL
1478 ++server->srv_count;
1479 write_unlock(&cifs_tcp_ses_lock);
b6b38f70 1480 cFYI(1, "Existing tcp session with server found");
e7ddee90 1481 return server;
1da177e4 1482 }
e7ddee90 1483 write_unlock(&cifs_tcp_ses_lock);
1da177e4
LT
1484 return NULL;
1485}
1b20d672 1486
14fbf50d 1487static void
e7ddee90 1488cifs_put_tcp_session(struct TCP_Server_Info *server)
1da177e4 1489{
e7ddee90 1490 struct task_struct *task;
1b20d672 1491
e7ddee90
JL
1492 write_lock(&cifs_tcp_ses_lock);
1493 if (--server->srv_count > 0) {
1494 write_unlock(&cifs_tcp_ses_lock);
1495 return;
1da177e4 1496 }
1b20d672 1497
e7ddee90
JL
1498 list_del_init(&server->tcp_ses_list);
1499 write_unlock(&cifs_tcp_ses_lock);
dea570e0 1500
e7ddee90
JL
1501 spin_lock(&GlobalMid_Lock);
1502 server->tcpStatus = CifsExiting;
1503 spin_unlock(&GlobalMid_Lock);
dea570e0 1504
488f1d2d
SJ
1505 cifs_fscache_release_client_cookie(server);
1506
e7ddee90
JL
1507 task = xchg(&server->tsk, NULL);
1508 if (task)
1509 force_sig(SIGKILL, task);
1da177e4
LT
1510}
1511
63c038c2
JL
1512static struct TCP_Server_Info *
1513cifs_get_tcp_session(struct smb_vol *volume_info)
1514{
1515 struct TCP_Server_Info *tcp_ses = NULL;
a9ac49d3 1516 struct sockaddr_storage addr;
63c038c2
JL
1517 struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
1518 struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
1519 int rc;
1520
a9ac49d3 1521 memset(&addr, 0, sizeof(struct sockaddr_storage));
63c038c2 1522
b6b38f70 1523 cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip);
63c038c2 1524
1e68b2b2 1525 if (volume_info->UNCip && volume_info->UNC) {
50d97160
JL
1526 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
1527 volume_info->UNCip,
67b7626a 1528 strlen(volume_info->UNCip),
50d97160 1529 volume_info->port);
1e68b2b2 1530 if (!rc) {
63c038c2
JL
1531 /* we failed translating address */
1532 rc = -EINVAL;
1533 goto out_err;
1534 }
63c038c2
JL
1535 } else if (volume_info->UNCip) {
1536 /* BB using ip addr as tcp_ses name to connect to the
1537 DFS root below */
b6b38f70 1538 cERROR(1, "Connecting to DFS root not implemented yet");
63c038c2
JL
1539 rc = -EINVAL;
1540 goto out_err;
1541 } else /* which tcp_sess DFS root would we conect to */ {
b6b38f70
JP
1542 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1543 "unc=//192.168.1.100/public) specified");
63c038c2
JL
1544 rc = -EINVAL;
1545 goto out_err;
1546 }
1547
1548 /* see if we already have a matching tcp_ses */
daf5b0b6 1549 tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr, volume_info);
63c038c2
JL
1550 if (tcp_ses)
1551 return tcp_ses;
1552
1553 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1554 if (!tcp_ses) {
1555 rc = -ENOMEM;
1556 goto out_err;
1557 }
1558
1559 tcp_ses->hostname = extract_hostname(volume_info->UNC);
1560 if (IS_ERR(tcp_ses->hostname)) {
1561 rc = PTR_ERR(tcp_ses->hostname);
1562 goto out_err;
1563 }
1564
1565 tcp_ses->noblocksnd = volume_info->noblocksnd;
1566 tcp_ses->noautotune = volume_info->noautotune;
6a5fa236 1567 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
63c038c2
JL
1568 atomic_set(&tcp_ses->inFlight, 0);
1569 init_waitqueue_head(&tcp_ses->response_q);
1570 init_waitqueue_head(&tcp_ses->request_q);
1571 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1572 mutex_init(&tcp_ses->srv_mutex);
1573 memcpy(tcp_ses->workstation_RFC1001_name,
1574 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1575 memcpy(tcp_ses->server_RFC1001_name,
1576 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1577 tcp_ses->sequence_number = 0;
1578 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1579 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1580
1581 /*
1582 * at this point we are the only ones with the pointer
1583 * to the struct since the kernel thread not created yet
1584 * no need to spinlock this init of tcpStatus or srv_count
1585 */
1586 tcp_ses->tcpStatus = CifsNew;
1587 ++tcp_ses->srv_count;
1588
a9ac49d3 1589 if (addr.ss_family == AF_INET6) {
b6b38f70 1590 cFYI(1, "attempting ipv6 connect");
63c038c2
JL
1591 /* BB should we allow ipv6 on port 139? */
1592 /* other OS never observed in Wild doing 139 with v6 */
1593 memcpy(&tcp_ses->addr.sockAddr6, sin_server6,
1594 sizeof(struct sockaddr_in6));
d5c5605c 1595 rc = ipv6_connect(tcp_ses);
63c038c2
JL
1596 } else {
1597 memcpy(&tcp_ses->addr.sockAddr, sin_server,
1598 sizeof(struct sockaddr_in));
bcf4b106 1599 rc = ipv4_connect(tcp_ses);
63c038c2
JL
1600 }
1601 if (rc < 0) {
b6b38f70 1602 cERROR(1, "Error connecting to socket. Aborting operation");
63c038c2
JL
1603 goto out_err;
1604 }
1605
1606 /*
1607 * since we're in a cifs function already, we know that
1608 * this will succeed. No need for try_module_get().
1609 */
1610 __module_get(THIS_MODULE);
1611 tcp_ses->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread,
1612 tcp_ses, "cifsd");
1613 if (IS_ERR(tcp_ses->tsk)) {
1614 rc = PTR_ERR(tcp_ses->tsk);
b6b38f70 1615 cERROR(1, "error %d create cifsd thread", rc);
63c038c2
JL
1616 module_put(THIS_MODULE);
1617 goto out_err;
1618 }
1619
1620 /* thread spawned, put it on the list */
1621 write_lock(&cifs_tcp_ses_lock);
1622 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1623 write_unlock(&cifs_tcp_ses_lock);
1624
488f1d2d
SJ
1625 cifs_fscache_get_client_cookie(tcp_ses);
1626
63c038c2
JL
1627 return tcp_ses;
1628
1629out_err:
1630 if (tcp_ses) {
8347a5cd
SF
1631 if (!IS_ERR(tcp_ses->hostname))
1632 kfree(tcp_ses->hostname);
63c038c2
JL
1633 if (tcp_ses->ssocket)
1634 sock_release(tcp_ses->ssocket);
1635 kfree(tcp_ses);
1636 }
1637 return ERR_PTR(rc);
1638}
1639
14fbf50d 1640static struct cifsSesInfo *
4ff67b72 1641cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
1da177e4 1642{
14fbf50d 1643 struct cifsSesInfo *ses;
dea570e0 1644
14fbf50d 1645 write_lock(&cifs_tcp_ses_lock);
4ff67b72
JL
1646 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1647 switch (server->secType) {
1648 case Kerberos:
3e4b3e1f 1649 if (vol->cred_uid != ses->cred_uid)
4ff67b72
JL
1650 continue;
1651 break;
1652 default:
1653 /* anything else takes username/password */
1654 if (strncmp(ses->userName, vol->username,
1655 MAX_USERNAME_SIZE))
1656 continue;
1657 if (strlen(vol->username) != 0 &&
24e6cf92 1658 ses->password != NULL &&
fc87a406
JL
1659 strncmp(ses->password,
1660 vol->password ? vol->password : "",
4ff67b72
JL
1661 MAX_PASSWORD_SIZE))
1662 continue;
1663 }
14fbf50d
JL
1664 ++ses->ses_count;
1665 write_unlock(&cifs_tcp_ses_lock);
1666 return ses;
1667 }
1668 write_unlock(&cifs_tcp_ses_lock);
1669 return NULL;
1670}
dea570e0 1671
14fbf50d
JL
1672static void
1673cifs_put_smb_ses(struct cifsSesInfo *ses)
1674{
1675 int xid;
1676 struct TCP_Server_Info *server = ses->server;
dea570e0 1677
36988c76 1678 cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count);
14fbf50d
JL
1679 write_lock(&cifs_tcp_ses_lock);
1680 if (--ses->ses_count > 0) {
1681 write_unlock(&cifs_tcp_ses_lock);
1682 return;
1683 }
dea570e0 1684
14fbf50d
JL
1685 list_del_init(&ses->smb_ses_list);
1686 write_unlock(&cifs_tcp_ses_lock);
dea570e0 1687
14fbf50d
JL
1688 if (ses->status == CifsGood) {
1689 xid = GetXid();
1690 CIFSSMBLogoff(xid, ses);
1691 _FreeXid(xid);
1692 }
1693 sesInfoFree(ses);
1694 cifs_put_tcp_session(server);
1695}
dea570e0 1696
36988c76
JL
1697static struct cifsSesInfo *
1698cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
1699{
1700 int rc = -ENOMEM, xid;
1701 struct cifsSesInfo *ses;
1702
1703 xid = GetXid();
1704
4ff67b72 1705 ses = cifs_find_smb_ses(server, volume_info);
36988c76
JL
1706 if (ses) {
1707 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
1708
36988c76 1709 mutex_lock(&ses->session_mutex);
198b5682
JL
1710 rc = cifs_negotiate_protocol(xid, ses);
1711 if (rc) {
1712 mutex_unlock(&ses->session_mutex);
1713 /* problem -- put our ses reference */
1714 cifs_put_smb_ses(ses);
1715 FreeXid(xid);
1716 return ERR_PTR(rc);
1717 }
36988c76
JL
1718 if (ses->need_reconnect) {
1719 cFYI(1, "Session needs reconnect");
1720 rc = cifs_setup_session(xid, ses,
1721 volume_info->local_nls);
1722 if (rc) {
1723 mutex_unlock(&ses->session_mutex);
1724 /* problem -- put our reference */
1725 cifs_put_smb_ses(ses);
1726 FreeXid(xid);
1727 return ERR_PTR(rc);
1728 }
1729 }
1730 mutex_unlock(&ses->session_mutex);
460cf341
JL
1731
1732 /* existing SMB ses has a server reference already */
1733 cifs_put_tcp_session(server);
36988c76
JL
1734 FreeXid(xid);
1735 return ses;
1736 }
1737
1738 cFYI(1, "Existing smb sess not found");
1739 ses = sesInfoAlloc();
1740 if (ses == NULL)
1741 goto get_ses_fail;
1742
2b149f11
SP
1743 ses->tilen = 0;
1744 ses->tiblob = NULL;
36988c76
JL
1745 /* new SMB session uses our server ref */
1746 ses->server = server;
1747 if (server->addr.sockAddr6.sin6_family == AF_INET6)
1748 sprintf(ses->serverName, "%pI6",
1749 &server->addr.sockAddr6.sin6_addr);
1750 else
1751 sprintf(ses->serverName, "%pI4",
1752 &server->addr.sockAddr.sin_addr.s_addr);
1753
1754 if (volume_info->username)
1755 strncpy(ses->userName, volume_info->username,
1756 MAX_USERNAME_SIZE);
1757
1758 /* volume_info->password freed at unmount */
1759 if (volume_info->password) {
1760 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
1761 if (!ses->password)
1762 goto get_ses_fail;
1763 }
1764 if (volume_info->domainname) {
1765 int len = strlen(volume_info->domainname);
1766 ses->domainName = kmalloc(len + 1, GFP_KERNEL);
1767 if (ses->domainName)
1768 strcpy(ses->domainName, volume_info->domainname);
1769 }
3e4b3e1f 1770 ses->cred_uid = volume_info->cred_uid;
36988c76
JL
1771 ses->linux_uid = volume_info->linux_uid;
1772 ses->overrideSecFlg = volume_info->secFlg;
1773
1774 mutex_lock(&ses->session_mutex);
198b5682
JL
1775 rc = cifs_negotiate_protocol(xid, ses);
1776 if (!rc)
1777 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
36988c76 1778 mutex_unlock(&ses->session_mutex);
c8e56f1f 1779 if (rc)
36988c76
JL
1780 goto get_ses_fail;
1781
1782 /* success, put it on the list */
1783 write_lock(&cifs_tcp_ses_lock);
1784 list_add(&ses->smb_ses_list, &server->smb_ses_list);
1785 write_unlock(&cifs_tcp_ses_lock);
1786
1787 FreeXid(xid);
1788 return ses;
1789
1790get_ses_fail:
1791 sesInfoFree(ses);
1792 FreeXid(xid);
1793 return ERR_PTR(rc);
1794}
1795
f1987b44
JL
1796static struct cifsTconInfo *
1797cifs_find_tcon(struct cifsSesInfo *ses, const char *unc)
1798{
1799 struct list_head *tmp;
1800 struct cifsTconInfo *tcon;
1801
1802 write_lock(&cifs_tcp_ses_lock);
1803 list_for_each(tmp, &ses->tcon_list) {
1804 tcon = list_entry(tmp, struct cifsTconInfo, tcon_list);
1805 if (tcon->tidStatus == CifsExiting)
1806 continue;
1807 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
dea570e0
SF
1808 continue;
1809
f1987b44
JL
1810 ++tcon->tc_count;
1811 write_unlock(&cifs_tcp_ses_lock);
dea570e0 1812 return tcon;
1da177e4 1813 }
f1987b44 1814 write_unlock(&cifs_tcp_ses_lock);
1da177e4
LT
1815 return NULL;
1816}
1817
f1987b44
JL
1818static void
1819cifs_put_tcon(struct cifsTconInfo *tcon)
1820{
1821 int xid;
1822 struct cifsSesInfo *ses = tcon->ses;
1823
d00c28de 1824 cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count);
f1987b44
JL
1825 write_lock(&cifs_tcp_ses_lock);
1826 if (--tcon->tc_count > 0) {
1827 write_unlock(&cifs_tcp_ses_lock);
1828 return;
1829 }
1830
1831 list_del_init(&tcon->tcon_list);
1832 write_unlock(&cifs_tcp_ses_lock);
1833
1834 xid = GetXid();
1835 CIFSSMBTDis(xid, tcon);
1836 _FreeXid(xid);
1837
d03382ce 1838 cifs_fscache_release_super_cookie(tcon);
9f841593 1839 tconInfoFree(tcon);
f1987b44
JL
1840 cifs_put_smb_ses(ses);
1841}
1842
d00c28de
JL
1843static struct cifsTconInfo *
1844cifs_get_tcon(struct cifsSesInfo *ses, struct smb_vol *volume_info)
1845{
1846 int rc, xid;
1847 struct cifsTconInfo *tcon;
1848
1849 tcon = cifs_find_tcon(ses, volume_info->UNC);
1850 if (tcon) {
1851 cFYI(1, "Found match on UNC path");
1852 /* existing tcon already has a reference */
1853 cifs_put_smb_ses(ses);
1854 if (tcon->seal != volume_info->seal)
1855 cERROR(1, "transport encryption setting "
1856 "conflicts with existing tid");
1857 return tcon;
1858 }
1859
1860 tcon = tconInfoAlloc();
1861 if (tcon == NULL) {
1862 rc = -ENOMEM;
1863 goto out_fail;
1864 }
1865
1866 tcon->ses = ses;
1867 if (volume_info->password) {
1868 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
1869 if (!tcon->password) {
1870 rc = -ENOMEM;
1871 goto out_fail;
1872 }
1873 }
1874
1875 if (strchr(volume_info->UNC + 3, '\\') == NULL
1876 && strchr(volume_info->UNC + 3, '/') == NULL) {
1877 cERROR(1, "Missing share name");
1878 rc = -ENODEV;
1879 goto out_fail;
1880 }
1881
1882 /* BB Do we need to wrap session_mutex around
1883 * this TCon call and Unix SetFS as
1884 * we do on SessSetup and reconnect? */
1885 xid = GetXid();
1886 rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls);
1887 FreeXid(xid);
1888 cFYI(1, "CIFS Tcon rc = %d", rc);
1889 if (rc)
1890 goto out_fail;
1891
1892 if (volume_info->nodfs) {
1893 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
1894 cFYI(1, "DFS disabled (%d)", tcon->Flags);
1895 }
1896 tcon->seal = volume_info->seal;
1897 /* we can have only one retry value for a connection
1898 to a share so for resources mounted more than once
1899 to the same server share the last value passed in
1900 for the retry flag is used */
1901 tcon->retry = volume_info->retry;
1902 tcon->nocase = volume_info->nocase;
1903 tcon->local_lease = volume_info->local_lease;
1904
1905 write_lock(&cifs_tcp_ses_lock);
1906 list_add(&tcon->tcon_list, &ses->tcon_list);
1907 write_unlock(&cifs_tcp_ses_lock);
1908
d03382ce
SJ
1909 cifs_fscache_get_super_cookie(tcon);
1910
d00c28de
JL
1911 return tcon;
1912
1913out_fail:
1914 tconInfoFree(tcon);
1915 return ERR_PTR(rc);
1916}
1917
1918
1da177e4 1919int
50c2f753
SF
1920get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
1921 const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
366781c1 1922 struct dfs_info3_param **preferrals, int remap)
1da177e4
LT
1923{
1924 char *temp_unc;
1925 int rc = 0;
1926
1927 *pnum_referrals = 0;
366781c1 1928 *preferrals = NULL;
1da177e4
LT
1929
1930 if (pSesInfo->ipc_tid == 0) {
1931 temp_unc = kmalloc(2 /* for slashes */ +
50c2f753
SF
1932 strnlen(pSesInfo->serverName,
1933 SERVER_NAME_LEN_WITH_NULL * 2)
1da177e4
LT
1934 + 1 + 4 /* slash IPC$ */ + 2,
1935 GFP_KERNEL);
1936 if (temp_unc == NULL)
1937 return -ENOMEM;
1938 temp_unc[0] = '\\';
1939 temp_unc[1] = '\\';
1940 strcpy(temp_unc + 2, pSesInfo->serverName);
1941 strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
1942 rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
b6b38f70 1943 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid);
1da177e4
LT
1944 kfree(temp_unc);
1945 }
1946 if (rc == 0)
c2cf07d5 1947 rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
737b758c 1948 pnum_referrals, nls_codepage, remap);
366781c1
SF
1949 /* BB map targetUNCs to dfs_info3 structures, here or
1950 in CIFSGetDFSRefer BB */
1da177e4
LT
1951
1952 return rc;
1953}
1954
09e50d55
JL
1955#ifdef CONFIG_DEBUG_LOCK_ALLOC
1956static struct lock_class_key cifs_key[2];
1957static struct lock_class_key cifs_slock_key[2];
1958
1959static inline void
1960cifs_reclassify_socket4(struct socket *sock)
1961{
1962 struct sock *sk = sock->sk;
1963 BUG_ON(sock_owned_by_user(sk));
1964 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
1965 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
1966}
1967
1968static inline void
1969cifs_reclassify_socket6(struct socket *sock)
1970{
1971 struct sock *sk = sock->sk;
1972 BUG_ON(sock_owned_by_user(sk));
1973 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
1974 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
1975}
1976#else
1977static inline void
1978cifs_reclassify_socket4(struct socket *sock)
1979{
1980}
1981
1982static inline void
1983cifs_reclassify_socket6(struct socket *sock)
1984{
1985}
1986#endif
1987
1da177e4 1988/* See RFC1001 section 14 on representation of Netbios names */
50c2f753 1989static void rfc1002mangle(char *target, char *source, unsigned int length)
1da177e4 1990{
50c2f753 1991 unsigned int i, j;
1da177e4 1992
50c2f753 1993 for (i = 0, j = 0; i < (length); i++) {
1da177e4
LT
1994 /* mask a nibble at a time and encode */
1995 target[j] = 'A' + (0x0F & (source[i] >> 4));
1996 target[j+1] = 'A' + (0x0F & source[i]);
50c2f753 1997 j += 2;
1da177e4
LT
1998 }
1999
2000}
2001
2002
2003static int
bcf4b106 2004ipv4_connect(struct TCP_Server_Info *server)
1da177e4
LT
2005{
2006 int rc = 0;
6a5fa236 2007 int val;
bcf4b106 2008 bool connected = false;
1da177e4 2009 __be16 orig_port = 0;
bcf4b106 2010 struct socket *socket = server->ssocket;
1da177e4 2011
bcf4b106 2012 if (socket == NULL) {
50c2f753 2013 rc = sock_create_kern(PF_INET, SOCK_STREAM,
bcf4b106 2014 IPPROTO_TCP, &socket);
1da177e4 2015 if (rc < 0) {
b6b38f70 2016 cERROR(1, "Error %d creating socket", rc);
1da177e4 2017 return rc;
1da177e4 2018 }
bcf4b106
JL
2019
2020 /* BB other socket options to set KEEPALIVE, NODELAY? */
b6b38f70 2021 cFYI(1, "Socket created");
bcf4b106
JL
2022 server->ssocket = socket;
2023 socket->sk->sk_allocation = GFP_NOFS;
2024 cifs_reclassify_socket4(socket);
1da177e4
LT
2025 }
2026
bcf4b106
JL
2027 /* user overrode default port */
2028 if (server->addr.sockAddr.sin_port) {
2029 rc = socket->ops->connect(socket, (struct sockaddr *)
2030 &server->addr.sockAddr,
2031 sizeof(struct sockaddr_in), 0);
1da177e4 2032 if (rc >= 0)
bcf4b106 2033 connected = true;
50c2f753 2034 }
1da177e4 2035
fb8c4b14 2036 if (!connected) {
50c2f753 2037 /* save original port so we can retry user specified port
1da177e4 2038 later if fall back ports fail this time */
bcf4b106 2039 orig_port = server->addr.sockAddr.sin_port;
1da177e4
LT
2040
2041 /* do not retry on the same port we just failed on */
bcf4b106
JL
2042 if (server->addr.sockAddr.sin_port != htons(CIFS_PORT)) {
2043 server->addr.sockAddr.sin_port = htons(CIFS_PORT);
2044 rc = socket->ops->connect(socket,
2045 (struct sockaddr *)
2046 &server->addr.sockAddr,
2047 sizeof(struct sockaddr_in), 0);
1da177e4 2048 if (rc >= 0)
bcf4b106 2049 connected = true;
1da177e4
LT
2050 }
2051 }
2052 if (!connected) {
bcf4b106
JL
2053 server->addr.sockAddr.sin_port = htons(RFC1001_PORT);
2054 rc = socket->ops->connect(socket, (struct sockaddr *)
2055 &server->addr.sockAddr,
6345a3a8 2056 sizeof(struct sockaddr_in), 0);
50c2f753 2057 if (rc >= 0)
bcf4b106 2058 connected = true;
1da177e4
LT
2059 }
2060
2061 /* give up here - unless we want to retry on different
2062 protocol families some day */
2063 if (!connected) {
fb8c4b14 2064 if (orig_port)
bcf4b106 2065 server->addr.sockAddr.sin_port = orig_port;
b6b38f70 2066 cFYI(1, "Error %d connecting to server via ipv4", rc);
bcf4b106
JL
2067 sock_release(socket);
2068 server->ssocket = NULL;
1da177e4
LT
2069 return rc;
2070 }
bcf4b106
JL
2071
2072
2073 /*
2074 * Eventually check for other socket options to change from
2075 * the default. sock_setsockopt not used because it expects
2076 * user space buffer
2077 */
2078 socket->sk->sk_rcvtimeo = 7 * HZ;
da505c38 2079 socket->sk->sk_sndtimeo = 5 * HZ;
edf1ae40 2080
b387eaeb 2081 /* make the bufsizes depend on wsize/rsize and max requests */
bcf4b106
JL
2082 if (server->noautotune) {
2083 if (socket->sk->sk_sndbuf < (200 * 1024))
2084 socket->sk->sk_sndbuf = 200 * 1024;
2085 if (socket->sk->sk_rcvbuf < (140 * 1024))
2086 socket->sk->sk_rcvbuf = 140 * 1024;
edf1ae40 2087 }
1da177e4 2088
6a5fa236
SF
2089 if (server->tcp_nodelay) {
2090 val = 1;
2091 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2092 (char *)&val, sizeof(val));
2093 if (rc)
b6b38f70 2094 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
6a5fa236
SF
2095 }
2096
b6b38f70 2097 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
bcf4b106 2098 socket->sk->sk_sndbuf,
b6b38f70 2099 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
bcf4b106 2100
1da177e4 2101 /* send RFC1001 sessinit */
bcf4b106 2102 if (server->addr.sockAddr.sin_port == htons(RFC1001_PORT)) {
1da177e4 2103 /* some servers require RFC1001 sessinit before sending
50c2f753 2104 negprot - BB check reconnection in case where second
1da177e4 2105 sessinit is sent but no second negprot */
50c2f753
SF
2106 struct rfc1002_session_packet *ses_init_buf;
2107 struct smb_hdr *smb_buf;
2108 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2109 GFP_KERNEL);
fb8c4b14 2110 if (ses_init_buf) {
1da177e4 2111 ses_init_buf->trailer.session_req.called_len = 32;
bcf4b106
JL
2112 if (server->server_RFC1001_name &&
2113 server->server_RFC1001_name[0] != 0)
8ecaf67a
JL
2114 rfc1002mangle(ses_init_buf->trailer.
2115 session_req.called_name,
bcf4b106 2116 server->server_RFC1001_name,
8ecaf67a 2117 RFC1001_NAME_LEN_WITH_NULL);
bcf4b106 2118 else
8ecaf67a
JL
2119 rfc1002mangle(ses_init_buf->trailer.
2120 session_req.called_name,
2121 DEFAULT_CIFS_CALLED_NAME,
2122 RFC1001_NAME_LEN_WITH_NULL);
a10faeb2 2123
1da177e4 2124 ses_init_buf->trailer.session_req.calling_len = 32;
bcf4b106 2125
1da177e4
LT
2126 /* calling name ends in null (byte 16) from old smb
2127 convention. */
bcf4b106
JL
2128 if (server->workstation_RFC1001_name &&
2129 server->workstation_RFC1001_name[0] != 0)
8ecaf67a
JL
2130 rfc1002mangle(ses_init_buf->trailer.
2131 session_req.calling_name,
bcf4b106 2132 server->workstation_RFC1001_name,
8ecaf67a 2133 RFC1001_NAME_LEN_WITH_NULL);
bcf4b106 2134 else
8ecaf67a
JL
2135 rfc1002mangle(ses_init_buf->trailer.
2136 session_req.calling_name,
2137 "LINUX_CIFS_CLNT",
2138 RFC1001_NAME_LEN_WITH_NULL);
bcf4b106 2139
1da177e4
LT
2140 ses_init_buf->trailer.session_req.scope1 = 0;
2141 ses_init_buf->trailer.session_req.scope2 = 0;
2142 smb_buf = (struct smb_hdr *)ses_init_buf;
2143 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2144 smb_buf->smb_buf_length = 0x81000044;
0496e02d 2145 rc = smb_send(server, smb_buf, 0x44);
1da177e4 2146 kfree(ses_init_buf);
50c2f753 2147 msleep(1); /* RFC1001 layer in at least one server
083d3a2c
SF
2148 requires very short break before negprot
2149 presumably because not expecting negprot
2150 to follow so fast. This is a simple
50c2f753 2151 solution that works without
083d3a2c
SF
2152 complicating the code and causes no
2153 significant slowing down on mount
2154 for everyone else */
1da177e4 2155 }
50c2f753 2156 /* else the negprot may still work without this
1da177e4 2157 even though malloc failed */
50c2f753 2158
1da177e4 2159 }
50c2f753 2160
1da177e4
LT
2161 return rc;
2162}
2163
2164static int
d5c5605c 2165ipv6_connect(struct TCP_Server_Info *server)
1da177e4
LT
2166{
2167 int rc = 0;
6a5fa236 2168 int val;
d5c5605c 2169 bool connected = false;
1da177e4 2170 __be16 orig_port = 0;
d5c5605c 2171 struct socket *socket = server->ssocket;
1da177e4 2172
d5c5605c 2173 if (socket == NULL) {
50c2f753 2174 rc = sock_create_kern(PF_INET6, SOCK_STREAM,
d5c5605c 2175 IPPROTO_TCP, &socket);
1da177e4 2176 if (rc < 0) {
b6b38f70 2177 cERROR(1, "Error %d creating ipv6 socket", rc);
d5c5605c 2178 socket = NULL;
1da177e4 2179 return rc;
1da177e4 2180 }
1da177e4 2181
d5c5605c 2182 /* BB other socket options to set KEEPALIVE, NODELAY? */
b6b38f70 2183 cFYI(1, "ipv6 Socket created");
d5c5605c
JL
2184 server->ssocket = socket;
2185 socket->sk->sk_allocation = GFP_NOFS;
2186 cifs_reclassify_socket6(socket);
2187 }
1da177e4 2188
d5c5605c
JL
2189 /* user overrode default port */
2190 if (server->addr.sockAddr6.sin6_port) {
2191 rc = socket->ops->connect(socket,
2192 (struct sockaddr *) &server->addr.sockAddr6,
6345a3a8 2193 sizeof(struct sockaddr_in6), 0);
1da177e4 2194 if (rc >= 0)
d5c5605c 2195 connected = true;
50c2f753 2196 }
1da177e4 2197
fb8c4b14 2198 if (!connected) {
50c2f753 2199 /* save original port so we can retry user specified port
1da177e4
LT
2200 later if fall back ports fail this time */
2201
d5c5605c 2202 orig_port = server->addr.sockAddr6.sin6_port;
1da177e4 2203 /* do not retry on the same port we just failed on */
d5c5605c
JL
2204 if (server->addr.sockAddr6.sin6_port != htons(CIFS_PORT)) {
2205 server->addr.sockAddr6.sin6_port = htons(CIFS_PORT);
2206 rc = socket->ops->connect(socket, (struct sockaddr *)
2207 &server->addr.sockAddr6,
6345a3a8 2208 sizeof(struct sockaddr_in6), 0);
1da177e4 2209 if (rc >= 0)
d5c5605c 2210 connected = true;
1da177e4
LT
2211 }
2212 }
2213 if (!connected) {
d5c5605c
JL
2214 server->addr.sockAddr6.sin6_port = htons(RFC1001_PORT);
2215 rc = socket->ops->connect(socket, (struct sockaddr *)
2216 &server->addr.sockAddr6,
2217 sizeof(struct sockaddr_in6), 0);
50c2f753 2218 if (rc >= 0)
d5c5605c 2219 connected = true;
1da177e4
LT
2220 }
2221
2222 /* give up here - unless we want to retry on different
2223 protocol families some day */
2224 if (!connected) {
fb8c4b14 2225 if (orig_port)
d5c5605c 2226 server->addr.sockAddr6.sin6_port = orig_port;
b6b38f70 2227 cFYI(1, "Error %d connecting to server via ipv6", rc);
d5c5605c
JL
2228 sock_release(socket);
2229 server->ssocket = NULL;
1da177e4
LT
2230 return rc;
2231 }
edf1ae40 2232
d5c5605c
JL
2233 /*
2234 * Eventually check for other socket options to change from
2235 * the default. sock_setsockopt not used because it expects
2236 * user space buffer
2237 */
2238 socket->sk->sk_rcvtimeo = 7 * HZ;
da505c38 2239 socket->sk->sk_sndtimeo = 5 * HZ;
6a5fa236
SF
2240
2241 if (server->tcp_nodelay) {
2242 val = 1;
2243 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2244 (char *)&val, sizeof(val));
2245 if (rc)
b6b38f70 2246 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
6a5fa236
SF
2247 }
2248
d5c5605c 2249 server->ssocket = socket;
50c2f753 2250
1da177e4
LT
2251 return rc;
2252}
2253
50c2f753
SF
2254void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
2255 struct super_block *sb, struct smb_vol *vol_info)
8af18971
SF
2256{
2257 /* if we are reconnecting then should we check to see if
2258 * any requested capabilities changed locally e.g. via
2259 * remount but we can not do much about it here
2260 * if they have (even if we could detect it by the following)
2261 * Perhaps we could add a backpointer to array of sb from tcon
2262 * or if we change to make all sb to same share the same
2263 * sb as NFS - then we only have one backpointer to sb.
2264 * What if we wanted to mount the server share twice once with
2265 * and once without posixacls or posix paths? */
2266 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
50c2f753 2267
c18c842b
SF
2268 if (vol_info && vol_info->no_linux_ext) {
2269 tcon->fsUnixInfo.Capability = 0;
2270 tcon->unix_ext = 0; /* Unix Extensions disabled */
b6b38f70 2271 cFYI(1, "Linux protocol extensions disabled");
c18c842b
SF
2272 return;
2273 } else if (vol_info)
2274 tcon->unix_ext = 1; /* Unix Extensions supported */
2275
2276 if (tcon->unix_ext == 0) {
b6b38f70 2277 cFYI(1, "Unix extensions disabled so not set on reconnect");
c18c842b
SF
2278 return;
2279 }
50c2f753 2280
fb8c4b14 2281 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
8af18971 2282 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
50c2f753 2283
8af18971
SF
2284 /* check for reconnect case in which we do not
2285 want to change the mount behavior if we can avoid it */
fb8c4b14 2286 if (vol_info == NULL) {
50c2f753 2287 /* turn off POSIX ACL and PATHNAMES if not set
8af18971
SF
2288 originally at mount time */
2289 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2290 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
11b6d645
IM
2291 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2292 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
b6b38f70 2293 cERROR(1, "POSIXPATH support change");
8af18971 2294 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
11b6d645 2295 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
b6b38f70
JP
2296 cERROR(1, "possible reconnect error");
2297 cERROR(1, "server disabled POSIX path support");
11b6d645 2298 }
8af18971 2299 }
50c2f753 2300
8af18971 2301 cap &= CIFS_UNIX_CAP_MASK;
75865f8c 2302 if (vol_info && vol_info->no_psx_acl)
8af18971 2303 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
75865f8c 2304 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
b6b38f70 2305 cFYI(1, "negotiated posix acl support");
fb8c4b14 2306 if (sb)
8af18971
SF
2307 sb->s_flags |= MS_POSIXACL;
2308 }
2309
75865f8c 2310 if (vol_info && vol_info->posix_paths == 0)
8af18971 2311 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
75865f8c 2312 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
b6b38f70 2313 cFYI(1, "negotiate posix pathnames");
75865f8c 2314 if (sb)
50c2f753 2315 CIFS_SB(sb)->mnt_cifs_flags |=
8af18971
SF
2316 CIFS_MOUNT_POSIX_PATHS;
2317 }
50c2f753 2318
984acfe1
SF
2319 /* We might be setting the path sep back to a different
2320 form if we are reconnecting and the server switched its
50c2f753 2321 posix path capability for this share */
75865f8c 2322 if (sb && (CIFS_SB(sb)->prepathlen > 0))
984acfe1 2323 CIFS_SB(sb)->prepath[0] = CIFS_DIR_SEP(CIFS_SB(sb));
75865f8c
SF
2324
2325 if (sb && (CIFS_SB(sb)->rsize > 127 * 1024)) {
2326 if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) {
2327 CIFS_SB(sb)->rsize = 127 * 1024;
b6b38f70 2328 cFYI(DBG2, "larger reads not supported by srv");
75865f8c
SF
2329 }
2330 }
50c2f753
SF
2331
2332
b6b38f70 2333 cFYI(1, "Negotiate caps 0x%x", (int)cap);
8af18971 2334#ifdef CONFIG_CIFS_DEBUG2
75865f8c 2335 if (cap & CIFS_UNIX_FCNTL_CAP)
b6b38f70 2336 cFYI(1, "FCNTL cap");
75865f8c 2337 if (cap & CIFS_UNIX_EXTATTR_CAP)
b6b38f70 2338 cFYI(1, "EXTATTR cap");
75865f8c 2339 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
b6b38f70 2340 cFYI(1, "POSIX path cap");
75865f8c 2341 if (cap & CIFS_UNIX_XATTR_CAP)
b6b38f70 2342 cFYI(1, "XATTR cap");
75865f8c 2343 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
b6b38f70 2344 cFYI(1, "POSIX ACL cap");
75865f8c 2345 if (cap & CIFS_UNIX_LARGE_READ_CAP)
b6b38f70 2346 cFYI(1, "very large read cap");
75865f8c 2347 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
b6b38f70 2348 cFYI(1, "very large write cap");
8af18971
SF
2349#endif /* CIFS_DEBUG2 */
2350 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
442aa310 2351 if (vol_info == NULL) {
b6b38f70 2352 cFYI(1, "resetting capabilities failed");
442aa310 2353 } else
b6b38f70 2354 cERROR(1, "Negotiating Unix capabilities "
5a44b319
SF
2355 "with the server failed. Consider "
2356 "mounting with the Unix Extensions\n"
2357 "disabled, if problems are found, "
2358 "by specifying the nounix mount "
b6b38f70 2359 "option.");
5a44b319 2360
8af18971
SF
2361 }
2362 }
2363}
2364
03a143c9
SF
2365static void
2366convert_delimiter(char *path, char delim)
2367{
2368 int i;
c2d68ea6 2369 char old_delim;
03a143c9
SF
2370
2371 if (path == NULL)
2372 return;
2373
582d21e5 2374 if (delim == '/')
c2d68ea6
SF
2375 old_delim = '\\';
2376 else
2377 old_delim = '/';
2378
03a143c9 2379 for (i = 0; path[i] != '\0'; i++) {
c2d68ea6 2380 if (path[i] == old_delim)
03a143c9
SF
2381 path[i] = delim;
2382 }
2383}
2384
3b795210
SF
2385static void setup_cifs_sb(struct smb_vol *pvolume_info,
2386 struct cifs_sb_info *cifs_sb)
b1c8d2b4 2387{
3b795210 2388 if (pvolume_info->rsize > CIFSMaxBufSize) {
b6b38f70
JP
2389 cERROR(1, "rsize %d too large, using MaxBufSize",
2390 pvolume_info->rsize);
3b795210
SF
2391 cifs_sb->rsize = CIFSMaxBufSize;
2392 } else if ((pvolume_info->rsize) &&
2393 (pvolume_info->rsize <= CIFSMaxBufSize))
2394 cifs_sb->rsize = pvolume_info->rsize;
2395 else /* default */
2396 cifs_sb->rsize = CIFSMaxBufSize;
2397
2398 if (pvolume_info->wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
b6b38f70
JP
2399 cERROR(1, "wsize %d too large, using 4096 instead",
2400 pvolume_info->wsize);
3b795210
SF
2401 cifs_sb->wsize = 4096;
2402 } else if (pvolume_info->wsize)
2403 cifs_sb->wsize = pvolume_info->wsize;
2404 else
2405 cifs_sb->wsize = min_t(const int,
2406 PAGEVEC_SIZE * PAGE_CACHE_SIZE,
2407 127*1024);
2408 /* old default of CIFSMaxBufSize was too small now
2409 that SMB Write2 can send multiple pages in kvec.
2410 RFC1001 does not describe what happens when frame
2411 bigger than 128K is sent so use that as max in
2412 conjunction with 52K kvec constraint on arch with 4K
2413 page size */
2414
2415 if (cifs_sb->rsize < 2048) {
2416 cifs_sb->rsize = 2048;
2417 /* Windows ME may prefer this */
b6b38f70 2418 cFYI(1, "readsize set to minimum: 2048");
3b795210
SF
2419 }
2420 /* calculate prepath */
2421 cifs_sb->prepath = pvolume_info->prepath;
2422 if (cifs_sb->prepath) {
2423 cifs_sb->prepathlen = strlen(cifs_sb->prepath);
2424 /* we can not convert the / to \ in the path
2425 separators in the prefixpath yet because we do not
2426 know (until reset_cifs_unix_caps is called later)
2427 whether POSIX PATH CAP is available. We normalize
2428 the / to \ after reset_cifs_unix_caps is called */
2429 pvolume_info->prepath = NULL;
2430 } else
2431 cifs_sb->prepathlen = 0;
2432 cifs_sb->mnt_uid = pvolume_info->linux_uid;
2433 cifs_sb->mnt_gid = pvolume_info->linux_gid;
2434 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
2435 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
b6b38f70
JP
2436 cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2437 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3b795210
SF
2438
2439 if (pvolume_info->noperm)
2440 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
2441 if (pvolume_info->setuids)
2442 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
2443 if (pvolume_info->server_ino)
2444 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
2445 if (pvolume_info->remap)
2446 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
2447 if (pvolume_info->no_xattr)
2448 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
2449 if (pvolume_info->sfu_emul)
2450 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
2451 if (pvolume_info->nobrl)
2452 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
be652445 2453 if (pvolume_info->nostrictsync)
4717bed6 2454 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
13a6e42a
SF
2455 if (pvolume_info->mand_lock)
2456 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3b795210
SF
2457 if (pvolume_info->cifs_acl)
2458 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
2459 if (pvolume_info->override_uid)
2460 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
2461 if (pvolume_info->override_gid)
2462 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
2463 if (pvolume_info->dynperm)
2464 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
fa1df75d
SJ
2465 if (pvolume_info->fsc)
2466 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3b795210 2467 if (pvolume_info->direct_io) {
b6b38f70 2468 cFYI(1, "mounting share using direct i/o");
3b795210
SF
2469 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
2470 }
2471
2472 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
b6b38f70
JP
2473 cERROR(1, "mount option dynperm ignored if cifsacl "
2474 "mount option supported");
b1c8d2b4
JL
2475}
2476
e4cce94c
IM
2477static int
2478is_path_accessible(int xid, struct cifsTconInfo *tcon,
2479 struct cifs_sb_info *cifs_sb, const char *full_path)
2480{
2481 int rc;
e4cce94c
IM
2482 FILE_ALL_INFO *pfile_info;
2483
e4cce94c
IM
2484 pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
2485 if (pfile_info == NULL)
2486 return -ENOMEM;
2487
2488 rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
2489 0 /* not legacy */, cifs_sb->local_nls,
2490 cifs_sb->mnt_cifs_flags &
2491 CIFS_MOUNT_MAP_SPECIAL_CHR);
2492 kfree(pfile_info);
2493 return rc;
2494}
2495
1bfe73c2
IM
2496static void
2497cleanup_volume_info(struct smb_vol **pvolume_info)
2498{
2499 struct smb_vol *volume_info;
2500
ad6cca6d 2501 if (!pvolume_info || !*pvolume_info)
1bfe73c2
IM
2502 return;
2503
2504 volume_info = *pvolume_info;
2505 kzfree(volume_info->password);
2506 kfree(volume_info->UNC);
2507 kfree(volume_info->prepath);
2508 kfree(volume_info);
2509 *pvolume_info = NULL;
2510 return;
2511}
2512
2d6d589d 2513#ifdef CONFIG_CIFS_DFS_UPCALL
1bfe73c2
IM
2514/* build_path_to_root returns full path to root when
2515 * we do not have an exiting connection (tcon) */
2516static char *
2517build_unc_path_to_root(const struct smb_vol *volume_info,
2518 const struct cifs_sb_info *cifs_sb)
2519{
2520 char *full_path;
2521
2522 int unc_len = strnlen(volume_info->UNC, MAX_TREE_SIZE + 1);
2523 full_path = kmalloc(unc_len + cifs_sb->prepathlen + 1, GFP_KERNEL);
2524 if (full_path == NULL)
2525 return ERR_PTR(-ENOMEM);
2526
2527 strncpy(full_path, volume_info->UNC, unc_len);
2528 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) {
2529 int i;
2530 for (i = 0; i < unc_len; i++) {
2531 if (full_path[i] == '\\')
2532 full_path[i] = '/';
2533 }
2534 }
2535
2536 if (cifs_sb->prepathlen)
2537 strncpy(full_path + unc_len, cifs_sb->prepath,
2538 cifs_sb->prepathlen);
2539
2540 full_path[unc_len + cifs_sb->prepathlen] = 0; /* add trailing null */
2541 return full_path;
2542}
2d6d589d 2543#endif
1bfe73c2 2544
1da177e4
LT
2545int
2546cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
1bfe73c2 2547 char *mount_data_global, const char *devname)
1da177e4 2548{
a2934c7b 2549 int rc;
1da177e4 2550 int xid;
7586b765 2551 struct smb_vol *volume_info;
a2934c7b
JL
2552 struct cifsSesInfo *pSesInfo;
2553 struct cifsTconInfo *tcon;
2554 struct TCP_Server_Info *srvTcp;
e4cce94c 2555 char *full_path;
2d6d589d
SF
2556 char *mount_data = mount_data_global;
2557#ifdef CONFIG_CIFS_DFS_UPCALL
1bfe73c2
IM
2558 struct dfs_info3_param *referrals = NULL;
2559 unsigned int num_referrals = 0;
5c2503a8 2560 int referral_walks_count = 0;
1bfe73c2 2561try_mount_again:
2d6d589d 2562#endif
a2934c7b
JL
2563 rc = 0;
2564 tcon = NULL;
2565 pSesInfo = NULL;
2566 srvTcp = NULL;
1bfe73c2 2567 full_path = NULL;
1da177e4
LT
2568
2569 xid = GetXid();
2570
7586b765
JL
2571 volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
2572 if (!volume_info) {
2573 rc = -ENOMEM;
2574 goto out;
2575 }
50c2f753 2576
7586b765 2577 if (cifs_parse_mount_options(mount_data, devname, volume_info)) {
70fe7dc0
JL
2578 rc = -EINVAL;
2579 goto out;
1da177e4
LT
2580 }
2581
7586b765 2582 if (volume_info->nullauth) {
b6b38f70 2583 cFYI(1, "null user");
7586b765
JL
2584 volume_info->username = "";
2585 } else if (volume_info->username) {
1da177e4 2586 /* BB fixme parse for domain name here */
b6b38f70 2587 cFYI(1, "Username: %s", volume_info->username);
1da177e4 2588 } else {
bf820679 2589 cifserror("No username specified");
50c2f753
SF
2590 /* In userspace mount helper we can get user name from alternate
2591 locations such as env variables and files on disk */
70fe7dc0
JL
2592 rc = -EINVAL;
2593 goto out;
1da177e4
LT
2594 }
2595
1da177e4 2596 /* this is needed for ASCII cp to Unicode converts */
7586b765 2597 if (volume_info->iocharset == NULL) {
a5fc4ce0
JL
2598 /* load_nls_default cannot return null */
2599 volume_info->local_nls = load_nls_default();
1da177e4 2600 } else {
a5fc4ce0
JL
2601 volume_info->local_nls = load_nls(volume_info->iocharset);
2602 if (volume_info->local_nls == NULL) {
b6b38f70
JP
2603 cERROR(1, "CIFS mount error: iocharset %s not found",
2604 volume_info->iocharset);
70fe7dc0
JL
2605 rc = -ELIBACC;
2606 goto out;
1da177e4
LT
2607 }
2608 }
a5fc4ce0 2609 cifs_sb->local_nls = volume_info->local_nls;
1da177e4 2610
63c038c2 2611 /* get a reference to a tcp session */
7586b765 2612 srvTcp = cifs_get_tcp_session(volume_info);
63c038c2
JL
2613 if (IS_ERR(srvTcp)) {
2614 rc = PTR_ERR(srvTcp);
2615 goto out;
1da177e4
LT
2616 }
2617
36988c76
JL
2618 /* get a reference to a SMB session */
2619 pSesInfo = cifs_get_smb_ses(srvTcp, volume_info);
2620 if (IS_ERR(pSesInfo)) {
2621 rc = PTR_ERR(pSesInfo);
2622 pSesInfo = NULL;
2623 goto mount_fail_check;
1da177e4 2624 }
50c2f753 2625
d00c28de
JL
2626 setup_cifs_sb(volume_info, cifs_sb);
2627 if (pSesInfo->capabilities & CAP_LARGE_FILES)
2628 sb->s_maxbytes = MAX_LFS_FILESIZE;
2629 else
2630 sb->s_maxbytes = MAX_NON_LFS;
1da177e4 2631
8af18971 2632 /* BB FIXME fix time_gran to be larger for LANMAN sessions */
1da177e4
LT
2633 sb->s_time_gran = 100;
2634
d00c28de
JL
2635 /* search for existing tcon to this server share */
2636 tcon = cifs_get_tcon(pSesInfo, volume_info);
2637 if (IS_ERR(tcon)) {
2638 rc = PTR_ERR(tcon);
2639 tcon = NULL;
1bfe73c2 2640 goto remote_path_check;
d00c28de 2641 }
1bfe73c2 2642
d82c2df5 2643 cifs_sb->tcon = tcon;
c18c842b 2644
d82c2df5
SF
2645 /* do not care if following two calls succeed - informational */
2646 if (!tcon->ipc) {
2647 CIFSSMBQFSDeviceInfo(xid, tcon);
2648 CIFSSMBQFSAttributeInfo(xid, tcon);
2649 }
03a143c9 2650
d82c2df5
SF
2651 /* tell server which Unix caps we support */
2652 if (tcon->ses->capabilities & CAP_UNIX)
2653 /* reset of caps checks mount to see if unix extensions
2654 disabled for just this mount */
7586b765 2655 reset_cifs_unix_caps(xid, tcon, sb, volume_info);
d82c2df5
SF
2656 else
2657 tcon->unix_ext = 0; /* server does not support them */
c18c842b 2658
d82c2df5
SF
2659 /* convert forward to back slashes in prepath here if needed */
2660 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0)
2661 convert_delimiter(cifs_sb->prepath, CIFS_DIR_SEP(cifs_sb));
03a143c9 2662
d82c2df5
SF
2663 if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) {
2664 cifs_sb->rsize = 1024 * 127;
b6b38f70 2665 cFYI(DBG2, "no very large read support, rsize now 127K");
1da177e4 2666 }
d82c2df5
SF
2667 if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X))
2668 cifs_sb->wsize = min(cifs_sb->wsize,
2669 (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
2670 if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
2671 cifs_sb->rsize = min(cifs_sb->rsize,
2672 (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
1da177e4 2673
1bfe73c2
IM
2674remote_path_check:
2675 /* check if a whole path (including prepath) is not remote */
2676 if (!rc && cifs_sb->prepathlen && tcon) {
e4cce94c
IM
2677 /* build_path_to_root works only when we have a valid tcon */
2678 full_path = cifs_build_path_to_root(cifs_sb);
2679 if (full_path == NULL) {
2680 rc = -ENOMEM;
2681 goto mount_fail_check;
2682 }
2683 rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
1bfe73c2 2684 if (rc != -EREMOTE) {
e4cce94c
IM
2685 kfree(full_path);
2686 goto mount_fail_check;
2687 }
2688 kfree(full_path);
2689 }
2690
1bfe73c2
IM
2691 /* get referral if needed */
2692 if (rc == -EREMOTE) {
d036f50f 2693#ifdef CONFIG_CIFS_DFS_UPCALL
5c2503a8
IM
2694 if (referral_walks_count > MAX_NESTED_LINKS) {
2695 /*
2696 * BB: when we implement proper loop detection,
2697 * we will remove this check. But now we need it
2698 * to prevent an indefinite loop if 'DFS tree' is
2699 * misconfigured (i.e. has loops).
2700 */
2701 rc = -ELOOP;
2702 goto mount_fail_check;
2703 }
1bfe73c2
IM
2704 /* convert forward to back slashes in prepath here if needed */
2705 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0)
2706 convert_delimiter(cifs_sb->prepath,
2707 CIFS_DIR_SEP(cifs_sb));
2708 full_path = build_unc_path_to_root(volume_info, cifs_sb);
2709 if (IS_ERR(full_path)) {
2710 rc = PTR_ERR(full_path);
2711 goto mount_fail_check;
2712 }
2713
b6b38f70 2714 cFYI(1, "Getting referral for: %s", full_path);
1bfe73c2
IM
2715 rc = get_dfs_path(xid, pSesInfo , full_path + 1,
2716 cifs_sb->local_nls, &num_referrals, &referrals,
2717 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
2718 if (!rc && num_referrals > 0) {
2719 char *fake_devname = NULL;
2720
2721 if (mount_data != mount_data_global)
2722 kfree(mount_data);
7b91e266 2723
1bfe73c2
IM
2724 mount_data = cifs_compose_mount_options(
2725 cifs_sb->mountdata, full_path + 1,
2726 referrals, &fake_devname);
7b91e266 2727
1bfe73c2 2728 free_dfs_info_array(referrals, num_referrals);
7b91e266
JL
2729 kfree(fake_devname);
2730 kfree(full_path);
2731
2732 if (IS_ERR(mount_data)) {
2733 rc = PTR_ERR(mount_data);
2734 mount_data = NULL;
2735 goto mount_fail_check;
2736 }
1bfe73c2
IM
2737
2738 if (tcon)
2739 cifs_put_tcon(tcon);
2740 else if (pSesInfo)
2741 cifs_put_smb_ses(pSesInfo);
2742
2743 cleanup_volume_info(&volume_info);
5c2503a8 2744 referral_walks_count++;
a2934c7b 2745 FreeXid(xid);
1bfe73c2
IM
2746 goto try_mount_again;
2747 }
d036f50f
SF
2748#else /* No DFS support, return error on mount */
2749 rc = -EOPNOTSUPP;
2750#endif
1bfe73c2
IM
2751 }
2752
2753mount_fail_check:
2754 /* on error free sesinfo and tcon struct if needed */
2755 if (rc) {
2756 if (mount_data != mount_data_global)
2757 kfree(mount_data);
2758 /* If find_unc succeeded then rc == 0 so we can not end */
2759 /* up accidently freeing someone elses tcon struct */
2760 if (tcon)
2761 cifs_put_tcon(tcon);
2762 else if (pSesInfo)
2763 cifs_put_smb_ses(pSesInfo);
2764 else
2765 cifs_put_tcp_session(srvTcp);
2766 goto out;
2767 }
2768
7586b765 2769 /* volume_info->password is freed above when existing session found
1da177e4
LT
2770 (in which case it is not needed anymore) but when new sesion is created
2771 the password ptr is put in the new session structure (in which case the
2772 password will be freed at unmount time) */
70fe7dc0
JL
2773out:
2774 /* zero out password before freeing */
1bfe73c2 2775 cleanup_volume_info(&volume_info);
1da177e4
LT
2776 FreeXid(xid);
2777 return rc;
2778}
2779
1da177e4
LT
2780int
2781CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
2782 const char *tree, struct cifsTconInfo *tcon,
2783 const struct nls_table *nls_codepage)
2784{
2785 struct smb_hdr *smb_buffer;
2786 struct smb_hdr *smb_buffer_response;
2787 TCONX_REQ *pSMB;
2788 TCONX_RSP *pSMBr;
2789 unsigned char *bcc_ptr;
2790 int rc = 0;
cc20c031 2791 int length, bytes_left;
1da177e4
LT
2792 __u16 count;
2793
2794 if (ses == NULL)
2795 return -EIO;
2796
2797 smb_buffer = cifs_buf_get();
ca43e3be 2798 if (smb_buffer == NULL)
1da177e4 2799 return -ENOMEM;
ca43e3be 2800
1da177e4
LT
2801 smb_buffer_response = smb_buffer;
2802
2803 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
2804 NULL /*no tid */ , 4 /*wct */ );
1982c344
SF
2805
2806 smb_buffer->Mid = GetNextMid(ses->server);
1da177e4
LT
2807 smb_buffer->Uid = ses->Suid;
2808 pSMB = (TCONX_REQ *) smb_buffer;
2809 pSMBr = (TCONX_RSP *) smb_buffer_response;
2810
2811 pSMB->AndXCommand = 0xFF;
2812 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
1da177e4 2813 bcc_ptr = &pSMB->Password[0];
fb8c4b14 2814 if ((ses->server->secMode) & SECMODE_USER) {
eeac8047 2815 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
7c7b25bc 2816 *bcc_ptr = 0; /* password is null byte */
eeac8047 2817 bcc_ptr++; /* skip password */
7c7b25bc 2818 /* already aligned so no need to do it below */
eeac8047 2819 } else {
7c7b25bc 2820 pSMB->PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE);
eeac8047
SF
2821 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
2822 specified as required (when that support is added to
2823 the vfs in the future) as only NTLM or the much
7c7b25bc 2824 weaker LANMAN (which we do not send by default) is accepted
eeac8047
SF
2825 by Samba (not sure whether other servers allow
2826 NTLMv2 password here) */
7c7b25bc 2827#ifdef CONFIG_CIFS_WEAK_PW_HASH
04912d6a 2828 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
00e485b0
JL
2829 (ses->server->secType == LANMAN))
2830 calc_lanman_hash(tcon->password, ses->server->cryptKey,
4e53a3fb
JL
2831 ses->server->secMode &
2832 SECMODE_PW_ENCRYPT ? true : false,
2833 bcc_ptr);
7c7b25bc
SF
2834 else
2835#endif /* CIFS_WEAK_PW_HASH */
00e485b0 2836 SMBNTencrypt(tcon->password, ses->server->cryptKey,
eeac8047
SF
2837 bcc_ptr);
2838
7c7b25bc 2839 bcc_ptr += CIFS_SESS_KEY_SIZE;
fb8c4b14 2840 if (ses->capabilities & CAP_UNICODE) {
7c7b25bc
SF
2841 /* must align unicode strings */
2842 *bcc_ptr = 0; /* null byte password */
2843 bcc_ptr++;
2844 }
eeac8047 2845 }
1da177e4 2846
50c2f753 2847 if (ses->server->secMode &
a878fb22 2848 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
1da177e4
LT
2849 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
2850
2851 if (ses->capabilities & CAP_STATUS32) {
2852 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
2853 }
2854 if (ses->capabilities & CAP_DFS) {
2855 smb_buffer->Flags2 |= SMBFLG2_DFS;
2856 }
2857 if (ses->capabilities & CAP_UNICODE) {
2858 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
2859 length =
50c2f753
SF
2860 cifs_strtoUCS((__le16 *) bcc_ptr, tree,
2861 6 /* max utf8 char length in bytes */ *
a878fb22
SF
2862 (/* server len*/ + 256 /* share len */), nls_codepage);
2863 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
1da177e4
LT
2864 bcc_ptr += 2; /* skip trailing null */
2865 } else { /* ASCII */
1da177e4
LT
2866 strcpy(bcc_ptr, tree);
2867 bcc_ptr += strlen(tree) + 1;
2868 }
2869 strcpy(bcc_ptr, "?????");
2870 bcc_ptr += strlen("?????");
2871 bcc_ptr += 1;
2872 count = bcc_ptr - &pSMB->Password[0];
2873 pSMB->hdr.smb_buf_length += count;
2874 pSMB->ByteCount = cpu_to_le16(count);
2875
133672ef
SF
2876 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
2877 CIFS_STD_OP);
1da177e4 2878
1da177e4
LT
2879 /* above now done in SendReceive */
2880 if ((rc == 0) && (tcon != NULL)) {
0e0d2cf3
SF
2881 bool is_unicode;
2882
1da177e4 2883 tcon->tidStatus = CifsGood;
3b795210 2884 tcon->need_reconnect = false;
1da177e4
LT
2885 tcon->tid = smb_buffer_response->Tid;
2886 bcc_ptr = pByteArea(smb_buffer_response);
cc20c031
JL
2887 bytes_left = BCC(smb_buffer_response);
2888 length = strnlen(bcc_ptr, bytes_left - 2);
0e0d2cf3
SF
2889 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
2890 is_unicode = true;
2891 else
2892 is_unicode = false;
2893
cc20c031 2894
50c2f753 2895 /* skip service field (NB: this field is always ASCII) */
7f8ed420
SF
2896 if (length == 3) {
2897 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
2898 (bcc_ptr[2] == 'C')) {
b6b38f70 2899 cFYI(1, "IPC connection");
7f8ed420
SF
2900 tcon->ipc = 1;
2901 }
2902 } else if (length == 2) {
2903 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
2904 /* the most common case */
b6b38f70 2905 cFYI(1, "disk share connection");
7f8ed420
SF
2906 }
2907 }
50c2f753 2908 bcc_ptr += length + 1;
cc20c031 2909 bytes_left -= (length + 1);
1da177e4 2910 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
cc20c031
JL
2911
2912 /* mostly informational -- no need to fail on error here */
90a98b2f 2913 kfree(tcon->nativeFileSystem);
d185cda7 2914 tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr,
0e0d2cf3 2915 bytes_left, is_unicode,
cc20c031
JL
2916 nls_codepage);
2917
b6b38f70 2918 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
cc20c031 2919
fb8c4b14 2920 if ((smb_buffer_response->WordCount == 3) ||
1a4e15a0
SF
2921 (smb_buffer_response->WordCount == 7))
2922 /* field is in same location */
3979877e
SF
2923 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
2924 else
2925 tcon->Flags = 0;
b6b38f70 2926 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
1da177e4 2927 } else if ((rc == 0) && tcon == NULL) {
50c2f753 2928 /* all we need to save for IPC$ connection */
1da177e4
LT
2929 ses->ipc_tid = smb_buffer_response->Tid;
2930 }
2931
a8a11d39 2932 cifs_buf_release(smb_buffer);
1da177e4
LT
2933 return rc;
2934}
2935
2936int
2937cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
2938{
2939 int rc = 0;
50c2f753 2940 char *tmp;
1da177e4 2941
f1987b44
JL
2942 if (cifs_sb->tcon)
2943 cifs_put_tcon(cifs_sb->tcon);
50c2f753 2944
1da177e4 2945 cifs_sb->tcon = NULL;
2fe87f02
SF
2946 tmp = cifs_sb->prepath;
2947 cifs_sb->prepathlen = 0;
2948 cifs_sb->prepath = NULL;
2949 kfree(tmp);
1da177e4 2950
88e7d705 2951 return rc;
50c2f753 2952}
1da177e4 2953
198b5682 2954int cifs_negotiate_protocol(unsigned int xid, struct cifsSesInfo *ses)
1da177e4
LT
2955{
2956 int rc = 0;
198b5682 2957 struct TCP_Server_Info *server = ses->server;
1da177e4 2958
198b5682
JL
2959 /* only send once per connect */
2960 if (server->maxBuf != 0)
2961 return 0;
2962
2963 rc = CIFSSMBNegotiate(xid, ses);
2964 if (rc == -EAGAIN) {
2965 /* retry only once on 1st time connection */
2966 rc = CIFSSMBNegotiate(xid, ses);
2967 if (rc == -EAGAIN)
2968 rc = -EHOSTDOWN;
1da177e4 2969 }
198b5682
JL
2970 if (rc == 0) {
2971 spin_lock(&GlobalMid_Lock);
2972 if (server->tcpStatus != CifsExiting)
2973 server->tcpStatus = CifsGood;
2974 else
2975 rc = -EHOSTDOWN;
2976 spin_unlock(&GlobalMid_Lock);
26b994fa 2977
198b5682
JL
2978 }
2979
2980 return rc;
2981}
2982
2983
2984int cifs_setup_session(unsigned int xid, struct cifsSesInfo *ses,
2985 struct nls_table *nls_info)
2986{
2987 int rc = 0;
2988 struct TCP_Server_Info *server = ses->server;
26b994fa 2989
198b5682
JL
2990 ses->flags = 0;
2991 ses->capabilities = server->capabilities;
26b994fa 2992 if (linuxExtEnabled == 0)
198b5682 2993 ses->capabilities &= (~CAP_UNIX);
20418acd 2994
b6b38f70
JP
2995 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
2996 server->secMode, server->capabilities, server->timeAdj);
cb7691b6 2997
198b5682 2998 rc = CIFS_SessSetup(xid, ses, nls_info);
26b994fa 2999 if (rc) {
b6b38f70 3000 cERROR(1, "Send error in SessSetup = %d", rc);
26b994fa 3001 } else {
b6b38f70 3002 cFYI(1, "CIFS Session Established successfully");
20418acd 3003 spin_lock(&GlobalMid_Lock);
198b5682
JL
3004 ses->status = CifsGood;
3005 ses->need_reconnect = false;
20418acd 3006 spin_unlock(&GlobalMid_Lock);
1da177e4 3007 }
26b994fa 3008
1da177e4
LT
3009 return rc;
3010}
3011