smb_common.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 2018 Samsung Electronics Co., Ltd.
  4. * Copyright (C) 2018 Namjae Jeon <linkinjeon@kernel.org>
  5. */
  6. #include <linux/user_namespace.h>
  7. #include "smb_common.h"
  8. #include "server.h"
  9. #include "misc.h"
  10. #include "../common/smb2status.h"
  11. #include "connection.h"
  12. #include "ksmbd_work.h"
  13. #include "mgmt/user_session.h"
  14. #include "mgmt/user_config.h"
  15. #include "mgmt/tree_connect.h"
  16. #include "mgmt/share_config.h"
  17. /*for shortname implementation */
  18. static const char *basechars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_-!@#$%";
  19. #define MANGLE_BASE (strlen(basechars) - 1)
  20. #define MAGIC_CHAR '~'
  21. #define PERIOD '.'
  22. #define mangle(V) ((char)(basechars[(V) % MANGLE_BASE]))
  23. struct smb_protocol {
  24. int index;
  25. char *name;
  26. char *prot;
  27. __u16 prot_id;
  28. };
  29. static struct smb_protocol smb1_protos[] = {
  30. {
  31. SMB21_PROT,
  32. "\2SMB 2.1",
  33. "SMB2_10",
  34. SMB21_PROT_ID
  35. },
  36. {
  37. SMB2X_PROT,
  38. "\2SMB 2.???",
  39. "SMB2_22",
  40. SMB2X_PROT_ID
  41. },
  42. };
  43. static struct smb_protocol smb2_protos[] = {
  44. {
  45. SMB21_PROT,
  46. "\2SMB 2.1",
  47. "SMB2_10",
  48. SMB21_PROT_ID
  49. },
  50. {
  51. SMB30_PROT,
  52. "\2SMB 3.0",
  53. "SMB3_00",
  54. SMB30_PROT_ID
  55. },
  56. {
  57. SMB302_PROT,
  58. "\2SMB 3.02",
  59. "SMB3_02",
  60. SMB302_PROT_ID
  61. },
  62. {
  63. SMB311_PROT,
  64. "\2SMB 3.1.1",
  65. "SMB3_11",
  66. SMB311_PROT_ID
  67. },
  68. };
  69. unsigned int ksmbd_server_side_copy_max_chunk_count(void)
  70. {
  71. return 256;
  72. }
  73. unsigned int ksmbd_server_side_copy_max_chunk_size(void)
  74. {
  75. return (2U << 30) - 1;
  76. }
  77. unsigned int ksmbd_server_side_copy_max_total_size(void)
  78. {
  79. return (2U << 30) - 1;
  80. }
  81. inline int ksmbd_min_protocol(void)
  82. {
  83. return SMB21_PROT;
  84. }
  85. inline int ksmbd_max_protocol(void)
  86. {
  87. return SMB311_PROT;
  88. }
  89. int ksmbd_lookup_protocol_idx(char *str)
  90. {
  91. int offt = ARRAY_SIZE(smb1_protos) - 1;
  92. int len = strlen(str);
  93. while (offt >= 0) {
  94. if (!strncmp(str, smb1_protos[offt].prot, len)) {
  95. ksmbd_debug(SMB, "selected %s dialect idx = %d\n",
  96. smb1_protos[offt].prot, offt);
  97. return smb1_protos[offt].index;
  98. }
  99. offt--;
  100. }
  101. offt = ARRAY_SIZE(smb2_protos) - 1;
  102. while (offt >= 0) {
  103. if (!strncmp(str, smb2_protos[offt].prot, len)) {
  104. ksmbd_debug(SMB, "selected %s dialect idx = %d\n",
  105. smb2_protos[offt].prot, offt);
  106. return smb2_protos[offt].index;
  107. }
  108. offt--;
  109. }
  110. return -1;
  111. }
  112. /**
  113. * ksmbd_verify_smb_message() - check for valid smb2 request header
  114. * @work: smb work
  115. *
  116. * check for valid smb signature and packet direction(request/response)
  117. *
  118. * Return: 0 on success, otherwise -EINVAL
  119. */
  120. int ksmbd_verify_smb_message(struct ksmbd_work *work)
  121. {
  122. struct smb2_hdr *smb2_hdr = ksmbd_req_buf_next(work);
  123. struct smb_hdr *hdr;
  124. if (smb2_hdr->ProtocolId == SMB2_PROTO_NUMBER)
  125. return ksmbd_smb2_check_message(work);
  126. hdr = work->request_buf;
  127. if (*(__le32 *)hdr->Protocol == SMB1_PROTO_NUMBER &&
  128. hdr->Command == SMB_COM_NEGOTIATE) {
  129. work->conn->outstanding_credits++;
  130. return 0;
  131. }
  132. return -EINVAL;
  133. }
  134. /**
  135. * ksmbd_smb_request() - check for valid smb request type
  136. * @conn: connection instance
  137. *
  138. * Return: true on success, otherwise false
  139. */
  140. bool ksmbd_smb_request(struct ksmbd_conn *conn)
  141. {
  142. __le32 *proto;
  143. if (conn->request_buf[0] != 0)
  144. return false;
  145. proto = (__le32 *)smb2_get_msg(conn->request_buf);
  146. if (*proto == SMB2_COMPRESSION_TRANSFORM_ID) {
  147. pr_err_ratelimited("smb2 compression not support yet");
  148. return false;
  149. }
  150. if (*proto != SMB1_PROTO_NUMBER &&
  151. *proto != SMB2_PROTO_NUMBER &&
  152. *proto != SMB2_TRANSFORM_PROTO_NUM)
  153. return false;
  154. return true;
  155. }
  156. static bool supported_protocol(int idx)
  157. {
  158. if (idx == SMB2X_PROT &&
  159. (server_conf.min_protocol >= SMB21_PROT ||
  160. server_conf.max_protocol <= SMB311_PROT))
  161. return true;
  162. return (server_conf.min_protocol <= idx &&
  163. idx <= server_conf.max_protocol);
  164. }
  165. static char *next_dialect(char *dialect, int *next_off, int bcount)
  166. {
  167. dialect = dialect + *next_off;
  168. *next_off = strnlen(dialect, bcount);
  169. if (dialect[*next_off] != '\0')
  170. return NULL;
  171. return dialect;
  172. }
  173. static int ksmbd_lookup_dialect_by_name(char *cli_dialects, __le16 byte_count)
  174. {
  175. int i, seq_num, bcount, next;
  176. char *dialect;
  177. for (i = ARRAY_SIZE(smb1_protos) - 1; i >= 0; i--) {
  178. seq_num = 0;
  179. next = 0;
  180. dialect = cli_dialects;
  181. bcount = le16_to_cpu(byte_count);
  182. do {
  183. dialect = next_dialect(dialect, &next, bcount);
  184. if (!dialect)
  185. break;
  186. ksmbd_debug(SMB, "client requested dialect %s\n",
  187. dialect);
  188. if (!strcmp(dialect, smb1_protos[i].name)) {
  189. if (supported_protocol(smb1_protos[i].index)) {
  190. ksmbd_debug(SMB,
  191. "selected %s dialect\n",
  192. smb1_protos[i].name);
  193. if (smb1_protos[i].index == SMB1_PROT)
  194. return seq_num;
  195. return smb1_protos[i].prot_id;
  196. }
  197. }
  198. seq_num++;
  199. bcount -= (++next);
  200. } while (bcount > 0);
  201. }
  202. return BAD_PROT_ID;
  203. }
  204. int ksmbd_lookup_dialect_by_id(__le16 *cli_dialects, __le16 dialects_count)
  205. {
  206. int i;
  207. int count;
  208. for (i = ARRAY_SIZE(smb2_protos) - 1; i >= 0; i--) {
  209. count = le16_to_cpu(dialects_count);
  210. while (--count >= 0) {
  211. ksmbd_debug(SMB, "client requested dialect 0x%x\n",
  212. le16_to_cpu(cli_dialects[count]));
  213. if (le16_to_cpu(cli_dialects[count]) !=
  214. smb2_protos[i].prot_id)
  215. continue;
  216. if (supported_protocol(smb2_protos[i].index)) {
  217. ksmbd_debug(SMB, "selected %s dialect\n",
  218. smb2_protos[i].name);
  219. return smb2_protos[i].prot_id;
  220. }
  221. }
  222. }
  223. return BAD_PROT_ID;
  224. }
  225. static int ksmbd_negotiate_smb_dialect(void *buf)
  226. {
  227. int smb_buf_length = get_rfc1002_len(buf);
  228. __le32 proto = ((struct smb2_hdr *)smb2_get_msg(buf))->ProtocolId;
  229. if (proto == SMB2_PROTO_NUMBER) {
  230. struct smb2_negotiate_req *req;
  231. int smb2_neg_size =
  232. offsetof(struct smb2_negotiate_req, Dialects);
  233. req = (struct smb2_negotiate_req *)smb2_get_msg(buf);
  234. if (smb2_neg_size > smb_buf_length)
  235. goto err_out;
  236. if (struct_size(req, Dialects, le16_to_cpu(req->DialectCount)) >
  237. smb_buf_length)
  238. goto err_out;
  239. return ksmbd_lookup_dialect_by_id(req->Dialects,
  240. req->DialectCount);
  241. }
  242. proto = *(__le32 *)((struct smb_hdr *)buf)->Protocol;
  243. if (proto == SMB1_PROTO_NUMBER) {
  244. struct smb_negotiate_req *req;
  245. req = (struct smb_negotiate_req *)buf;
  246. if (le16_to_cpu(req->ByteCount) < 2)
  247. goto err_out;
  248. if (offsetof(struct smb_negotiate_req, DialectsArray) - 4 +
  249. le16_to_cpu(req->ByteCount) > smb_buf_length) {
  250. goto err_out;
  251. }
  252. return ksmbd_lookup_dialect_by_name(req->DialectsArray,
  253. req->ByteCount);
  254. }
  255. err_out:
  256. return BAD_PROT_ID;
  257. }
  258. #define SMB_COM_NEGOTIATE_EX 0x0
  259. /**
  260. * get_smb1_cmd_val() - get smb command value from smb header
  261. * @work: smb work containing smb header
  262. *
  263. * Return: smb command value
  264. */
  265. static u16 get_smb1_cmd_val(struct ksmbd_work *work)
  266. {
  267. return SMB_COM_NEGOTIATE_EX;
  268. }
  269. /**
  270. * init_smb1_rsp_hdr() - initialize smb negotiate response header
  271. * @work: smb work containing smb request
  272. *
  273. * Return: 0 on success, otherwise -EINVAL
  274. */
  275. static int init_smb1_rsp_hdr(struct ksmbd_work *work)
  276. {
  277. struct smb_hdr *rsp_hdr = (struct smb_hdr *)work->response_buf;
  278. struct smb_hdr *rcv_hdr = (struct smb_hdr *)work->request_buf;
  279. rsp_hdr->Command = SMB_COM_NEGOTIATE;
  280. *(__le32 *)rsp_hdr->Protocol = SMB1_PROTO_NUMBER;
  281. rsp_hdr->Flags = SMBFLG_RESPONSE;
  282. rsp_hdr->Flags2 = SMBFLG2_UNICODE | SMBFLG2_ERR_STATUS |
  283. SMBFLG2_EXT_SEC | SMBFLG2_IS_LONG_NAME;
  284. rsp_hdr->Pid = rcv_hdr->Pid;
  285. rsp_hdr->Mid = rcv_hdr->Mid;
  286. return 0;
  287. }
  288. /**
  289. * smb1_check_user_session() - check for valid session for a user
  290. * @work: smb work containing smb request buffer
  291. *
  292. * Return: 0 on success, otherwise error
  293. */
  294. static int smb1_check_user_session(struct ksmbd_work *work)
  295. {
  296. unsigned int cmd = work->conn->ops->get_cmd_val(work);
  297. if (cmd == SMB_COM_NEGOTIATE_EX)
  298. return 0;
  299. return -EINVAL;
  300. }
  301. /**
  302. * smb1_allocate_rsp_buf() - allocate response buffer for a command
  303. * @work: smb work containing smb request
  304. *
  305. * Return: 0 on success, otherwise -ENOMEM
  306. */
  307. static int smb1_allocate_rsp_buf(struct ksmbd_work *work)
  308. {
  309. work->response_buf = kzalloc(MAX_CIFS_SMALL_BUFFER_SIZE,
  310. KSMBD_DEFAULT_GFP);
  311. work->response_sz = MAX_CIFS_SMALL_BUFFER_SIZE;
  312. if (!work->response_buf) {
  313. pr_err("Failed to allocate %u bytes buffer\n",
  314. MAX_CIFS_SMALL_BUFFER_SIZE);
  315. return -ENOMEM;
  316. }
  317. return 0;
  318. }
  319. /**
  320. * set_smb1_rsp_status() - set error type in smb response header
  321. * @work: smb work containing smb response header
  322. * @err: error code to set in response
  323. */
  324. static void set_smb1_rsp_status(struct ksmbd_work *work, __le32 err)
  325. {
  326. work->send_no_response = 1;
  327. }
  328. static struct smb_version_ops smb1_server_ops = {
  329. .get_cmd_val = get_smb1_cmd_val,
  330. .init_rsp_hdr = init_smb1_rsp_hdr,
  331. .allocate_rsp_buf = smb1_allocate_rsp_buf,
  332. .check_user_session = smb1_check_user_session,
  333. .set_rsp_status = set_smb1_rsp_status,
  334. };
  335. static struct smb_version_values smb1_server_values = {
  336. .max_credits = SMB2_MAX_CREDITS,
  337. };
  338. static int smb1_negotiate(struct ksmbd_work *work)
  339. {
  340. return ksmbd_smb_negotiate_common(work, SMB_COM_NEGOTIATE);
  341. }
  342. static struct smb_version_cmds smb1_server_cmds[1] = {
  343. [SMB_COM_NEGOTIATE_EX] = { .proc = smb1_negotiate, },
  344. };
  345. static int init_smb1_server(struct ksmbd_conn *conn)
  346. {
  347. conn->vals = &smb1_server_values;
  348. conn->ops = &smb1_server_ops;
  349. conn->cmds = smb1_server_cmds;
  350. conn->max_cmds = ARRAY_SIZE(smb1_server_cmds);
  351. return 0;
  352. }
  353. int ksmbd_init_smb_server(struct ksmbd_conn *conn)
  354. {
  355. __le32 proto;
  356. proto = *(__le32 *)((struct smb_hdr *)conn->request_buf)->Protocol;
  357. if (conn->need_neg == false) {
  358. if (proto == SMB1_PROTO_NUMBER)
  359. return -EINVAL;
  360. return 0;
  361. }
  362. if (proto == SMB1_PROTO_NUMBER)
  363. return init_smb1_server(conn);
  364. return init_smb3_11_server(conn);
  365. }
  366. int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level,
  367. struct ksmbd_file *dir,
  368. struct ksmbd_dir_info *d_info,
  369. char *search_pattern,
  370. int (*fn)(struct ksmbd_conn *, int,
  371. struct ksmbd_dir_info *,
  372. struct ksmbd_kstat *))
  373. {
  374. int i, rc = 0;
  375. struct ksmbd_conn *conn = work->conn;
  376. struct mnt_idmap *idmap = file_mnt_idmap(dir->filp);
  377. for (i = 0; i < 2; i++) {
  378. struct kstat kstat;
  379. struct ksmbd_kstat ksmbd_kstat;
  380. struct dentry *dentry;
  381. if (!dir->dot_dotdot[i]) { /* fill dot entry info */
  382. if (i == 0) {
  383. d_info->name = ".";
  384. d_info->name_len = 1;
  385. dentry = dir->filp->f_path.dentry;
  386. } else {
  387. d_info->name = "..";
  388. d_info->name_len = 2;
  389. dentry = dir->filp->f_path.dentry->d_parent;
  390. }
  391. if (!match_pattern(d_info->name, d_info->name_len,
  392. search_pattern)) {
  393. dir->dot_dotdot[i] = 1;
  394. continue;
  395. }
  396. ksmbd_kstat.kstat = &kstat;
  397. rc = ksmbd_vfs_fill_dentry_attrs(work,
  398. idmap,
  399. dentry,
  400. &ksmbd_kstat);
  401. if (rc)
  402. break;
  403. rc = fn(conn, info_level, d_info, &ksmbd_kstat);
  404. if (rc)
  405. break;
  406. if (d_info->out_buf_len <= 0)
  407. break;
  408. dir->dot_dotdot[i] = 1;
  409. if (d_info->flags & SMB2_RETURN_SINGLE_ENTRY) {
  410. d_info->out_buf_len = 0;
  411. break;
  412. }
  413. }
  414. }
  415. return rc;
  416. }
  417. /**
  418. * ksmbd_extract_shortname() - get shortname from long filename
  419. * @conn: connection instance
  420. * @longname: source long filename
  421. * @shortname: destination short filename
  422. *
  423. * Return: shortname length or 0 when source long name is '.' or '..'
  424. * TODO: Though this function conforms the restriction of 8.3 Filename spec,
  425. * but the result is different with Windows 7's one. need to check.
  426. */
  427. int ksmbd_extract_shortname(struct ksmbd_conn *conn, const char *longname,
  428. char *shortname)
  429. {
  430. const char *p;
  431. char base[9], extension[4];
  432. char out[13] = {0};
  433. int baselen = 0;
  434. int extlen = 0, len = 0;
  435. unsigned int csum = 0;
  436. const unsigned char *ptr;
  437. bool dot_present = true;
  438. p = longname;
  439. if ((*p == '.') || (!(strcmp(p, "..")))) {
  440. /*no mangling required */
  441. return 0;
  442. }
  443. p = strrchr(longname, '.');
  444. if (p == longname) { /*name starts with a dot*/
  445. strscpy(extension, "___", sizeof(extension));
  446. } else {
  447. if (p) {
  448. p++;
  449. while (*p && extlen < 3) {
  450. if (*p != '.')
  451. extension[extlen++] = toupper(*p);
  452. p++;
  453. }
  454. extension[extlen] = '\0';
  455. } else {
  456. dot_present = false;
  457. }
  458. }
  459. p = longname;
  460. if (*p == '.') {
  461. p++;
  462. longname++;
  463. }
  464. while (*p && (baselen < 5)) {
  465. if (*p != '.')
  466. base[baselen++] = toupper(*p);
  467. p++;
  468. }
  469. base[baselen] = MAGIC_CHAR;
  470. memcpy(out, base, baselen + 1);
  471. ptr = longname;
  472. len = strlen(longname);
  473. for (; len > 0; len--, ptr++)
  474. csum += *ptr;
  475. csum = csum % (MANGLE_BASE * MANGLE_BASE);
  476. out[baselen + 1] = mangle(csum / MANGLE_BASE);
  477. out[baselen + 2] = mangle(csum);
  478. out[baselen + 3] = PERIOD;
  479. if (dot_present)
  480. memcpy(out + baselen + 4, extension, 4);
  481. else
  482. out[baselen + 4] = '\0';
  483. smbConvertToUTF16((__le16 *)shortname, out, PATH_MAX,
  484. conn->local_nls, 0);
  485. len = strlen(out) * 2;
  486. return len;
  487. }
  488. static int __smb2_negotiate(struct ksmbd_conn *conn)
  489. {
  490. return (conn->dialect >= SMB20_PROT_ID &&
  491. conn->dialect <= SMB311_PROT_ID);
  492. }
  493. static int smb_handle_negotiate(struct ksmbd_work *work)
  494. {
  495. struct smb_negotiate_rsp *neg_rsp = work->response_buf;
  496. ksmbd_debug(SMB, "Unsupported SMB1 protocol\n");
  497. if (ksmbd_iov_pin_rsp(work, (void *)neg_rsp,
  498. sizeof(struct smb_negotiate_rsp) - 4))
  499. return -ENOMEM;
  500. neg_rsp->hdr.Status.CifsError = STATUS_SUCCESS;
  501. neg_rsp->hdr.WordCount = 1;
  502. neg_rsp->DialectIndex = cpu_to_le16(work->conn->dialect);
  503. neg_rsp->ByteCount = 0;
  504. return 0;
  505. }
  506. int ksmbd_smb_negotiate_common(struct ksmbd_work *work, unsigned int command)
  507. {
  508. struct ksmbd_conn *conn = work->conn;
  509. int ret;
  510. conn->dialect =
  511. ksmbd_negotiate_smb_dialect(work->request_buf);
  512. ksmbd_debug(SMB, "conn->dialect 0x%x\n", conn->dialect);
  513. if (command == SMB2_NEGOTIATE_HE) {
  514. ret = smb2_handle_negotiate(work);
  515. return ret;
  516. }
  517. if (command == SMB_COM_NEGOTIATE) {
  518. if (__smb2_negotiate(conn)) {
  519. init_smb3_11_server(conn);
  520. init_smb2_neg_rsp(work);
  521. ksmbd_debug(SMB, "Upgrade to SMB2 negotiation\n");
  522. return 0;
  523. }
  524. return smb_handle_negotiate(work);
  525. }
  526. pr_err("Unknown SMB negotiation command: %u\n", command);
  527. return -EINVAL;
  528. }
  529. enum SHARED_MODE_ERRORS {
  530. SHARE_DELETE_ERROR,
  531. SHARE_READ_ERROR,
  532. SHARE_WRITE_ERROR,
  533. FILE_READ_ERROR,
  534. FILE_WRITE_ERROR,
  535. FILE_DELETE_ERROR,
  536. };
  537. static const char * const shared_mode_errors[] = {
  538. "Current access mode does not permit SHARE_DELETE",
  539. "Current access mode does not permit SHARE_READ",
  540. "Current access mode does not permit SHARE_WRITE",
  541. "Desired access mode does not permit FILE_READ",
  542. "Desired access mode does not permit FILE_WRITE",
  543. "Desired access mode does not permit FILE_DELETE",
  544. };
  545. static void smb_shared_mode_error(int error, struct ksmbd_file *prev_fp,
  546. struct ksmbd_file *curr_fp)
  547. {
  548. ksmbd_debug(SMB, "%s\n", shared_mode_errors[error]);
  549. ksmbd_debug(SMB, "Current mode: 0x%x Desired mode: 0x%x\n",
  550. prev_fp->saccess, curr_fp->daccess);
  551. }
  552. int ksmbd_smb_check_shared_mode(struct file *filp, struct ksmbd_file *curr_fp)
  553. {
  554. int rc = 0;
  555. struct ksmbd_file *prev_fp;
  556. /*
  557. * Lookup fp in master fp list, and check desired access and
  558. * shared mode between previous open and current open.
  559. */
  560. down_read(&curr_fp->f_ci->m_lock);
  561. list_for_each_entry(prev_fp, &curr_fp->f_ci->m_fp_list, node) {
  562. if (file_inode(filp) != file_inode(prev_fp->filp))
  563. continue;
  564. if (filp == prev_fp->filp)
  565. continue;
  566. if (ksmbd_stream_fd(prev_fp) && ksmbd_stream_fd(curr_fp))
  567. if (strcmp(prev_fp->stream.name, curr_fp->stream.name))
  568. continue;
  569. if (prev_fp->attrib_only != curr_fp->attrib_only)
  570. continue;
  571. if (!(prev_fp->saccess & FILE_SHARE_DELETE_LE) &&
  572. curr_fp->daccess & FILE_DELETE_LE) {
  573. smb_shared_mode_error(SHARE_DELETE_ERROR,
  574. prev_fp,
  575. curr_fp);
  576. rc = -EPERM;
  577. break;
  578. }
  579. /*
  580. * Only check FILE_SHARE_DELETE if stream opened and
  581. * normal file opened.
  582. */
  583. if (ksmbd_stream_fd(prev_fp) && !ksmbd_stream_fd(curr_fp))
  584. continue;
  585. if (!(prev_fp->saccess & FILE_SHARE_READ_LE) &&
  586. curr_fp->daccess & (FILE_EXECUTE_LE | FILE_READ_DATA_LE)) {
  587. smb_shared_mode_error(SHARE_READ_ERROR,
  588. prev_fp,
  589. curr_fp);
  590. rc = -EPERM;
  591. break;
  592. }
  593. if (!(prev_fp->saccess & FILE_SHARE_WRITE_LE) &&
  594. curr_fp->daccess & (FILE_WRITE_DATA_LE | FILE_APPEND_DATA_LE)) {
  595. smb_shared_mode_error(SHARE_WRITE_ERROR,
  596. prev_fp,
  597. curr_fp);
  598. rc = -EPERM;
  599. break;
  600. }
  601. if (prev_fp->daccess & (FILE_EXECUTE_LE | FILE_READ_DATA_LE) &&
  602. !(curr_fp->saccess & FILE_SHARE_READ_LE)) {
  603. smb_shared_mode_error(FILE_READ_ERROR,
  604. prev_fp,
  605. curr_fp);
  606. rc = -EPERM;
  607. break;
  608. }
  609. if (prev_fp->daccess & (FILE_WRITE_DATA_LE | FILE_APPEND_DATA_LE) &&
  610. !(curr_fp->saccess & FILE_SHARE_WRITE_LE)) {
  611. smb_shared_mode_error(FILE_WRITE_ERROR,
  612. prev_fp,
  613. curr_fp);
  614. rc = -EPERM;
  615. break;
  616. }
  617. if (prev_fp->daccess & FILE_DELETE_LE &&
  618. !(curr_fp->saccess & FILE_SHARE_DELETE_LE)) {
  619. smb_shared_mode_error(FILE_DELETE_ERROR,
  620. prev_fp,
  621. curr_fp);
  622. rc = -EPERM;
  623. break;
  624. }
  625. }
  626. up_read(&curr_fp->f_ci->m_lock);
  627. return rc;
  628. }
  629. bool is_asterisk(char *p)
  630. {
  631. return p && p[0] == '*';
  632. }
  633. int __ksmbd_override_fsids(struct ksmbd_work *work,
  634. struct ksmbd_share_config *share)
  635. {
  636. struct ksmbd_session *sess = work->sess;
  637. struct ksmbd_user *user = sess->user;
  638. struct cred *cred;
  639. struct group_info *gi;
  640. unsigned int uid;
  641. unsigned int gid;
  642. int i;
  643. uid = user_uid(user);
  644. gid = user_gid(user);
  645. if (share->force_uid != KSMBD_SHARE_INVALID_UID)
  646. uid = share->force_uid;
  647. if (share->force_gid != KSMBD_SHARE_INVALID_GID)
  648. gid = share->force_gid;
  649. cred = prepare_kernel_cred(&init_task);
  650. if (!cred)
  651. return -ENOMEM;
  652. cred->fsuid = make_kuid(&init_user_ns, uid);
  653. cred->fsgid = make_kgid(&init_user_ns, gid);
  654. gi = groups_alloc(user->ngroups);
  655. if (!gi) {
  656. abort_creds(cred);
  657. return -ENOMEM;
  658. }
  659. for (i = 0; i < user->ngroups; i++)
  660. gi->gid[i] = make_kgid(&init_user_ns, user->sgid[i]);
  661. if (user->ngroups)
  662. groups_sort(gi);
  663. set_groups(cred, gi);
  664. put_group_info(gi);
  665. if (!uid_eq(cred->fsuid, GLOBAL_ROOT_UID))
  666. cred->cap_effective = cap_drop_fs_set(cred->cap_effective);
  667. WARN_ON(work->saved_cred);
  668. work->saved_cred = override_creds(cred);
  669. if (!work->saved_cred) {
  670. abort_creds(cred);
  671. return -EINVAL;
  672. }
  673. return 0;
  674. }
  675. int ksmbd_override_fsids(struct ksmbd_work *work)
  676. {
  677. return __ksmbd_override_fsids(work, work->tcon->share_conf);
  678. }
  679. void ksmbd_revert_fsids(struct ksmbd_work *work)
  680. {
  681. const struct cred *cred;
  682. WARN_ON(!work->saved_cred);
  683. cred = current_cred();
  684. revert_creds(work->saved_cred);
  685. put_cred(cred);
  686. work->saved_cred = NULL;
  687. }
  688. __le32 smb_map_generic_desired_access(__le32 daccess)
  689. {
  690. if (daccess & FILE_GENERIC_READ_LE) {
  691. daccess |= cpu_to_le32(GENERIC_READ_FLAGS);
  692. daccess &= ~FILE_GENERIC_READ_LE;
  693. }
  694. if (daccess & FILE_GENERIC_WRITE_LE) {
  695. daccess |= cpu_to_le32(GENERIC_WRITE_FLAGS);
  696. daccess &= ~FILE_GENERIC_WRITE_LE;
  697. }
  698. if (daccess & FILE_GENERIC_EXECUTE_LE) {
  699. daccess |= cpu_to_le32(GENERIC_EXECUTE_FLAGS);
  700. daccess &= ~FILE_GENERIC_EXECUTE_LE;
  701. }
  702. if (daccess & FILE_GENERIC_ALL_LE) {
  703. daccess |= cpu_to_le32(GENERIC_ALL_FLAGS);
  704. daccess &= ~FILE_GENERIC_ALL_LE;
  705. }
  706. return daccess;
  707. }