Changeset 740 for vendor/current/source3/smbd/trans2.c
- Timestamp:
- Nov 14, 2012, 12:59:34 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/smbd/trans2.c
r597 r740 25 25 26 26 #include "includes.h" 27 #include "system/filesys.h" 27 28 #include "version.h" 29 #include "smbd/smbd.h" 28 30 #include "smbd/globals.h" 29 31 #include "../libcli/auth/libcli_auth.h" 32 #include "../librpc/gen_ndr/xattr.h" 33 #include "../librpc/gen_ndr/ndr_security.h" 34 #include "libcli/security/security.h" 35 #include "trans2.h" 36 #include "auth.h" 37 #include "smbprofile.h" 38 #include "rpc_server/srv_pipe_hnd.h" 39 #include "libsmb/libsmb.h" 30 40 31 41 #define DIR_ENTRY_SAFETY_MARGIN 4096 … … 500 510 if (!lp_ea_support(SNUM(conn))) { 501 511 return NT_STATUS_EAS_NOT_SUPPORTED; 512 } 513 514 if (fsp && !(fsp->access_mask & FILE_WRITE_EA)) { 515 return NT_STATUS_ACCESS_DENIED; 502 516 } 503 517 … … 779 793 int data_alignment_offset = 0; 780 794 bool overflow = False; 781 struct smbd_server_connection *sconn = smbd_server_conn;795 struct smbd_server_connection *sconn = req->sconn; 782 796 int max_send = sconn->smb1.sessions.max_send; 783 797 … … 799 813 reply_outbuf(req, 10, 0); 800 814 show_msg((char *)req->outbuf); 801 if (!srv_send_smb(s mbd_server_fd(),815 if (!srv_send_smb(sconn, 802 816 (char *)req->outbuf, 803 817 true, req->seqnum+1, … … 938 952 /* Send the packet */ 939 953 show_msg((char *)req->outbuf); 940 if (!srv_send_smb(s mbd_server_fd(),954 if (!srv_send_smb(sconn, 941 955 (char *)req->outbuf, 942 956 true, req->seqnum+1, … … 1001 1015 uint32 create_disposition; 1002 1016 uint32 create_options = 0; 1017 uint32_t private_flags = 0; 1003 1018 TALLOC_CTX *ctx = talloc_tos(); 1004 1019 … … 1072 1087 &access_mask, &share_mode, 1073 1088 &create_disposition, 1074 &create_options)) { 1089 &create_options, 1090 &private_flags)) { 1075 1091 reply_nterror(req, NT_STATUS_ACCESS_DENIED); 1076 1092 goto out; … … 1116 1132 oplock_request, /* oplock_request */ 1117 1133 open_size, /* allocation_size */ 1134 private_flags, 1118 1135 NULL, /* sd */ 1119 1136 ea_list, /* ea_list */ … … 1134 1151 mtime = convert_timespec_to_time_t(smb_fname->st.st_ex_mtime); 1135 1152 inode = smb_fname->st.st_ex_ino; 1136 if (fattr & aDIR) {1153 if (fattr & FILE_ATTRIBUTE_DIRECTORY) { 1137 1154 close_file(req, fsp, ERROR_CLOSE); 1138 1155 reply_nterror(req, NT_STATUS_ACCESS_DENIED); … … 1479 1496 const char *fname, 1480 1497 const struct smb_filename *smb_fname, 1481 uint64_t space_remaining,1498 int space_remaining, 1482 1499 uint8_t align, 1483 1500 bool do_pad, … … 1500 1517 char *last_entry_ptr; 1501 1518 bool was_8_3; 1502 off_t off;1503 off_t pad = 0;1519 int off; 1520 int pad = 0; 1504 1521 1505 1522 *out_of_space = false; … … 1510 1527 ZERO_STRUCT(cdate_ts); 1511 1528 1512 if (!(mode & aDIR)) {1529 if (!(mode & FILE_ATTRIBUTE_DIRECTORY)) { 1513 1530 file_size = get_file_size_stat(&smb_fname->st); 1514 1531 } … … 1535 1552 1536 1553 /* align the record */ 1537 off = PTR_DIFF(pdata, base_data); 1554 SMB_ASSERT(align >= 1); 1555 1556 off = (int)PTR_DIFF(pdata, base_data); 1538 1557 pad = (off + (align-1)) & ~(align-1); 1539 1558 pad -= off; 1559 1560 if (pad && pad > space_remaining) { 1561 *out_of_space = true; 1562 DEBUG(9,("smbd_marshall_dir_entry: out of space " 1563 "for padding (wanted %u, had %d)\n", 1564 (unsigned int)pad, 1565 space_remaining )); 1566 return false; /* Not finished - just out of space */ 1567 } 1568 1540 1569 off += pad; 1541 1570 /* initialize padding to 0 */ … … 1544 1573 } 1545 1574 space_remaining -= pad; 1575 1576 DEBUG(10,("smbd_marshall_dir_entry: space_remaining = %d\n", 1577 space_remaining )); 1546 1578 1547 1579 pdata += pad; … … 1659 1691 if (PTR_DIFF(p + 255 + ea_len,pdata) > space_remaining) { 1660 1692 *out_of_space = true; 1661 DEBUG(9,("smbd_marshall_dir_entry: out of space\n")); 1693 DEBUG(9,("smbd_marshall_dir_entry: out of space " 1694 "(wanted %u, had %d)\n", 1695 (unsigned int)PTR_DIFF(p + 255 + ea_len,pdata), 1696 space_remaining )); 1662 1697 return False; /* Not finished - just out of space */ 1663 1698 } … … 2037 2072 if (PTR_DIFF(p,pdata) > space_remaining) { 2038 2073 *out_of_space = true; 2039 DEBUG(9,("smbd_marshall_dir_entry: out of space\n")); 2074 DEBUG(9,("smbd_marshall_dir_entry: out of space " 2075 "(wanted %u, had %d)\n", 2076 (unsigned int)PTR_DIFF(p,pdata), 2077 space_remaining )); 2040 2078 return false; /* Not finished - just out of space */ 2041 2079 } … … 2232 2270 TALLOC_CTX *ctx = talloc_tos(); 2233 2271 struct dptr_struct *dirptr = NULL; 2234 struct smbd_server_connection *sconn = smbd_server_conn;2272 struct smbd_server_connection *sconn = req->sconn; 2235 2273 2236 2274 if (total_params < 13) { … … 2322 2360 mask_contains_wcard = True; 2323 2361 } 2324 directory = talloc_strdup(talloc_tos(), "./"); 2362 } else { 2363 *p = 0; 2364 } 2365 2366 if (p == NULL || p == directory) { 2367 /* Ensure we don't have a directory name of "". */ 2368 directory = talloc_strdup(talloc_tos(), "."); 2325 2369 if (!directory) { 2326 2370 reply_nterror(req, NT_STATUS_NO_MEMORY); 2327 2371 goto out; 2328 2372 } 2329 } else {2330 *p = 0;2331 2373 } 2332 2374 … … 2383 2425 2384 2426 ntstatus = dptr_create(conn, 2427 NULL, /* fsp */ 2385 2428 directory, 2386 2429 False, … … 2571 2614 TALLOC_CTX *ctx = talloc_tos(); 2572 2615 struct dptr_struct *dirptr; 2573 struct smbd_server_connection *sconn = smbd_server_conn;2616 struct smbd_server_connection *sconn = req->sconn; 2574 2617 2575 2618 if (total_params < 13) { … … 2866 2909 #endif 2867 2910 extended_info->samba_gitcommitdate = 0; 2868 #ifdef SAMBA_VERSION_ GIT_COMMIT_TIME2869 unix_to_nt_time(&extended_info->samba_gitcommitdate, SAMBA_VERSION_ GIT_COMMIT_TIME);2911 #ifdef SAMBA_VERSION_COMMIT_TIME 2912 unix_to_nt_time(&extended_info->samba_gitcommitdate, SAMBA_VERSION_COMMIT_TIME); 2870 2913 #endif 2871 2914 … … 3117 3160 case SMB_QUERY_FS_DEVICE_INFO: 3118 3161 case SMB_FS_DEVICE_INFORMATION: 3162 { 3163 uint32_t characteristics = FILE_DEVICE_IS_MOUNTED; 3164 3165 if (!CAN_WRITE(conn)) { 3166 characteristics |= FILE_READ_ONLY_DEVICE; 3167 } 3119 3168 data_len = 8; 3120 SIVAL(pdata,0,0); /* dev type */ 3121 SIVAL(pdata,4,0); /* characteristics */ 3122 break; 3169 SIVAL(pdata,0,FILE_DEVICE_DISK); /* dev type */ 3170 SIVAL(pdata,4,characteristics); 3171 break; 3172 } 3123 3173 3124 3174 #ifdef HAVE_SYS_QUOTAS … … 3157 3207 3158 3208 /* access check */ 3159 if (conn->server_info->utok.uid != sec_initial_uid() && 3160 !conn->admin_user) { 3209 if (get_current_uid(conn) != 0) { 3161 3210 DEBUG(0,("set_user_quota: access_denied " 3162 3211 "service [%s] user [%s]\n", 3163 3212 lp_servicename(SNUM(conn)), 3164 conn->se rver_info->unix_name));3213 conn->session_info->unix_name)); 3165 3214 return NT_STATUS_ACCESS_DENIED; 3166 3215 } … … 3220 3269 { 3221 3270 bool large_write = lp_min_receive_file_size() && 3222 !srv_is_signing_active( smbd_server_conn);3223 bool large_read = !srv_is_signing_active( smbd_server_conn);3271 !srv_is_signing_active(conn->sconn); 3272 bool large_read = !srv_is_signing_active(conn->sconn); 3224 3273 int encrypt_caps = 0; 3225 3274 … … 3315 3364 */ 3316 3365 if (nt_token_check_sid(&global_sid_Builtin_Guests, 3317 conn->se rver_info->ptok)) {3366 conn->session_info->security_token)) { 3318 3367 flags |= SMB_WHOAMI_GUEST; 3319 3368 } … … 3323 3372 */ 3324 3373 if (nt_token_check_sid(&global_sid_Authenticated_Users, 3325 conn->se rver_info->ptok)) {3374 conn->session_info->security_token)) { 3326 3375 flags &= ~SMB_WHOAMI_GUEST; 3327 3376 } … … 3339 3388 + 4 /* SID bytes */ 3340 3389 + 4 /* pad/reserved */ 3341 + (conn->se rver_info->utok.ngroups * 8)3390 + (conn->session_info->utok.ngroups * 8) 3342 3391 /* groups list */ 3343 + (conn->se rver_info->ptok->num_sids *3392 + (conn->session_info->security_token->num_sids * 3344 3393 SID_MAX_SIZE) 3345 3394 /* SID list */; … … 3348 3397 SIVAL(pdata, 4, SMB_WHOAMI_MASK); 3349 3398 SBIG_UINT(pdata, 8, 3350 (uint64_t)conn->se rver_info->utok.uid);3399 (uint64_t)conn->session_info->utok.uid); 3351 3400 SBIG_UINT(pdata, 16, 3352 (uint64_t)conn->se rver_info->utok.gid);3401 (uint64_t)conn->session_info->utok.gid); 3353 3402 3354 3403 … … 3365 3414 } 3366 3415 3367 SIVAL(pdata, 24, conn->se rver_info->utok.ngroups);3368 SIVAL(pdata, 28, conn->se rver_info->num_sids);3416 SIVAL(pdata, 24, conn->session_info->utok.ngroups); 3417 SIVAL(pdata, 28, conn->session_info->security_token->num_sids); 3369 3418 3370 3419 /* We walk the SID list twice, but this call is fairly … … 3373 3422 */ 3374 3423 for (i = 0, sid_bytes = 0; 3375 i < conn->se rver_info->ptok->num_sids; ++i) {3424 i < conn->session_info->security_token->num_sids; ++i) { 3376 3425 sid_bytes += ndr_size_dom_sid( 3377 &conn->server_info->ptok->user_sids[i], 3378 NULL, 3426 &conn->session_info->security_token->sids[i], 3379 3427 0); 3380 3428 } … … 3388 3436 3389 3437 /* GID list */ 3390 for (i = 0; i < conn->se rver_info->utok.ngroups; ++i) {3438 for (i = 0; i < conn->session_info->utok.ngroups; ++i) { 3391 3439 SBIG_UINT(pdata, data_len, 3392 (uint64_t)conn->se rver_info->utok.groups[i]);3440 (uint64_t)conn->session_info->utok.groups[i]); 3393 3441 data_len += 8; 3394 3442 } … … 3396 3444 /* SID list */ 3397 3445 for (i = 0; 3398 i < conn->se rver_info->ptok->num_sids; ++i) {3446 i < conn->session_info->security_token->num_sids; ++i) { 3399 3447 int sid_len = ndr_size_dom_sid( 3400 &conn->server_info->ptok->user_sids[i], 3401 NULL, 3448 &conn->session_info->security_token->sids[i], 3402 3449 0); 3403 3450 3404 3451 sid_linearize(pdata + data_len, sid_len, 3405 &conn->se rver_info->ptok->user_sids[i]);3452 &conn->session_info->security_token->sids[i]); 3406 3453 data_len += sid_len; 3407 3454 } … … 3602 3649 } 3603 3650 3651 if (req->sconn->smb1.echo_handler.trusted_fde) { 3652 DEBUG( 2,("call_trans2setfsinfo: " 3653 "request transport encryption disabled" 3654 "with 'fork echo handler = yes'\n")); 3655 reply_nterror( 3656 req, 3657 NT_STATUS_NOT_SUPPORTED); 3658 return; 3659 } 3660 3604 3661 DEBUG( 4,("call_trans2setfsinfo: " 3605 3662 "request transport encryption.\n")); … … 3645 3702 3646 3703 /* access check */ 3647 if (((conn->server_info->utok.uid != sec_initial_uid()) && !conn->admin_user) 3648 ||!CAN_WRITE(conn)) { 3704 if ((get_current_uid(conn) != 0) || !CAN_WRITE(conn)) { 3649 3705 DEBUG(0,("set_user_quota: access_denied service [%s] user [%s]\n", 3650 3706 lp_servicename(SNUM(conn)), 3651 conn->se rver_info->unix_name));3707 conn->session_info->unix_name)); 3652 3708 reply_nterror(req, NT_STATUS_ACCESS_DENIED); 3653 3709 return; … … 3680 3736 3681 3737 /* the soft quotas 8 bytes (uint64_t)*/ 3682 quotas.softlim = (uint64_t)IVAL(pdata,24); 3683 #ifdef LARGE_SMB_OFF_T 3684 quotas.softlim |= (((uint64_t)IVAL(pdata,28)) << 32); 3685 #else /* LARGE_SMB_OFF_T */ 3686 if ((IVAL(pdata,28) != 0)&& 3687 ((quotas.softlim != 0xFFFFFFFF)|| 3688 (IVAL(pdata,28)!=0xFFFFFFFF))) { 3689 /* more than 32 bits? */ 3690 reply_nterror( 3691 req, 3692 NT_STATUS_INVALID_PARAMETER); 3693 return; 3694 } 3695 #endif /* LARGE_SMB_OFF_T */ 3738 quotas.softlim = BVAL(pdata,24); 3696 3739 3697 3740 /* the hard quotas 8 bytes (uint64_t)*/ 3698 quotas.hardlim = (uint64_t)IVAL(pdata,32); 3699 #ifdef LARGE_SMB_OFF_T 3700 quotas.hardlim |= (((uint64_t)IVAL(pdata,36)) << 32); 3701 #else /* LARGE_SMB_OFF_T */ 3702 if ((IVAL(pdata,36) != 0)&& 3703 ((quotas.hardlim != 0xFFFFFFFF)|| 3704 (IVAL(pdata,36)!=0xFFFFFFFF))) { 3705 /* more than 32 bits? */ 3706 reply_nterror( 3707 req, 3708 NT_STATUS_INVALID_PARAMETER); 3709 return; 3710 } 3711 #endif /* LARGE_SMB_OFF_T */ 3741 quotas.hardlim = BVAL(pdata,32); 3712 3742 3713 3743 /* quota_flags 2 bytes **/ … … 4163 4193 bool delete_pending, 4164 4194 struct timespec write_time_ts, 4165 bool ms_dfs_link,4166 4195 struct ea_list *ea_list, 4167 4196 int lock_data_count, … … 4198 4227 info_level, max_data_bytes)); 4199 4228 4200 if (ms_dfs_link) { 4201 mode = dos_mode_msdfs(conn, smb_fname); 4202 } else { 4203 mode = dos_mode(conn, smb_fname); 4204 } 4205 4229 mode = dos_mode(conn, smb_fname); 4206 4230 nlink = psbuf->st_ex_nlink; 4207 4231 4208 if (nlink && (mode& aDIR)) {4232 if (nlink && (mode&FILE_ATTRIBUTE_DIRECTORY)) { 4209 4233 nlink = 1; 4210 4234 } … … 4281 4305 files_struct *fsp1; 4282 4306 struct file_id fileid = vfs_file_id_from_sbuf(conn, psbuf); 4283 fsp1 = file_find_di_first( fileid);4307 fsp1 = file_find_di_first(conn->sconn, fileid); 4284 4308 if (fsp1 && fsp1->initial_allocation_size) { 4285 4309 allocation_size = SMB_VFS_GET_ALLOC_SIZE(conn, fsp1, psbuf); … … 4287 4311 } 4288 4312 4289 if (!(mode & aDIR)) {4313 if (!(mode & FILE_ATTRIBUTE_DIRECTORY)) { 4290 4314 file_size = get_file_size_stat(psbuf); 4291 4315 } … … 4457 4481 SIVAL(pdata,16,nlink); 4458 4482 SCVAL(pdata,20,delete_pending?1:0); 4459 SCVAL(pdata,21,(mode& aDIR)?1:0);4483 SCVAL(pdata,21,(mode&FILE_ATTRIBUTE_DIRECTORY)?1:0); 4460 4484 SSVAL(pdata,22,0); /* Padding. */ 4461 4485 break; … … 4540 4564 SIVAL(pdata,16,nlink); 4541 4565 SCVAL(pdata,20,delete_pending); 4542 SCVAL(pdata,21,(mode& aDIR)?1:0);4566 SCVAL(pdata,21,(mode&FILE_ATTRIBUTE_DIRECTORY)?1:0); 4543 4567 SSVAL(pdata,22,0); 4544 4568 pdata += 24; … … 4571 4595 SIVAL(pdata, 0x38, nlink); 4572 4596 SCVAL(pdata, 0x3C, delete_pending); 4573 SCVAL(pdata, 0x3D, (mode& aDIR)?1:0);4597 SCVAL(pdata, 0x3D, (mode&FILE_ATTRIBUTE_DIRECTORY)?1:0); 4574 4598 SSVAL(pdata, 0x3E, 0); /* padding */ 4575 4599 SBVAL(pdata, 0x40, file_index); … … 4721 4745 data_size = PTR_DIFF(pdata,(*ppdata)); 4722 4746 4723 { 4724 int i; 4725 DEBUG(4,("smbd_do_qfilepathinfo: SMB_QUERY_FILE_UNIX_BASIC ")); 4726 4727 for (i=0; i<100; i++) 4728 DEBUG(4,("%d=%x, ",i, (*ppdata)[i])); 4729 DEBUG(4,("\n")); 4730 } 4747 DEBUG(4,("smbd_do_qfilepathinfo: " 4748 "SMB_QUERY_FILE_UNIX_BASIC\n")); 4749 dump_data(4, (uint8_t *)(*ppdata), data_size); 4731 4750 4732 4751 break; … … 4790 4809 uint16 num_def_acls = 0; 4791 4810 4792 if (fsp && !fsp->is_directory && (fsp->fh->fd != -1)) {4811 if (fsp && fsp->fh->fd != -1) { 4793 4812 file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp); 4794 4813 } else { … … 4879 4898 uint64_t count; 4880 4899 uint64_t offset; 4881 uint 32 lock_pid;4900 uint64_t smblctx; 4882 4901 enum brl_type lock_type; 4883 4902 4884 4903 /* We need an open file with a real fd for this. */ 4885 if (!fsp || fsp-> is_directory || fsp->fh->fd == -1) {4904 if (!fsp || fsp->fh->fd == -1) { 4886 4905 return NT_STATUS_INVALID_LEVEL; 4887 4906 } … … 4904 4923 } 4905 4924 4906 lock_pid =IVAL(pdata, POSIX_LOCK_PID_OFFSET);4925 smblctx = (uint64_t)IVAL(pdata, POSIX_LOCK_PID_OFFSET); 4907 4926 #if defined(HAVE_LONGLONG) 4908 4927 offset = (((uint64_t) IVAL(pdata,(POSIX_LOCK_START_OFFSET+4))) << 32) | … … 4916 4935 4917 4936 status = query_lock(fsp, 4918 & lock_pid,4937 &smblctx, 4919 4938 &count, 4920 4939 &offset, … … 4928 4947 SSVAL(pdata, POSIX_LOCK_TYPE_OFFSET, lock_type); 4929 4948 SSVAL(pdata, POSIX_LOCK_FLAGS_OFFSET, 0); 4930 SIVAL(pdata, POSIX_LOCK_PID_OFFSET, lock_pid);4949 SIVAL(pdata, POSIX_LOCK_PID_OFFSET, (uint32_t)smblctx); 4931 4950 #if defined(HAVE_LONGLONG) 4932 4951 SIVAL(pdata, POSIX_LOCK_START_OFFSET, (uint32)(offset & 0xFFFFFFFF)); … … 4984 5003 int lock_data_count = 0; 4985 5004 char *lock_data = NULL; 4986 bool ms_dfs_link = false;4987 5005 NTSTATUS status = NT_STATUS_OK; 4988 5006 … … 5037 5055 /* We know this name is ok, it's already passed the checks. */ 5038 5056 5039 } else if(fsp-> is_directory || fsp->fh->fd == -1) {5057 } else if(fsp->fh->fd == -1) { 5040 5058 /* 5041 5059 * This is actually a QFILEINFO on a directory … … 5067 5085 5068 5086 fileid = vfs_file_id_from_sbuf(conn, &smb_fname->st); 5069 get_file_infos(fileid, &delete_pending, &write_time_ts);5087 get_file_infos(fileid, fsp->name_hash, &delete_pending, &write_time_ts); 5070 5088 } else { 5071 5089 /* 5072 5090 * Original code - this is an open file. 5073 5091 */ 5074 if (!check_fsp(conn, req, fsp)) {5075 return;5076 }5077 5078 5092 if (SMB_VFS_FSTAT(fsp, &smb_fname->st) != 0) { 5079 5093 DEBUG(3, ("fstat of fnum %d failed (%s)\n", … … 5084 5098 } 5085 5099 fileid = vfs_file_id_from_sbuf(conn, &smb_fname->st); 5086 get_file_infos(fileid, &delete_pending, &write_time_ts);5100 get_file_infos(fileid, fsp->name_hash, &delete_pending, &write_time_ts); 5087 5101 } 5088 5102 5089 5103 } else { 5104 uint32_t name_hash; 5090 5105 char *fname = NULL; 5091 5106 … … 5174 5189 } 5175 5190 5191 status = file_name_hash(conn, 5192 smb_fname_str_dbg(smb_fname_base), 5193 &name_hash); 5194 if (!NT_STATUS_IS_OK(status)) { 5195 TALLOC_FREE(smb_fname_base); 5196 reply_nterror(req, status); 5197 return; 5198 } 5199 5176 5200 fileid = vfs_file_id_from_sbuf(conn, 5177 5201 &smb_fname_base->st); 5178 5202 TALLOC_FREE(smb_fname_base); 5179 get_file_infos(fileid, &delete_pending, NULL);5203 get_file_infos(fileid, name_hash, &delete_pending, NULL); 5180 5204 if (delete_pending) { 5181 5205 reply_nterror(req, NT_STATUS_DELETE_PENDING); … … 5196 5220 } 5197 5221 5198 } else if (!VALID_STAT(smb_fname->st) && 5199 SMB_VFS_STAT(conn, smb_fname) && 5200 (info_level != SMB_INFO_IS_NAME_VALID)) { 5201 ms_dfs_link = check_msdfs_link(conn, 5202 smb_fname->base_name, 5203 &smb_fname->st); 5204 5205 if (!ms_dfs_link) { 5222 } else { 5223 if (SMB_VFS_STAT(conn, smb_fname) != 0) { 5206 5224 DEBUG(3,("call_trans2qfilepathinfo: " 5207 5225 "SMB_VFS_STAT of %s failed (%s)\n", … … 5214 5232 } 5215 5233 5234 status = file_name_hash(conn, 5235 smb_fname_str_dbg(smb_fname), 5236 &name_hash); 5237 if (!NT_STATUS_IS_OK(status)) { 5238 reply_nterror(req, status); 5239 return; 5240 } 5241 5216 5242 fileid = vfs_file_id_from_sbuf(conn, &smb_fname->st); 5217 get_file_infos(fileid, &delete_pending, &write_time_ts);5243 get_file_infos(fileid, name_hash, &delete_pending, &write_time_ts); 5218 5244 if (delete_pending) { 5219 5245 reply_nterror(req, NT_STATUS_DELETE_PENDING); … … 5327 5353 fsp, smb_fname, 5328 5354 delete_pending, write_time_ts, 5329 ms_dfs_link,ea_list,5355 ea_list, 5330 5356 lock_data_count, lock_data, 5331 5357 req->flags2, max_data_bytes, … … 5349 5375 NTSTATUS hardlink_internals(TALLOC_CTX *ctx, 5350 5376 connection_struct *conn, 5377 struct smb_request *req, 5378 bool overwrite_if_exists, 5351 5379 const struct smb_filename *smb_fname_old, 5352 conststruct smb_filename *smb_fname_new)5380 struct smb_filename *smb_fname_new) 5353 5381 { 5354 5382 NTSTATUS status = NT_STATUS_OK; … … 5359 5387 } 5360 5388 5361 /* Disallow if newname already exists. */5362 5389 if (VALID_STAT(smb_fname_new->st)) { 5363 return NT_STATUS_OBJECT_NAME_COLLISION; 5390 if (overwrite_if_exists) { 5391 if (S_ISDIR(smb_fname_new->st.st_ex_mode)) { 5392 return NT_STATUS_FILE_IS_A_DIRECTORY; 5393 } 5394 status = unlink_internals(conn, 5395 req, 5396 FILE_ATTRIBUTE_NORMAL, 5397 smb_fname_new, 5398 false); 5399 if (!NT_STATUS_IS_OK(status)) { 5400 return status; 5401 } 5402 } else { 5403 /* Disallow if newname already exists. */ 5404 return NT_STATUS_OBJECT_NAME_COLLISION; 5405 } 5364 5406 } 5365 5407 … … 5408 5450 } 5409 5451 5452 if (fsp && !(fsp->access_mask & FILE_WRITE_ATTRIBUTES)) { 5453 return NT_STATUS_ACCESS_DENIED; 5454 } 5455 5410 5456 /* get some defaults (no modifications) if any info is zero or -1. */ 5411 5457 if (null_timespec(ft->create_time)) { … … 5511 5557 if (dosmode) { 5512 5558 if (S_ISDIR(smb_fname_base->st.st_ex_mode)) { 5513 dosmode |= aDIR;5559 dosmode |= FILE_ATTRIBUTE_DIRECTORY; 5514 5560 } else { 5515 dosmode &= ~ aDIR;5561 dosmode &= ~FILE_ATTRIBUTE_DIRECTORY; 5516 5562 } 5517 5563 } … … 5561 5607 } 5562 5608 5609 if (fsp && !(fsp->access_mask & FILE_WRITE_DATA)) { 5610 return NT_STATUS_ACCESS_DENIED; 5611 } 5612 5563 5613 DEBUG(6,("smb_set_file_size: size: %.0f ", (double)size)); 5564 5614 … … 5591 5641 0, /* root_dir_fid */ 5592 5642 smb_fname_tmp, /* fname */ 5593 FILE_WRITE_ ATTRIBUTES, /* access_mask */5643 FILE_WRITE_DATA, /* access_mask */ 5594 5644 (FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */ 5595 5645 FILE_SHARE_DELETE), … … 5599 5649 FORCE_OPLOCK_BREAK_TO_NONE, /* oplock_request */ 5600 5650 0, /* allocation_size */ 5651 0, /* private_flags */ 5601 5652 NULL, /* sd */ 5602 5653 NULL, /* ea_list */ … … 5666 5717 return NT_STATUS_INVALID_PARAMETER; 5667 5718 } 5719 5720 if (fsp && !(fsp->access_mask & FILE_WRITE_EA)) { 5721 return NT_STATUS_ACCESS_DENIED; 5722 } 5723 5668 5724 status = set_ea(conn, fsp, smb_fname, ea_list); 5669 5725 … … 5708 5764 return NT_STATUS_INVALID_PARAMETER; 5709 5765 } 5766 5767 if (fsp && !(fsp->access_mask & FILE_WRITE_EA)) { 5768 return NT_STATUS_ACCESS_DENIED; 5769 } 5770 5710 5771 status = set_ea(conn, fsp, fsp->fsp_name, ea_list); 5711 5772 … … 5758 5819 /* The set is across all open files on this dev/inode pair. */ 5759 5820 if (!set_delete_on_close(fsp, delete_on_close, 5760 &conn->se rver_info->utok)) {5821 &conn->session_info->utok)) { 5761 5822 return NT_STATUS_ACCESS_DENIED; 5762 5823 } … … 5870 5931 struct smb_request *req, 5871 5932 const char *pdata, int total_data, 5872 conststruct smb_filename *smb_fname_new)5933 struct smb_filename *smb_fname_new) 5873 5934 { 5874 5935 char *oldname = NULL; … … 5902 5963 } 5903 5964 5904 return hardlink_internals(ctx, conn, smb_fname_old, smb_fname_new); 5965 return hardlink_internals(ctx, conn, req, false, 5966 smb_fname_old, smb_fname_new); 5967 } 5968 5969 /**************************************************************************** 5970 Deal with SMB2_FILE_RENAME_INFORMATION_INTERNAL 5971 ****************************************************************************/ 5972 5973 static NTSTATUS smb2_file_rename_information(connection_struct *conn, 5974 struct smb_request *req, 5975 const char *pdata, 5976 int total_data, 5977 files_struct *fsp, 5978 struct smb_filename *smb_fname_src) 5979 { 5980 bool overwrite; 5981 uint32_t len; 5982 char *newname = NULL; 5983 struct smb_filename *smb_fname_dst = NULL; 5984 NTSTATUS status = NT_STATUS_OK; 5985 TALLOC_CTX *ctx = talloc_tos(); 5986 5987 if (!fsp) { 5988 return NT_STATUS_INVALID_HANDLE; 5989 } 5990 5991 if (total_data < 20) { 5992 return NT_STATUS_INVALID_PARAMETER; 5993 } 5994 5995 overwrite = (CVAL(pdata,0) ? True : False); 5996 len = IVAL(pdata,16); 5997 5998 if (len > (total_data - 20) || (len == 0)) { 5999 return NT_STATUS_INVALID_PARAMETER; 6000 } 6001 6002 srvstr_get_path(ctx, pdata, req->flags2, &newname, 6003 &pdata[20], len, STR_TERMINATE, 6004 &status); 6005 if (!NT_STATUS_IS_OK(status)) { 6006 return status; 6007 } 6008 6009 DEBUG(10,("smb2_file_rename_information: got name |%s|\n", 6010 newname)); 6011 6012 status = filename_convert(ctx, 6013 conn, 6014 req->flags2 & FLAGS2_DFS_PATHNAMES, 6015 newname, 6016 UCF_SAVE_LCOMP, 6017 NULL, 6018 &smb_fname_dst); 6019 if (!NT_STATUS_IS_OK(status)) { 6020 return status; 6021 } 6022 6023 if (fsp->base_fsp) { 6024 /* newname must be a stream name. */ 6025 if (newname[0] != ':') { 6026 return NT_STATUS_NOT_SUPPORTED; 6027 } 6028 6029 /* Create an smb_fname to call rename_internals_fsp() with. */ 6030 status = create_synthetic_smb_fname(talloc_tos(), 6031 fsp->base_fsp->fsp_name->base_name, newname, NULL, 6032 &smb_fname_dst); 6033 if (!NT_STATUS_IS_OK(status)) { 6034 goto out; 6035 } 6036 6037 /* 6038 * Set the original last component, since 6039 * rename_internals_fsp() requires it. 6040 */ 6041 smb_fname_dst->original_lcomp = talloc_strdup(smb_fname_dst, 6042 newname); 6043 if (smb_fname_dst->original_lcomp == NULL) { 6044 status = NT_STATUS_NO_MEMORY; 6045 goto out; 6046 } 6047 6048 } 6049 6050 DEBUG(10,("smb2_file_rename_information: " 6051 "SMB_FILE_RENAME_INFORMATION (fnum %d) %s -> %s\n", 6052 fsp->fnum, fsp_str_dbg(fsp), 6053 smb_fname_str_dbg(smb_fname_dst))); 6054 status = rename_internals_fsp(conn, fsp, smb_fname_dst, 6055 (FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM), 6056 overwrite); 6057 6058 out: 6059 TALLOC_FREE(smb_fname_dst); 6060 return status; 6061 } 6062 6063 static NTSTATUS smb_file_link_information(connection_struct *conn, 6064 struct smb_request *req, 6065 const char *pdata, 6066 int total_data, 6067 files_struct *fsp, 6068 struct smb_filename *smb_fname_src) 6069 { 6070 bool overwrite; 6071 uint32_t len; 6072 char *newname = NULL; 6073 struct smb_filename *smb_fname_dst = NULL; 6074 NTSTATUS status = NT_STATUS_OK; 6075 TALLOC_CTX *ctx = talloc_tos(); 6076 6077 if (!fsp) { 6078 return NT_STATUS_INVALID_HANDLE; 6079 } 6080 6081 if (total_data < 20) { 6082 return NT_STATUS_INVALID_PARAMETER; 6083 } 6084 6085 overwrite = (CVAL(pdata,0) ? true : false); 6086 len = IVAL(pdata,16); 6087 6088 if (len > (total_data - 20) || (len == 0)) { 6089 return NT_STATUS_INVALID_PARAMETER; 6090 } 6091 6092 srvstr_get_path(ctx, pdata, req->flags2, &newname, 6093 &pdata[20], len, STR_TERMINATE, 6094 &status); 6095 if (!NT_STATUS_IS_OK(status)) { 6096 return status; 6097 } 6098 6099 DEBUG(10,("smb_file_link_information: got name |%s|\n", 6100 newname)); 6101 6102 status = filename_convert(ctx, 6103 conn, 6104 req->flags2 & FLAGS2_DFS_PATHNAMES, 6105 newname, 6106 UCF_SAVE_LCOMP, 6107 NULL, 6108 &smb_fname_dst); 6109 if (!NT_STATUS_IS_OK(status)) { 6110 return status; 6111 } 6112 6113 if (fsp->base_fsp) { 6114 /* No stream names. */ 6115 return NT_STATUS_NOT_SUPPORTED; 6116 } 6117 6118 DEBUG(10,("smb_file_link_information: " 6119 "SMB_FILE_LINK_INFORMATION (fnum %d) %s -> %s\n", 6120 fsp->fnum, fsp_str_dbg(fsp), 6121 smb_fname_str_dbg(smb_fname_dst))); 6122 status = hardlink_internals(ctx, 6123 conn, 6124 req, 6125 overwrite, 6126 fsp->fsp_name, 6127 smb_fname_dst); 6128 6129 TALLOC_FREE(smb_fname_dst); 6130 return status; 5905 6131 } 5906 6132 … … 6013 6239 p[1] = '\0'; 6014 6240 } else { 6015 base_name = talloc_strdup(ctx, " ./");6241 base_name = talloc_strdup(ctx, ""); 6016 6242 if (!base_name) { 6017 6243 return NT_STATUS_NO_MEMORY; … … 6149 6375 uint64_t count; 6150 6376 uint64_t offset; 6151 uint 32 lock_pid;6377 uint64_t smblctx; 6152 6378 bool blocking_lock = False; 6153 6379 enum brl_type lock_type; … … 6193 6419 } 6194 6420 6195 lock_pid =IVAL(pdata, POSIX_LOCK_PID_OFFSET);6421 smblctx = (uint64_t)IVAL(pdata, POSIX_LOCK_PID_OFFSET); 6196 6422 #if defined(HAVE_LONGLONG) 6197 6423 offset = (((uint64_t) IVAL(pdata,(POSIX_LOCK_START_OFFSET+4))) << 32) | … … 6205 6431 6206 6432 DEBUG(10,("smb_set_posix_lock: file %s, lock_type = %u," 6207 " lock_pid = %u, count = %.0f, offset = %.0f\n",6433 "smblctx = %llu, count = %.0f, offset = %.0f\n", 6208 6434 fsp_str_dbg(fsp), 6209 6435 (unsigned int)lock_type, 6210 (unsigned int)lock_pid,6436 (unsigned long long)smblctx, 6211 6437 (double)count, 6212 6438 (double)offset )); 6213 6439 6214 6440 if (lock_type == UNLOCK_LOCK) { 6215 status = do_unlock( smbd_messaging_context(),6441 status = do_unlock(req->sconn->msg_ctx, 6216 6442 fsp, 6217 lock_pid,6443 smblctx, 6218 6444 count, 6219 6445 offset, 6220 6446 POSIX_LOCK); 6221 6447 } else { 6222 uint 32 block_smbpid;6223 6224 struct byte_range_lock *br_lck = do_lock( smbd_messaging_context(),6448 uint64_t block_smblctx; 6449 6450 struct byte_range_lock *br_lck = do_lock(req->sconn->msg_ctx, 6225 6451 fsp, 6226 lock_pid,6452 smblctx, 6227 6453 count, 6228 6454 offset, … … 6231 6457 blocking_lock, 6232 6458 &status, 6233 &block_smb pid,6459 &block_smblctx, 6234 6460 NULL); 6235 6461 … … 6245 6471 -1, /* infinite timeout. */ 6246 6472 0, 6247 lock_pid,6473 smblctx, 6248 6474 lock_type, 6249 6475 POSIX_LOCK, 6250 6476 offset, 6251 6477 count, 6252 block_smb pid)) {6478 block_smblctx)) { 6253 6479 TALLOC_FREE(br_lck); 6254 6480 return status; … … 6282 6508 } 6283 6509 6510 if (fsp && !(fsp->access_mask & FILE_WRITE_ATTRIBUTES)) { 6511 return NT_STATUS_ACCESS_DENIED; 6512 } 6513 6284 6514 /* Set the attributes */ 6285 6515 dosmode = IVAL(pdata,32); … … 6324 6554 if (total_data < 12) { 6325 6555 return NT_STATUS_INVALID_PARAMETER; 6556 } 6557 6558 if (fsp && !(fsp->access_mask & FILE_WRITE_ATTRIBUTES)) { 6559 return NT_STATUS_ACCESS_DENIED; 6326 6560 } 6327 6561 … … 6382 6616 if (allocation_size) { 6383 6617 allocation_size = smb_roundup(conn, allocation_size); 6618 } 6619 6620 if (fsp && !(fsp->access_mask & FILE_WRITE_DATA)) { 6621 return NT_STATUS_ACCESS_DENIED; 6384 6622 } 6385 6623 … … 6419 6657 FORCE_OPLOCK_BREAK_TO_NONE, /* oplock_request */ 6420 6658 0, /* allocation_size */ 6659 0, /* private_flags */ 6421 6660 NULL, /* sd */ 6422 6661 NULL, /* ea_list */ … … 6479 6718 "file %s to %.0f\n", smb_fname_str_dbg(smb_fname), 6480 6719 (double)size)); 6720 6721 if (fsp && !(fsp->access_mask & FILE_WRITE_DATA)) { 6722 return NT_STATUS_ACCESS_DENIED; 6723 } 6481 6724 6482 6725 return smb_set_file_size(conn, req, … … 6784 7027 6785 7028 id = vfs_file_id_from_sbuf(conn, &sbuf); 6786 for(all_fsps = file_find_di_first( id); all_fsps;7029 for(all_fsps = file_find_di_first(conn->sconn, id); all_fsps; 6787 7030 all_fsps = file_find_di_next(all_fsps)) { 6788 7031 /* … … 6928 7171 0, /* oplock_request */ 6929 7172 0, /* allocation_size */ 7173 0, /* private_flags */ 6930 7174 NULL, /* sd */ 6931 7175 NULL, /* ea_list */ … … 6984 7228 Open/Create a file with POSIX semantics. 6985 7229 ****************************************************************************/ 7230 7231 #define SMB_O_RDONLY_MAPPING (FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA) 7232 #define SMB_O_WRONLY_MAPPING (FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA) 6986 7233 6987 7234 static NTSTATUS smb_posix_open(connection_struct *conn, … … 7000 7247 uint32 create_disp = 0; 7001 7248 uint32 access_mask = 0; 7002 uint32 create_options = 0;7249 uint32 create_options = FILE_NON_DIRECTORY_FILE; 7003 7250 NTSTATUS status = NT_STATUS_OK; 7004 7251 mode_t unixmode = (mode_t)0; … … 7030 7277 switch (wire_open_mode & SMB_ACCMODE) { 7031 7278 case SMB_O_RDONLY: 7032 access_mask = FILE_READ_DATA;7279 access_mask = SMB_O_RDONLY_MAPPING; 7033 7280 break; 7034 7281 case SMB_O_WRONLY: 7035 access_mask = FILE_WRITE_DATA;7282 access_mask = SMB_O_WRONLY_MAPPING; 7036 7283 break; 7037 7284 case SMB_O_RDWR: 7038 access_mask = FILE_READ_DATA|FILE_WRITE_DATA; 7285 access_mask = (SMB_O_RDONLY_MAPPING| 7286 SMB_O_WRONLY_MAPPING); 7039 7287 break; 7040 7288 default: … … 7121 7369 } 7122 7370 7371 if ((wire_open_mode & SMB_O_DIRECTORY) || 7372 VALID_STAT_OF_DIR(smb_fname->st)) { 7373 if (access_mask != SMB_O_RDONLY_MAPPING) { 7374 return NT_STATUS_FILE_IS_A_DIRECTORY; 7375 } 7376 create_options &= ~FILE_NON_DIRECTORY_FILE; 7377 create_options |= FILE_DIRECTORY_FILE; 7378 } 7379 7123 7380 DEBUG(10,("smb_posix_open: file %s, smb_posix_flags = %u, mode 0%o\n", 7124 7381 smb_fname_str_dbg(smb_fname), … … 7135 7392 FILE_SHARE_DELETE), 7136 7393 create_disp, /* create_disposition*/ 7137 FILE_NON_DIRECTORY_FILE,/* create_options */7394 create_options, /* create_options */ 7138 7395 mod_unixmode, /* file_attributes */ 7139 7396 oplock_request, /* oplock_request */ 7140 7397 0, /* allocation_size */ 7398 0, /* private_flags */ 7141 7399 NULL, /* sd */ 7142 7400 NULL, /* ea_list */ … … 7268 7526 0, /* oplock_request */ 7269 7527 0, /* allocation_size */ 7528 0, /* private_flags */ 7270 7529 NULL, /* sd */ 7271 7530 NULL, /* ea_list */ … … 7528 7787 pdata, total_data, 7529 7788 fsp, smb_fname); 7789 break; 7790 } 7791 7792 case SMB2_FILE_RENAME_INFORMATION_INTERNAL: 7793 { 7794 /* SMB2 rename information. */ 7795 status = smb2_file_rename_information(conn, req, 7796 pdata, total_data, 7797 fsp, smb_fname); 7798 break; 7799 } 7800 7801 case SMB_FILE_LINK_INFORMATION: 7802 { 7803 status = smb_file_link_information(conn, req, 7804 pdata, total_data, 7805 fsp, smb_fname); 7530 7806 break; 7531 7807 } … … 7638 7914 } 7639 7915 7640 if(fsp-> is_directory || fsp->fh->fd == -1) {7916 if(fsp->fh->fd == -1) { 7641 7917 /* 7642 7918 * This is actually a SETFILEINFO on a directory … … 7670 7946 */ 7671 7947 if ((info_level == SMB_SET_FILE_DISPOSITION_INFO) && CVAL(pdata,0)) { 7672 fsp->fh->private_options |= FILE_DELETE_ON_CLOSE;7948 fsp->fh->private_options |= NTCREATEX_OPTIONS_PRIVATE_DELETE_ON_CLOSE; 7673 7949 7674 7950 DEBUG(3,("call_trans2setfilepathinfo: " … … 7690 7966 * Original code - this is an open file. 7691 7967 */ 7692 if (!check_fsp(conn, req, fsp)) {7693 return;7694 }7695 7696 7968 if (SMB_VFS_FSTAT(fsp, &smb_fname->st) != 0) { 7697 7969 DEBUG(3,("call_trans2setfilepathinfo: fstat " … … 7781 8053 return; 7782 8054 } 7783 if (blocking_lock_was_deferred (req->mid)) {8055 if (blocking_lock_was_deferred_smb1(req->sconn, req->mid)) { 7784 8056 /* We have re-scheduled this call. */ 7785 8057 return; … … 8100 8372 CAN ACCEPT THIS IN UNICODE. JRA. */ 8101 8373 8102 SSVAL(pdata,0,fsp->rap_print_jobid); /* Job number */ 8374 /* Job number */ 8375 if (fsp->print_file) { 8376 SSVAL(pdata, 0, fsp->print_file->rap_jobid); 8377 } else { 8378 SSVAL(pdata, 0, 0); 8379 } 8103 8380 srvstr_push(pdata, req->flags2, pdata + 2, 8104 8381 global_myname(), 15, … … 8123 8400 { 8124 8401 int dptr_num; 8125 struct smbd_server_connection *sconn = smbd_server_conn;8402 struct smbd_server_connection *sconn = req->sconn; 8126 8403 8127 8404 START_PROFILE(SMBfindclose);
Note:
See TracChangeset
for help on using the changeset viewer.