2 Unix SMB/CIFS implementation.
3 file opening and share modes
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Jeremy Allison 2001-2004
6 Copyright (C) Volker Lendecke 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "smbd/globals.h"
25 extern const struct generic_mapping file_generic_mapping;
27 struct deferred_open_record {
28 bool delayed_for_oplocks;
32 static NTSTATUS create_file_unixpath(connection_struct *conn,
33 struct smb_request *req,
34 struct smb_filename *smb_fname,
36 uint32_t share_access,
37 uint32_t create_disposition,
38 uint32_t create_options,
39 uint32_t file_attributes,
40 uint32_t oplock_request,
41 uint64_t allocation_size,
42 struct security_descriptor *sd,
43 struct ea_list *ea_list,
45 files_struct **result,
48 /****************************************************************************
49 SMB1 file varient of se_access_check. Never test FILE_READ_ATTRIBUTES.
50 ****************************************************************************/
52 NTSTATUS smb1_file_se_access_check(const struct security_descriptor *sd,
53 const NT_USER_TOKEN *token,
54 uint32_t access_desired,
55 uint32_t *access_granted)
57 return se_access_check(sd,
59 (access_desired & ~FILE_READ_ATTRIBUTES),
63 /****************************************************************************
64 Check if we have open rights.
65 ****************************************************************************/
67 static NTSTATUS check_open_rights(struct connection_struct *conn,
70 uint32_t *access_granted)
72 /* Check if we have rights to open. */
74 struct security_descriptor *sd;
78 if (conn->server_info->utok.uid == 0 || conn->admin_user) {
79 /* I'm sorry sir, I didn't know you were root... */
80 *access_granted = access_mask;
81 if (access_mask & SEC_FLAG_MAXIMUM_ALLOWED) {
82 *access_granted |= FILE_GENERIC_ALL;
87 status = SMB_VFS_GET_NT_ACL(conn, fname,
88 (OWNER_SECURITY_INFORMATION |
89 GROUP_SECURITY_INFORMATION |
90 DACL_SECURITY_INFORMATION),&sd);
92 if (!NT_STATUS_IS_OK(status)) {
93 DEBUG(10, ("check_open_rights: Could not get acl "
100 status = smb1_file_se_access_check(sd,
101 conn->server_info->ptok,
107 DEBUG(10,("check_open_rights: file %s requesting "
108 "0x%x returning 0x%x (%s)\n",
110 (unsigned int)access_mask,
111 (unsigned int)*access_granted,
112 nt_errstr(status) ));
117 /****************************************************************************
118 fd support routines - attempt to do a dos_open.
119 ****************************************************************************/
121 static NTSTATUS fd_open(struct connection_struct *conn,
122 struct smb_filename *smb_fname,
127 NTSTATUS status = NT_STATUS_OK;
131 * Never follow symlinks on a POSIX client. The
132 * client should be doing this.
135 if (fsp->posix_open || !lp_symlinks(SNUM(conn))) {
140 fsp->fh->fd = SMB_VFS_OPEN(conn, smb_fname, fsp, flags, mode);
141 if (fsp->fh->fd == -1) {
142 status = map_nt_error_from_unix(errno);
143 if (errno == EMFILE) {
144 static time_t last_warned = 0L;
146 if (time((time_t *) NULL) > last_warned) {
147 DEBUG(0,("Too many open files, unable "
148 "to open more! smbd's max "
150 lp_max_open_files()));
151 last_warned = time((time_t *) NULL);
157 DEBUG(10,("fd_open: name %s, flags = 0%o mode = 0%o, fd = %d. %s\n",
158 smb_fname_str_dbg(smb_fname), flags, (int)mode, fsp->fh->fd,
159 (fsp->fh->fd == -1) ? strerror(errno) : "" ));
164 /****************************************************************************
165 Close the file associated with a fsp.
166 ****************************************************************************/
168 NTSTATUS fd_close(files_struct *fsp)
172 if (fsp->fh->fd == -1) {
173 return NT_STATUS_OK; /* What we used to call a stat open. */
175 if (fsp->fh->ref_count > 1) {
176 return NT_STATUS_OK; /* Shared handle. Only close last reference. */
179 ret = SMB_VFS_CLOSE(fsp);
182 return map_nt_error_from_unix(errno);
187 /****************************************************************************
188 Change the ownership of a file to that of the parent directory.
189 Do this by fd if possible.
190 ****************************************************************************/
192 void change_file_owner_to_parent(connection_struct *conn,
193 const char *inherit_from_dir,
196 SMB_STRUCT_STAT parent_st;
199 ret = SMB_VFS_STAT(conn, inherit_from_dir, &parent_st);
201 DEBUG(0,("change_file_owner_to_parent: failed to stat parent "
202 "directory %s. Error was %s\n",
203 inherit_from_dir, strerror(errno) ));
208 ret = SMB_VFS_FCHOWN(fsp, parent_st.st_ex_uid, (gid_t)-1);
211 DEBUG(0,("change_file_owner_to_parent: failed to fchown "
212 "file %s to parent directory uid %u. Error "
213 "was %s\n", fsp->fsp_name,
214 (unsigned int)parent_st.st_ex_uid,
218 DEBUG(10,("change_file_owner_to_parent: changed new file %s to "
219 "parent directory uid %u.\n", fsp->fsp_name,
220 (unsigned int)parent_st.st_ex_uid ));
223 NTSTATUS change_dir_owner_to_parent(connection_struct *conn,
224 const char *inherit_from_dir,
226 SMB_STRUCT_STAT *psbuf)
228 char *saved_dir = NULL;
229 SMB_STRUCT_STAT sbuf;
230 SMB_STRUCT_STAT parent_st;
231 TALLOC_CTX *ctx = talloc_tos();
232 NTSTATUS status = NT_STATUS_OK;
235 ret = SMB_VFS_STAT(conn, inherit_from_dir, &parent_st);
237 status = map_nt_error_from_unix(errno);
238 DEBUG(0,("change_dir_owner_to_parent: failed to stat parent "
239 "directory %s. Error was %s\n",
240 inherit_from_dir, strerror(errno) ));
244 /* We've already done an lstat into psbuf, and we know it's a
245 directory. If we can cd into the directory and the dev/ino
246 are the same then we can safely chown without races as
247 we're locking the directory in place by being in it. This
248 should work on any UNIX (thanks tridge :-). JRA.
251 saved_dir = vfs_GetWd(ctx,conn);
253 status = map_nt_error_from_unix(errno);
254 DEBUG(0,("change_dir_owner_to_parent: failed to get "
255 "current working directory. Error was %s\n",
260 /* Chdir into the new path. */
261 if (vfs_ChDir(conn, fname) == -1) {
262 status = map_nt_error_from_unix(errno);
263 DEBUG(0,("change_dir_owner_to_parent: failed to change "
264 "current working directory to %s. Error "
265 "was %s\n", fname, strerror(errno) ));
269 if (SMB_VFS_STAT(conn,".",&sbuf) == -1) {
270 status = map_nt_error_from_unix(errno);
271 DEBUG(0,("change_dir_owner_to_parent: failed to stat "
272 "directory '.' (%s) Error was %s\n",
273 fname, strerror(errno)));
277 /* Ensure we're pointing at the same place. */
278 if (sbuf.st_ex_dev != psbuf->st_ex_dev ||
279 sbuf.st_ex_ino != psbuf->st_ex_ino ||
280 sbuf.st_ex_mode != psbuf->st_ex_mode ) {
281 DEBUG(0,("change_dir_owner_to_parent: "
282 "device/inode/mode on directory %s changed. "
283 "Refusing to chown !\n", fname ));
284 status = NT_STATUS_ACCESS_DENIED;
289 ret = SMB_VFS_CHOWN(conn, ".", parent_st.st_ex_uid, (gid_t)-1);
292 status = map_nt_error_from_unix(errno);
293 DEBUG(10,("change_dir_owner_to_parent: failed to chown "
294 "directory %s to parent directory uid %u. "
295 "Error was %s\n", fname,
296 (unsigned int)parent_st.st_ex_uid, strerror(errno) ));
300 DEBUG(10,("change_dir_owner_to_parent: changed ownership of new "
301 "directory %s to parent directory uid %u.\n",
302 fname, (unsigned int)parent_st.st_ex_uid ));
306 vfs_ChDir(conn,saved_dir);
310 /****************************************************************************
312 ****************************************************************************/
314 static NTSTATUS open_file(files_struct *fsp,
315 connection_struct *conn,
316 struct smb_request *req,
317 const char *parent_dir,
318 struct smb_filename *smb_fname,
321 uint32 access_mask, /* client requested access mask. */
322 uint32 open_access_mask) /* what we're actually using in the open. */
325 NTSTATUS status = NT_STATUS_OK;
326 int accmode = (flags & O_ACCMODE);
327 int local_flags = flags;
328 bool file_existed = VALID_STAT(smb_fname->st);
333 status = get_full_smb_filename(talloc_tos(), smb_fname,
335 if (!NT_STATUS_IS_OK(status)) {
339 /* Check permissions */
342 * This code was changed after seeing a client open request
343 * containing the open mode of (DENY_WRITE/read-only) with
344 * the 'create if not exist' bit set. The previous code
345 * would fail to open the file read only on a read-only share
346 * as it was checking the flags parameter directly against O_RDONLY,
347 * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
351 if (!CAN_WRITE(conn)) {
352 /* It's a read-only share - fail if we wanted to write. */
353 if(accmode != O_RDONLY || (flags & O_TRUNC) || (flags & O_APPEND)) {
354 DEBUG(3,("Permission denied opening %s\n",
355 smb_fname_str_dbg(smb_fname)));
356 return NT_STATUS_ACCESS_DENIED;
357 } else if(flags & O_CREAT) {
358 /* We don't want to write - but we must make sure that
359 O_CREAT doesn't create the file if we have write
360 access into the directory.
362 flags &= ~(O_CREAT|O_EXCL);
363 local_flags &= ~(O_CREAT|O_EXCL);
368 * This little piece of insanity is inspired by the
369 * fact that an NT client can open a file for O_RDONLY,
370 * but set the create disposition to FILE_EXISTS_TRUNCATE.
371 * If the client *can* write to the file, then it expects to
372 * truncate the file, even though it is opening for readonly.
373 * Quicken uses this stupid trick in backup file creation...
374 * Thanks *greatly* to "David W. Chapman Jr." <dwcjr@inethouston.net>
375 * for helping track this one down. It didn't bite us in 2.0.x
376 * as we always opened files read-write in that release. JRA.
379 if ((accmode == O_RDONLY) && ((flags & O_TRUNC) == O_TRUNC)) {
380 DEBUG(10,("open_file: truncate requested on read-only open "
381 "for file %s\n", smb_fname_str_dbg(smb_fname)));
382 local_flags = (flags & ~O_ACCMODE)|O_RDWR;
385 if ((open_access_mask & (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_EXECUTE)) ||
386 (!file_existed && (local_flags & O_CREAT)) ||
387 ((local_flags & O_TRUNC) == O_TRUNC) ) {
391 * We can't actually truncate here as the file may be locked.
392 * open_file_ntcreate will take care of the truncate later. JRA.
395 local_flags &= ~O_TRUNC;
397 #if defined(O_NONBLOCK) && defined(S_ISFIFO)
399 * We would block on opening a FIFO with no one else on the
400 * other end. Do what we used to do and add O_NONBLOCK to the
404 if (file_existed && S_ISFIFO(smb_fname->st.st_ex_mode)) {
405 local_flags |= O_NONBLOCK;
409 /* Don't create files with Microsoft wildcard characters. */
412 * wildcard characters are allowed in stream names
413 * only test the basefilename
415 wild = fsp->base_fsp->fsp_name;
419 if ((local_flags & O_CREAT) && !file_existed &&
421 return NT_STATUS_OBJECT_NAME_INVALID;
424 /* Actually do the open */
425 status = fd_open(conn, smb_fname, fsp, local_flags, unx_mode);
426 if (!NT_STATUS_IS_OK(status)) {
427 DEBUG(3,("Error opening file %s (%s) (local_flags=%d) "
428 "(flags=%d)\n", smb_fname_str_dbg(smb_fname),
429 nt_errstr(status),local_flags,flags));
433 if ((local_flags & O_CREAT) && !file_existed) {
435 /* Inherit the ACL if required */
436 if (lp_inherit_perms(SNUM(conn))) {
437 inherit_access_posix_acl(conn, parent_dir, path,
441 /* Change the owner if required. */
442 if (lp_inherit_owner(SNUM(conn))) {
443 change_file_owner_to_parent(conn, parent_dir,
447 notify_fname(conn, NOTIFY_ACTION_ADDED,
448 FILE_NOTIFY_CHANGE_FILE_NAME, path);
452 fsp->fh->fd = -1; /* What we used to call a stat open. */
454 uint32_t access_granted = 0;
456 status = check_open_rights(conn,
460 if (!NT_STATUS_IS_OK(status)) {
461 if (NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED)) {
463 * On NT_STATUS_ACCESS_DENIED, access_granted
464 * contains the denied bits.
467 if ((access_mask & FILE_WRITE_ATTRIBUTES) &&
468 (access_granted & FILE_WRITE_ATTRIBUTES) &&
469 (lp_map_readonly(SNUM(conn)) ||
470 lp_map_archive(SNUM(conn)) ||
471 lp_map_hidden(SNUM(conn)) ||
472 lp_map_system(SNUM(conn)))) {
473 access_granted &= ~FILE_WRITE_ATTRIBUTES;
475 DEBUG(10,("open_file: "
484 if ((access_mask & DELETE_ACCESS) &&
485 (access_granted & DELETE_ACCESS) &&
486 can_delete_file_in_directory(conn,
488 /* Were we trying to do a stat open
489 * for delete and didn't get DELETE
490 * access (only) ? Check if the
491 * directory allows DELETE_CHILD.
493 * http://blogs.msdn.com/oldnewthing/archive/2004/06/04/148426.aspx
496 access_granted &= ~DELETE_ACCESS;
498 DEBUG(10,("open_file: "
506 if (access_granted != 0) {
507 DEBUG(10,("open_file: Access "
514 } else if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND) &&
516 S_ISLNK(smb_fname->st.st_ex_mode)) {
517 /* This is a POSIX stat open for delete
518 * or rename on a symlink that points
520 DEBUG(10,("open_file: allowing POSIX "
521 "open on bad symlink %s\n",
525 DEBUG(10,("open_file: "
526 "check_open_rights on file "
528 smb_fname_str_dbg(smb_fname),
529 nt_errstr(status) ));
539 if (fsp->fh->fd == -1) {
540 ret = SMB_VFS_STAT(conn, path, &smb_fname->st);
542 ret = SMB_VFS_FSTAT(fsp, &smb_fname->st);
543 /* If we have an fd, this stat should succeed. */
545 DEBUG(0,("Error doing fstat on open file %s "
547 smb_fname_str_dbg(smb_fname),
552 /* For a non-io open, this stat failing means file not found. JRA */
554 status = map_nt_error_from_unix(errno);
561 * POSIX allows read-only opens of directories. We don't
562 * want to do this (we use a different code path for this)
563 * so catch a directory open and return an EISDIR. JRA.
566 if(S_ISDIR(smb_fname->st.st_ex_mode)) {
569 return NT_STATUS_FILE_IS_A_DIRECTORY;
572 fsp->mode = smb_fname->st.st_ex_mode;
573 fsp->file_id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
574 fsp->vuid = req ? req->vuid : UID_FIELD_INVALID;
575 fsp->file_pid = req ? req->smbpid : 0;
576 fsp->can_lock = True;
577 fsp->can_read = (access_mask & (FILE_READ_DATA)) ? True : False;
578 if (!CAN_WRITE(conn)) {
579 fsp->can_write = False;
581 fsp->can_write = (access_mask & (FILE_WRITE_DATA | FILE_APPEND_DATA)) ?
584 fsp->print_file = False;
585 fsp->modified = False;
586 fsp->sent_oplock_break = NO_BREAK_SENT;
587 fsp->is_directory = False;
588 if (conn->aio_write_behind_list &&
589 is_in_path(smb_fname->base_name, conn->aio_write_behind_list,
590 conn->case_sensitive)) {
591 fsp->aio_write_behind = True;
594 string_set(&fsp->fsp_name, path);
595 fsp->wcp = NULL; /* Write cache pointer. */
597 DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
598 conn->server_info->unix_name,
600 BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
601 conn->num_files_open));
607 /*******************************************************************
608 Return True if the filename is one of the special executable types.
609 ********************************************************************/
611 bool is_executable(const char *fname)
613 if ((fname = strrchr_m(fname,'.'))) {
614 if (strequal(fname,".com") ||
615 strequal(fname,".dll") ||
616 strequal(fname,".exe") ||
617 strequal(fname,".sym")) {
624 /****************************************************************************
625 Check if we can open a file with a share mode.
626 Returns True if conflict, False if not.
627 ****************************************************************************/
629 static bool share_conflict(struct share_mode_entry *entry,
633 DEBUG(10,("share_conflict: entry->access_mask = 0x%x, "
634 "entry->share_access = 0x%x, "
635 "entry->private_options = 0x%x\n",
636 (unsigned int)entry->access_mask,
637 (unsigned int)entry->share_access,
638 (unsigned int)entry->private_options));
640 DEBUG(10,("share_conflict: access_mask = 0x%x, share_access = 0x%x\n",
641 (unsigned int)access_mask, (unsigned int)share_access));
643 if ((entry->access_mask & (FILE_WRITE_DATA|
647 DELETE_ACCESS)) == 0) {
648 DEBUG(10,("share_conflict: No conflict due to "
649 "entry->access_mask = 0x%x\n",
650 (unsigned int)entry->access_mask ));
654 if ((access_mask & (FILE_WRITE_DATA|
658 DELETE_ACCESS)) == 0) {
659 DEBUG(10,("share_conflict: No conflict due to "
660 "access_mask = 0x%x\n",
661 (unsigned int)access_mask ));
665 #if 1 /* JRA TEST - Superdebug. */
666 #define CHECK_MASK(num, am, right, sa, share) \
667 DEBUG(10,("share_conflict: [%d] am (0x%x) & right (0x%x) = 0x%x\n", \
668 (unsigned int)(num), (unsigned int)(am), \
669 (unsigned int)(right), (unsigned int)(am)&(right) )); \
670 DEBUG(10,("share_conflict: [%d] sa (0x%x) & share (0x%x) = 0x%x\n", \
671 (unsigned int)(num), (unsigned int)(sa), \
672 (unsigned int)(share), (unsigned int)(sa)&(share) )); \
673 if (((am) & (right)) && !((sa) & (share))) { \
674 DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
675 sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
676 (unsigned int)(share) )); \
680 #define CHECK_MASK(num, am, right, sa, share) \
681 if (((am) & (right)) && !((sa) & (share))) { \
682 DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
683 sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
684 (unsigned int)(share) )); \
689 CHECK_MASK(1, entry->access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
690 share_access, FILE_SHARE_WRITE);
691 CHECK_MASK(2, access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
692 entry->share_access, FILE_SHARE_WRITE);
694 CHECK_MASK(3, entry->access_mask, FILE_READ_DATA | FILE_EXECUTE,
695 share_access, FILE_SHARE_READ);
696 CHECK_MASK(4, access_mask, FILE_READ_DATA | FILE_EXECUTE,
697 entry->share_access, FILE_SHARE_READ);
699 CHECK_MASK(5, entry->access_mask, DELETE_ACCESS,
700 share_access, FILE_SHARE_DELETE);
701 CHECK_MASK(6, access_mask, DELETE_ACCESS,
702 entry->share_access, FILE_SHARE_DELETE);
704 DEBUG(10,("share_conflict: No conflict.\n"));
708 #if defined(DEVELOPER)
709 static void validate_my_share_entries(int num,
710 struct share_mode_entry *share_entry)
714 if (!procid_is_me(&share_entry->pid)) {
718 if (is_deferred_open_entry(share_entry) &&
719 !open_was_deferred(share_entry->op_mid)) {
720 char *str = talloc_asprintf(talloc_tos(),
721 "Got a deferred entry without a request: "
723 share_mode_str(talloc_tos(), num, share_entry));
727 if (!is_valid_share_mode_entry(share_entry)) {
731 fsp = file_find_dif(share_entry->id,
732 share_entry->share_file_id);
734 DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
735 share_mode_str(talloc_tos(), num, share_entry) ));
736 smb_panic("validate_my_share_entries: Cannot match a "
737 "share entry with an open file\n");
740 if (is_deferred_open_entry(share_entry) ||
741 is_unused_share_mode_entry(share_entry)) {
745 if ((share_entry->op_type == NO_OPLOCK) &&
746 (fsp->oplock_type == FAKE_LEVEL_II_OPLOCK)) {
747 /* Someone has already written to it, but I haven't yet
752 if (((uint16)fsp->oplock_type) != share_entry->op_type) {
761 DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
762 share_mode_str(talloc_tos(), num, share_entry) ));
763 str = talloc_asprintf(talloc_tos(),
764 "validate_my_share_entries: "
765 "file %s, oplock_type = 0x%x, op_type = 0x%x\n",
766 fsp->fsp_name, (unsigned int)fsp->oplock_type,
767 (unsigned int)share_entry->op_type );
773 bool is_stat_open(uint32 access_mask)
775 return (access_mask &&
776 ((access_mask & ~(SYNCHRONIZE_ACCESS| FILE_READ_ATTRIBUTES|
777 FILE_WRITE_ATTRIBUTES))==0) &&
778 ((access_mask & (SYNCHRONIZE_ACCESS|FILE_READ_ATTRIBUTES|
779 FILE_WRITE_ATTRIBUTES)) != 0));
782 /****************************************************************************
783 Deal with share modes
784 Invarient: Share mode must be locked on entry and exit.
785 Returns -1 on error, or number of share modes on success (may be zero).
786 ****************************************************************************/
788 static NTSTATUS open_mode_check(connection_struct *conn,
789 struct share_mode_lock *lck,
792 uint32 create_options,
797 if(lck->num_share_modes == 0) {
801 *file_existed = True;
803 /* A delete on close prohibits everything */
805 if (lck->delete_on_close) {
806 return NT_STATUS_DELETE_PENDING;
809 if (is_stat_open(access_mask)) {
810 /* Stat open that doesn't trigger oplock breaks or share mode
811 * checks... ! JRA. */
816 * Check if the share modes will give us access.
819 #if defined(DEVELOPER)
820 for(i = 0; i < lck->num_share_modes; i++) {
821 validate_my_share_entries(i, &lck->share_modes[i]);
825 if (!lp_share_modes(SNUM(conn))) {
829 /* Now we check the share modes, after any oplock breaks. */
830 for(i = 0; i < lck->num_share_modes; i++) {
832 if (!is_valid_share_mode_entry(&lck->share_modes[i])) {
836 /* someone else has a share lock on it, check to see if we can
838 if (share_conflict(&lck->share_modes[i],
839 access_mask, share_access)) {
840 return NT_STATUS_SHARING_VIOLATION;
847 static bool is_delete_request(files_struct *fsp) {
848 return ((fsp->access_mask == DELETE_ACCESS) &&
849 (fsp->oplock_type == NO_OPLOCK));
853 * Send a break message to the oplock holder and delay the open for
857 static NTSTATUS send_break_message(files_struct *fsp,
858 struct share_mode_entry *exclusive,
863 char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
865 DEBUG(10, ("Sending break request to PID %s\n",
866 procid_str_static(&exclusive->pid)));
867 exclusive->op_mid = mid;
869 /* Create the message. */
870 share_mode_entry_to_message(msg, exclusive);
872 /* Add in the FORCE_OPLOCK_BREAK_TO_NONE bit in the message if set. We
873 don't want this set in the share mode struct pointed to by lck. */
875 if (oplock_request & FORCE_OPLOCK_BREAK_TO_NONE) {
876 SSVAL(msg,6,exclusive->op_type | FORCE_OPLOCK_BREAK_TO_NONE);
879 status = messaging_send_buf(smbd_messaging_context(), exclusive->pid,
880 MSG_SMB_BREAK_REQUEST,
882 MSG_SMB_SHARE_MODE_ENTRY_SIZE);
883 if (!NT_STATUS_IS_OK(status)) {
884 DEBUG(3, ("Could not send oplock break message: %s\n",
892 * 1) No files open at all or internal open: Grant whatever the client wants.
894 * 2) Exclusive (or batch) oplock around: If the requested access is a delete
895 * request, break if the oplock around is a batch oplock. If it's another
896 * requested access type, break.
898 * 3) Only level2 around: Grant level2 and do nothing else.
901 static bool delay_for_oplocks(struct share_mode_lock *lck,
908 struct share_mode_entry *exclusive = NULL;
909 bool valid_entry = false;
910 bool have_level2 = false;
911 bool have_a_none_oplock = false;
912 bool allow_level2 = (global_client_caps & CAP_LEVEL_II_OPLOCKS) &&
913 lp_level2_oplocks(SNUM(fsp->conn));
915 if (oplock_request & INTERNAL_OPEN_ONLY) {
916 fsp->oplock_type = NO_OPLOCK;
919 if ((oplock_request & INTERNAL_OPEN_ONLY) || is_stat_open(fsp->access_mask)) {
923 for (i=0; i<lck->num_share_modes; i++) {
925 if (!is_valid_share_mode_entry(&lck->share_modes[i])) {
929 /* At least one entry is not an invalid or deferred entry. */
932 if (pass_number == 1) {
933 if (BATCH_OPLOCK_TYPE(lck->share_modes[i].op_type)) {
934 SMB_ASSERT(exclusive == NULL);
935 exclusive = &lck->share_modes[i];
938 if (EXCLUSIVE_OPLOCK_TYPE(lck->share_modes[i].op_type)) {
939 SMB_ASSERT(exclusive == NULL);
940 exclusive = &lck->share_modes[i];
944 if (LEVEL_II_OPLOCK_TYPE(lck->share_modes[i].op_type)) {
945 SMB_ASSERT(exclusive == NULL);
949 if (lck->share_modes[i].op_type == NO_OPLOCK) {
950 have_a_none_oplock = true;
954 if (exclusive != NULL) { /* Found an exclusive oplock */
955 bool delay_it = is_delete_request(fsp) ?
956 BATCH_OPLOCK_TYPE(exclusive->op_type) : true;
957 SMB_ASSERT(!have_level2);
959 send_break_message(fsp, exclusive, mid, oplock_request);
965 * Match what was requested (fsp->oplock_type) with
966 * what was found in the existing share modes.
970 /* All entries are placeholders or deferred.
971 * Directly grant whatever the client wants. */
972 if (fsp->oplock_type == NO_OPLOCK) {
973 /* Store a level2 oplock, but don't tell the client */
974 fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
976 } else if (have_a_none_oplock) {
977 fsp->oplock_type = NO_OPLOCK;
978 } else if (have_level2) {
979 if (fsp->oplock_type == NO_OPLOCK ||
980 fsp->oplock_type == FAKE_LEVEL_II_OPLOCK) {
981 /* Store a level2 oplock, but don't tell the client */
982 fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
984 fsp->oplock_type = LEVEL_II_OPLOCK;
987 /* This case can never happen. */
992 * Don't grant level2 to clients that don't want them
993 * or if we've turned them off.
995 if (fsp->oplock_type == LEVEL_II_OPLOCK && !allow_level2) {
996 fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
999 DEBUG(10,("delay_for_oplocks: oplock type 0x%x on file %s\n",
1000 fsp->oplock_type, fsp->fsp_name));
1006 bool request_timed_out(struct timeval request_time,
1007 struct timeval timeout)
1009 struct timeval now, end_time;
1011 end_time = timeval_sum(&request_time, &timeout);
1012 return (timeval_compare(&end_time, &now) < 0);
1015 /****************************************************************************
1016 Handle the 1 second delay in returning a SHARING_VIOLATION error.
1017 ****************************************************************************/
1019 static void defer_open(struct share_mode_lock *lck,
1020 struct timeval request_time,
1021 struct timeval timeout,
1022 struct smb_request *req,
1023 struct deferred_open_record *state)
1027 /* Paranoia check */
1029 for (i=0; i<lck->num_share_modes; i++) {
1030 struct share_mode_entry *e = &lck->share_modes[i];
1032 if (!is_deferred_open_entry(e)) {
1036 if (procid_is_me(&e->pid) && (e->op_mid == req->mid)) {
1037 DEBUG(0, ("Trying to defer an already deferred "
1038 "request: mid=%d, exiting\n", req->mid));
1039 exit_server("attempt to defer a deferred request");
1043 /* End paranoia check */
1045 DEBUG(10,("defer_open_sharing_error: time [%u.%06u] adding deferred "
1046 "open entry for mid %u\n",
1047 (unsigned int)request_time.tv_sec,
1048 (unsigned int)request_time.tv_usec,
1049 (unsigned int)req->mid));
1051 if (!push_deferred_smb_message(req, request_time, timeout,
1052 (char *)state, sizeof(*state))) {
1053 exit_server("push_deferred_smb_message failed");
1055 add_deferred_open(lck, req->mid, request_time, state->id);
1059 /****************************************************************************
1060 On overwrite open ensure that the attributes match.
1061 ****************************************************************************/
1063 bool open_match_attributes(connection_struct *conn,
1064 uint32 old_dos_attr,
1065 uint32 new_dos_attr,
1066 mode_t existing_unx_mode,
1067 mode_t new_unx_mode,
1068 mode_t *returned_unx_mode)
1070 uint32 noarch_old_dos_attr, noarch_new_dos_attr;
1072 noarch_old_dos_attr = (old_dos_attr & ~FILE_ATTRIBUTE_ARCHIVE);
1073 noarch_new_dos_attr = (new_dos_attr & ~FILE_ATTRIBUTE_ARCHIVE);
1075 if((noarch_old_dos_attr == 0 && noarch_new_dos_attr != 0) ||
1076 (noarch_old_dos_attr != 0 && ((noarch_old_dos_attr & noarch_new_dos_attr) == noarch_old_dos_attr))) {
1077 *returned_unx_mode = new_unx_mode;
1079 *returned_unx_mode = (mode_t)0;
1082 DEBUG(10,("open_match_attributes: old_dos_attr = 0x%x, "
1083 "existing_unx_mode = 0%o, new_dos_attr = 0x%x "
1084 "returned_unx_mode = 0%o\n",
1085 (unsigned int)old_dos_attr,
1086 (unsigned int)existing_unx_mode,
1087 (unsigned int)new_dos_attr,
1088 (unsigned int)*returned_unx_mode ));
1090 /* If we're mapping SYSTEM and HIDDEN ensure they match. */
1091 if (lp_map_system(SNUM(conn)) || lp_store_dos_attributes(SNUM(conn))) {
1092 if ((old_dos_attr & FILE_ATTRIBUTE_SYSTEM) &&
1093 !(new_dos_attr & FILE_ATTRIBUTE_SYSTEM)) {
1097 if (lp_map_hidden(SNUM(conn)) || lp_store_dos_attributes(SNUM(conn))) {
1098 if ((old_dos_attr & FILE_ATTRIBUTE_HIDDEN) &&
1099 !(new_dos_attr & FILE_ATTRIBUTE_HIDDEN)) {
1106 /****************************************************************************
1107 Special FCB or DOS processing in the case of a sharing violation.
1108 Try and find a duplicated file handle.
1109 ****************************************************************************/
1111 NTSTATUS fcb_or_dos_open(struct smb_request *req,
1112 connection_struct *conn,
1113 files_struct *fsp_to_dup_into,
1119 uint32 share_access,
1120 uint32 create_options)
1124 DEBUG(5,("fcb_or_dos_open: attempting old open semantics for "
1125 "file %s.\n", fname ));
1127 for(fsp = file_find_di_first(id); fsp;
1128 fsp = file_find_di_next(fsp)) {
1130 DEBUG(10,("fcb_or_dos_open: checking file %s, fd = %d, "
1131 "vuid = %u, file_pid = %u, private_options = 0x%x "
1132 "access_mask = 0x%x\n", fsp->fsp_name,
1133 fsp->fh->fd, (unsigned int)fsp->vuid,
1134 (unsigned int)fsp->file_pid,
1135 (unsigned int)fsp->fh->private_options,
1136 (unsigned int)fsp->access_mask ));
1138 if (fsp->fh->fd != -1 &&
1139 fsp->vuid == vuid &&
1140 fsp->file_pid == file_pid &&
1141 (fsp->fh->private_options & (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS |
1142 NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) &&
1143 (fsp->access_mask & FILE_WRITE_DATA) &&
1144 strequal(fsp->fsp_name, fname)) {
1145 DEBUG(10,("fcb_or_dos_open: file match\n"));
1151 return NT_STATUS_NOT_FOUND;
1154 /* quite an insane set of semantics ... */
1155 if (is_executable(fname) &&
1156 (fsp->fh->private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS)) {
1157 DEBUG(10,("fcb_or_dos_open: file fail due to is_executable.\n"));
1158 return NT_STATUS_INVALID_PARAMETER;
1161 /* We need to duplicate this fsp. */
1162 dup_file_fsp(req, fsp, access_mask, share_access,
1163 create_options, fsp_to_dup_into);
1165 return NT_STATUS_OK;
1168 /****************************************************************************
1169 Open a file with a share mode - old openX method - map into NTCreate.
1170 ****************************************************************************/
1172 bool map_open_params_to_ntcreate(const char *fname, int deny_mode, int open_func,
1173 uint32 *paccess_mask,
1174 uint32 *pshare_mode,
1175 uint32 *pcreate_disposition,
1176 uint32 *pcreate_options)
1180 uint32 create_disposition;
1181 uint32 create_options = FILE_NON_DIRECTORY_FILE;
1183 DEBUG(10,("map_open_params_to_ntcreate: fname = %s, deny_mode = 0x%x, "
1184 "open_func = 0x%x\n",
1185 fname, (unsigned int)deny_mode, (unsigned int)open_func ));
1187 /* Create the NT compatible access_mask. */
1188 switch (GET_OPENX_MODE(deny_mode)) {
1189 case DOS_OPEN_EXEC: /* Implies read-only - used to be FILE_READ_DATA */
1190 case DOS_OPEN_RDONLY:
1191 access_mask = FILE_GENERIC_READ;
1193 case DOS_OPEN_WRONLY:
1194 access_mask = FILE_GENERIC_WRITE;
1198 access_mask = FILE_GENERIC_READ|FILE_GENERIC_WRITE;
1201 DEBUG(10,("map_open_params_to_ntcreate: bad open mode = 0x%x\n",
1202 (unsigned int)GET_OPENX_MODE(deny_mode)));
1206 /* Create the NT compatible create_disposition. */
1207 switch (open_func) {
1208 case OPENX_FILE_EXISTS_FAIL|OPENX_FILE_CREATE_IF_NOT_EXIST:
1209 create_disposition = FILE_CREATE;
1212 case OPENX_FILE_EXISTS_OPEN:
1213 create_disposition = FILE_OPEN;
1216 case OPENX_FILE_EXISTS_OPEN|OPENX_FILE_CREATE_IF_NOT_EXIST:
1217 create_disposition = FILE_OPEN_IF;
1220 case OPENX_FILE_EXISTS_TRUNCATE:
1221 create_disposition = FILE_OVERWRITE;
1224 case OPENX_FILE_EXISTS_TRUNCATE|OPENX_FILE_CREATE_IF_NOT_EXIST:
1225 create_disposition = FILE_OVERWRITE_IF;
1229 /* From samba4 - to be confirmed. */
1230 if (GET_OPENX_MODE(deny_mode) == DOS_OPEN_EXEC) {
1231 create_disposition = FILE_CREATE;
1234 DEBUG(10,("map_open_params_to_ntcreate: bad "
1235 "open_func 0x%x\n", (unsigned int)open_func));
1239 /* Create the NT compatible share modes. */
1240 switch (GET_DENY_MODE(deny_mode)) {
1242 share_mode = FILE_SHARE_NONE;
1246 share_mode = FILE_SHARE_READ;
1250 share_mode = FILE_SHARE_WRITE;
1254 share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;
1258 create_options |= NTCREATEX_OPTIONS_PRIVATE_DENY_DOS;
1259 if (is_executable(fname)) {
1260 share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;
1262 if (GET_OPENX_MODE(deny_mode) == DOS_OPEN_RDONLY) {
1263 share_mode = FILE_SHARE_READ;
1265 share_mode = FILE_SHARE_NONE;
1271 create_options |= NTCREATEX_OPTIONS_PRIVATE_DENY_FCB;
1272 share_mode = FILE_SHARE_NONE;
1276 DEBUG(10,("map_open_params_to_ntcreate: bad deny_mode 0x%x\n",
1277 (unsigned int)GET_DENY_MODE(deny_mode) ));
1281 DEBUG(10,("map_open_params_to_ntcreate: file %s, access_mask = 0x%x, "
1282 "share_mode = 0x%x, create_disposition = 0x%x, "
1283 "create_options = 0x%x\n",
1285 (unsigned int)access_mask,
1286 (unsigned int)share_mode,
1287 (unsigned int)create_disposition,
1288 (unsigned int)create_options ));
1291 *paccess_mask = access_mask;
1294 *pshare_mode = share_mode;
1296 if (pcreate_disposition) {
1297 *pcreate_disposition = create_disposition;
1299 if (pcreate_options) {
1300 *pcreate_options = create_options;
1307 static void schedule_defer_open(struct share_mode_lock *lck,
1308 struct timeval request_time,
1309 struct smb_request *req)
1311 struct deferred_open_record state;
1313 /* This is a relative time, added to the absolute
1314 request_time value to get the absolute timeout time.
1315 Note that if this is the second or greater time we enter
1316 this codepath for this particular request mid then
1317 request_time is left as the absolute time of the *first*
1318 time this request mid was processed. This is what allows
1319 the request to eventually time out. */
1321 struct timeval timeout;
1323 /* Normally the smbd we asked should respond within
1324 * OPLOCK_BREAK_TIMEOUT seconds regardless of whether
1325 * the client did, give twice the timeout as a safety
1326 * measure here in case the other smbd is stuck
1327 * somewhere else. */
1329 timeout = timeval_set(OPLOCK_BREAK_TIMEOUT*2, 0);
1331 /* Nothing actually uses state.delayed_for_oplocks
1332 but it's handy to differentiate in debug messages
1333 between a 30 second delay due to oplock break, and
1334 a 1 second delay for share mode conflicts. */
1336 state.delayed_for_oplocks = True;
1339 if (!request_timed_out(request_time, timeout)) {
1340 defer_open(lck, request_time, timeout, req, &state);
1344 /****************************************************************************
1345 Work out what access_mask to use from what the client sent us.
1346 ****************************************************************************/
1348 static NTSTATUS calculate_access_mask(connection_struct *conn,
1351 uint32_t access_mask,
1352 uint32_t *access_mask_out)
1357 * Convert GENERIC bits to specific bits.
1360 se_map_generic(&access_mask, &file_generic_mapping);
1362 /* Calculate MAXIMUM_ALLOWED_ACCESS if requested. */
1363 if (access_mask & MAXIMUM_ALLOWED_ACCESS) {
1366 struct security_descriptor *sd;
1367 uint32_t access_granted = 0;
1369 status = SMB_VFS_GET_NT_ACL(conn, fname,
1370 (OWNER_SECURITY_INFORMATION |
1371 GROUP_SECURITY_INFORMATION |
1372 DACL_SECURITY_INFORMATION),&sd);
1374 if (!NT_STATUS_IS_OK(status)) {
1375 DEBUG(10, ("calculate_access_mask: Could not get acl "
1378 nt_errstr(status)));
1379 return NT_STATUS_ACCESS_DENIED;
1382 status = smb1_file_se_access_check(sd,
1383 conn->server_info->ptok,
1389 if (!NT_STATUS_IS_OK(status)) {
1390 DEBUG(10, ("calculate_access_mask: Access denied on "
1391 "file %s: when calculating maximum access\n",
1393 return NT_STATUS_ACCESS_DENIED;
1396 access_mask = access_granted;
1398 access_mask = FILE_GENERIC_ALL;
1402 *access_mask_out = access_mask;
1403 return NT_STATUS_OK;
1406 /****************************************************************************
1407 Open a file with a share mode. Passed in an already created files_struct *.
1408 ****************************************************************************/
1410 static NTSTATUS open_file_ntcreate(connection_struct *conn,
1411 struct smb_request *req,
1412 struct smb_filename *smb_fname,
1413 uint32 access_mask, /* access bits (FILE_READ_DATA etc.) */
1414 uint32 share_access, /* share constants (FILE_SHARE_READ etc) */
1415 uint32 create_disposition, /* FILE_OPEN_IF etc. */
1416 uint32 create_options, /* options such as delete on close. */
1417 uint32 new_dos_attributes, /* attributes used for new file. */
1418 int oplock_request, /* internal Samba oplock codes. */
1419 /* Information (FILE_EXISTS etc.) */
1425 bool file_existed = VALID_STAT(smb_fname->st);
1426 bool def_acl = False;
1427 bool posix_open = False;
1428 bool new_file_created = False;
1429 bool clear_ads = false;
1431 NTSTATUS fsp_open = NT_STATUS_ACCESS_DENIED;
1432 mode_t new_unx_mode = (mode_t)0;
1433 mode_t unx_mode = (mode_t)0;
1435 uint32 existing_dos_attributes = 0;
1436 struct pending_message_list *pml = NULL;
1437 struct timeval request_time = timeval_zero();
1438 struct share_mode_lock *lck = NULL;
1439 uint32 open_access_mask = access_mask;
1447 status = get_full_smb_filename(talloc_tos(), smb_fname,
1449 if (!NT_STATUS_IS_OK(status)) {
1453 if (conn->printer) {
1455 * Printers are handled completely differently.
1456 * Most of the passed parameters are ignored.
1460 *pinfo = FILE_WAS_CREATED;
1463 DEBUG(10, ("open_file_ntcreate: printer open fname=%s\n",
1464 smb_fname_str_dbg(smb_fname)));
1466 return print_fsp_open(req, conn, fname, req->vuid, fsp,
1470 if (!parent_dirname(talloc_tos(), smb_fname->base_name, &parent_dir,
1472 return NT_STATUS_NO_MEMORY;
1475 if (new_dos_attributes & FILE_FLAG_POSIX_SEMANTICS) {
1477 unx_mode = (mode_t)(new_dos_attributes & ~FILE_FLAG_POSIX_SEMANTICS);
1478 new_dos_attributes = 0;
1480 /* We add aARCH to this as this mode is only used if the file is
1482 unx_mode = unix_mode(conn, new_dos_attributes | aARCH, fname,
1486 DEBUG(10, ("open_file_ntcreate: fname=%s, dos_attrs=0x%x "
1487 "access_mask=0x%x share_access=0x%x "
1488 "create_disposition = 0x%x create_options=0x%x "
1489 "unix mode=0%o oplock_request=%d\n",
1490 smb_fname_str_dbg(smb_fname), new_dos_attributes,
1491 access_mask, share_access, create_disposition,
1492 create_options, (unsigned int)unx_mode, oplock_request));
1494 if ((req == NULL) && ((oplock_request & INTERNAL_OPEN_ONLY) == 0)) {
1495 DEBUG(0, ("No smb request but not an internal only open!\n"));
1496 return NT_STATUS_INTERNAL_ERROR;
1500 * Only non-internal opens can be deferred at all
1504 && ((pml = get_open_deferred_message(req->mid)) != NULL)) {
1505 struct deferred_open_record *state =
1506 (struct deferred_open_record *)pml->private_data.data;
1508 /* Remember the absolute time of the original
1509 request with this mid. We'll use it later to
1510 see if this has timed out. */
1512 request_time = pml->request_time;
1514 /* Remove the deferred open entry under lock. */
1515 lck = get_share_mode_lock(talloc_tos(), state->id, NULL, NULL,
1518 DEBUG(0, ("could not get share mode lock\n"));
1520 del_deferred_open_entry(lck, req->mid);
1524 /* Ensure we don't reprocess this message. */
1525 remove_deferred_open_smb_message(req->mid);
1528 status = check_name(conn, smb_fname->base_name);
1529 if (!NT_STATUS_IS_OK(status)) {
1534 new_dos_attributes &= SAMBA_ATTRIBUTES_MASK;
1536 existing_dos_attributes = dos_mode(conn, fname,
1541 /* ignore any oplock requests if oplocks are disabled */
1542 if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break ||
1543 IS_VETO_OPLOCK_PATH(conn, smb_fname->base_name)) {
1544 /* Mask off everything except the private Samba bits. */
1545 oplock_request &= SAMBA_PRIVATE_OPLOCK_MASK;
1548 /* this is for OS/2 long file names - say we don't support them */
1549 if (!lp_posix_pathnames() && strstr(smb_fname->base_name,".+,;=[].")) {
1550 /* OS/2 Workplace shell fix may be main code stream in a later
1552 DEBUG(5,("open_file_ntcreate: OS/2 long filenames are not "
1554 if (use_nt_status()) {
1555 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1557 return NT_STATUS_DOS(ERRDOS, ERRcannotopen);
1560 switch( create_disposition ) {
1562 * Currently we're using FILE_SUPERSEDE as the same as
1563 * FILE_OVERWRITE_IF but they really are
1564 * different. FILE_SUPERSEDE deletes an existing file
1565 * (requiring delete access) then recreates it.
1567 case FILE_SUPERSEDE:
1568 /* If file exists replace/overwrite. If file doesn't
1570 flags2 |= (O_CREAT | O_TRUNC);
1574 case FILE_OVERWRITE_IF:
1575 /* If file exists replace/overwrite. If file doesn't
1577 flags2 |= (O_CREAT | O_TRUNC);
1582 /* If file exists open. If file doesn't exist error. */
1583 if (!file_existed) {
1584 DEBUG(5,("open_file_ntcreate: FILE_OPEN "
1585 "requested for file %s and file "
1587 smb_fname_str_dbg(smb_fname)));
1589 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1593 case FILE_OVERWRITE:
1594 /* If file exists overwrite. If file doesn't exist
1596 if (!file_existed) {
1597 DEBUG(5,("open_file_ntcreate: FILE_OVERWRITE "
1598 "requested for file %s and file "
1600 smb_fname_str_dbg(smb_fname) ));
1602 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1609 /* If file exists error. If file doesn't exist
1612 DEBUG(5,("open_file_ntcreate: FILE_CREATE "
1613 "requested for file %s and file "
1614 "already exists.\n",
1615 smb_fname_str_dbg(smb_fname)));
1616 if (S_ISDIR(smb_fname->st.st_ex_mode)) {
1621 return map_nt_error_from_unix(errno);
1623 flags2 |= (O_CREAT|O_EXCL);
1627 /* If file exists open. If file doesn't exist
1633 return NT_STATUS_INVALID_PARAMETER;
1636 /* We only care about matching attributes on file exists and
1639 if (!posix_open && file_existed && ((create_disposition == FILE_OVERWRITE) ||
1640 (create_disposition == FILE_OVERWRITE_IF))) {
1641 if (!open_match_attributes(conn, existing_dos_attributes,
1643 smb_fname->st.st_ex_mode,
1644 unx_mode, &new_unx_mode)) {
1645 DEBUG(5,("open_file_ntcreate: attributes missmatch "
1646 "for file %s (%x %x) (0%o, 0%o)\n",
1647 smb_fname_str_dbg(smb_fname),
1648 existing_dos_attributes,
1650 (unsigned int)smb_fname->st.st_ex_mode,
1651 (unsigned int)unx_mode ));
1653 return NT_STATUS_ACCESS_DENIED;
1657 status = calculate_access_mask(conn, fname, file_existed,
1660 if (!NT_STATUS_IS_OK(status)) {
1661 DEBUG(10, ("open_file_ntcreate: calculate_access_mask "
1662 "on file %s returned %s\n",
1663 smb_fname_str_dbg(smb_fname), nt_errstr(status)));
1667 open_access_mask = access_mask;
1669 if ((flags2 & O_TRUNC) || (oplock_request & FORCE_OPLOCK_BREAK_TO_NONE)) {
1670 open_access_mask |= FILE_WRITE_DATA; /* This will cause oplock breaks. */
1673 DEBUG(10, ("open_file_ntcreate: fname=%s, after mapping "
1674 "access_mask=0x%x\n", smb_fname_str_dbg(smb_fname),
1678 * Note that we ignore the append flag as append does not
1679 * mean the same thing under DOS and Unix.
1682 if ((access_mask & (FILE_WRITE_DATA | FILE_APPEND_DATA)) ||
1683 (oplock_request & FORCE_OPLOCK_BREAK_TO_NONE)) {
1684 /* DENY_DOS opens are always underlying read-write on the
1685 file handle, no matter what the requested access mask
1687 if ((create_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) ||
1688 access_mask & (FILE_READ_ATTRIBUTES|FILE_READ_DATA|FILE_READ_EA|FILE_EXECUTE)) {
1698 * Currently we only look at FILE_WRITE_THROUGH for create options.
1702 if ((create_options & FILE_WRITE_THROUGH) && lp_strict_sync(SNUM(conn))) {
1707 if (posix_open && (access_mask & FILE_APPEND_DATA)) {
1711 if (!posix_open && !CAN_WRITE(conn)) {
1713 * We should really return a permission denied error if either
1714 * O_CREAT or O_TRUNC are set, but for compatibility with
1715 * older versions of Samba we just AND them out.
1717 flags2 &= ~(O_CREAT|O_TRUNC);
1721 * Ensure we can't write on a read-only share or file.
1724 if (flags != O_RDONLY && file_existed &&
1725 (!CAN_WRITE(conn) || IS_DOS_READONLY(existing_dos_attributes))) {
1726 DEBUG(5,("open_file_ntcreate: write access requested for "
1727 "file %s on read only %s\n",
1728 smb_fname_str_dbg(smb_fname),
1729 !CAN_WRITE(conn) ? "share" : "file" ));
1731 return NT_STATUS_ACCESS_DENIED;
1734 fsp->file_id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
1735 fsp->share_access = share_access;
1736 fsp->fh->private_options = create_options;
1737 fsp->access_mask = open_access_mask; /* We change this to the
1738 * requested access_mask after
1739 * the open is done. */
1740 fsp->posix_open = posix_open;
1742 /* Ensure no SAMBA_PRIVATE bits can be set. */
1743 fsp->oplock_type = (oplock_request & ~SAMBA_PRIVATE_OPLOCK_MASK);
1745 if (timeval_is_zero(&request_time)) {
1746 request_time = fsp->open_time;
1750 struct timespec old_write_time = smb_fname->st.st_ex_mtime;
1751 id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
1753 lck = get_share_mode_lock(talloc_tos(), id,
1755 fname, &old_write_time);
1758 DEBUG(0, ("Could not get share mode lock\n"));
1759 return NT_STATUS_SHARING_VIOLATION;
1762 /* First pass - send break only on batch oplocks. */
1764 && delay_for_oplocks(lck, fsp, req->mid, 1,
1766 schedule_defer_open(lck, request_time, req);
1768 return NT_STATUS_SHARING_VIOLATION;
1771 /* Use the client requested access mask here, not the one we
1773 status = open_mode_check(conn, lck, access_mask, share_access,
1774 create_options, &file_existed);
1776 if (NT_STATUS_IS_OK(status)) {
1777 /* We might be going to allow this open. Check oplock
1779 /* Second pass - send break for both batch or
1780 * exclusive oplocks. */
1782 && delay_for_oplocks(lck, fsp, req->mid, 2,
1784 schedule_defer_open(lck, request_time, req);
1786 return NT_STATUS_SHARING_VIOLATION;
1790 if (NT_STATUS_EQUAL(status, NT_STATUS_DELETE_PENDING)) {
1791 /* DELETE_PENDING is not deferred for a second */
1796 if (!NT_STATUS_IS_OK(status)) {
1797 uint32 can_access_mask;
1798 bool can_access = True;
1800 SMB_ASSERT(NT_STATUS_EQUAL(status, NT_STATUS_SHARING_VIOLATION));
1802 /* Check if this can be done with the deny_dos and fcb
1804 if (create_options &
1805 (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS|
1806 NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) {
1808 DEBUG(0, ("DOS open without an SMB "
1811 return NT_STATUS_INTERNAL_ERROR;
1814 /* Use the client requested access mask here,
1815 * not the one we open with. */
1816 status = fcb_or_dos_open(req,
1827 if (NT_STATUS_IS_OK(status)) {
1830 *pinfo = FILE_WAS_OPENED;
1832 return NT_STATUS_OK;
1837 * This next line is a subtlety we need for
1838 * MS-Access. If a file open will fail due to share
1839 * permissions and also for security (access) reasons,
1840 * we need to return the access failed error, not the
1841 * share error. We can't open the file due to kernel
1842 * oplock deadlock (it's possible we failed above on
1843 * the open_mode_check()) so use a userspace check.
1846 if (flags & O_RDWR) {
1847 can_access_mask = FILE_READ_DATA|FILE_WRITE_DATA;
1848 } else if (flags & O_WRONLY) {
1849 can_access_mask = FILE_WRITE_DATA;
1851 can_access_mask = FILE_READ_DATA;
1854 if (((can_access_mask & FILE_WRITE_DATA) && !CAN_WRITE(conn)) ||
1855 !can_access_file_data(conn, fname, &smb_fname->st, can_access_mask)) {
1860 * If we're returning a share violation, ensure we
1861 * cope with the braindead 1 second delay.
1864 if (!(oplock_request & INTERNAL_OPEN_ONLY) &&
1865 lp_defer_sharing_violations()) {
1866 struct timeval timeout;
1867 struct deferred_open_record state;
1870 /* this is a hack to speed up torture tests
1872 timeout_usecs = lp_parm_int(SNUM(conn),
1873 "smbd","sharedelay",
1874 SHARING_VIOLATION_USEC_WAIT);
1876 /* This is a relative time, added to the absolute
1877 request_time value to get the absolute timeout time.
1878 Note that if this is the second or greater time we enter
1879 this codepath for this particular request mid then
1880 request_time is left as the absolute time of the *first*
1881 time this request mid was processed. This is what allows
1882 the request to eventually time out. */
1884 timeout = timeval_set(0, timeout_usecs);
1886 /* Nothing actually uses state.delayed_for_oplocks
1887 but it's handy to differentiate in debug messages
1888 between a 30 second delay due to oplock break, and
1889 a 1 second delay for share mode conflicts. */
1891 state.delayed_for_oplocks = False;
1895 && !request_timed_out(request_time,
1897 defer_open(lck, request_time, timeout,
1905 * We have detected a sharing violation here
1906 * so return the correct error code
1908 status = NT_STATUS_SHARING_VIOLATION;
1910 status = NT_STATUS_ACCESS_DENIED;
1916 * We exit this block with the share entry *locked*.....
1920 SMB_ASSERT(!file_existed || (lck != NULL));
1923 * Ensure we pay attention to default ACLs on directories if required.
1926 if ((flags2 & O_CREAT) && lp_inherit_acls(SNUM(conn)) &&
1927 (def_acl = directory_has_default_acl(conn, parent_dir))) {
1931 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o, "
1932 "access_mask = 0x%x, open_access_mask = 0x%x\n",
1933 (unsigned int)flags, (unsigned int)flags2,
1934 (unsigned int)unx_mode, (unsigned int)access_mask,
1935 (unsigned int)open_access_mask));
1938 * open_file strips any O_TRUNC flags itself.
1941 fsp_open = open_file(fsp, conn, req, parent_dir, smb_fname,
1942 flags|flags2, unx_mode, access_mask,
1945 if (!NT_STATUS_IS_OK(fsp_open)) {
1952 if (!file_existed) {
1953 struct timespec old_write_time = smb_fname->st.st_ex_mtime;
1955 * Deal with the race condition where two smbd's detect the
1956 * file doesn't exist and do the create at the same time. One
1957 * of them will win and set a share mode, the other (ie. this
1958 * one) should check if the requested share mode for this
1959 * create is allowed.
1963 * Now the file exists and fsp is successfully opened,
1964 * fsp->dev and fsp->inode are valid and should replace the
1965 * dev=0,inode=0 from a non existent file. Spotted by
1966 * Nadav Danieli <nadavd@exanet.com>. JRA.
1971 lck = get_share_mode_lock(talloc_tos(), id,
1973 fname, &old_write_time);
1976 DEBUG(0, ("open_file_ntcreate: Could not get share "
1977 "mode lock for %s\n",
1978 smb_fname_str_dbg(smb_fname)));
1980 return NT_STATUS_SHARING_VIOLATION;
1983 /* First pass - send break only on batch oplocks. */
1985 && delay_for_oplocks(lck, fsp, req->mid, 1,
1987 schedule_defer_open(lck, request_time, req);
1990 return NT_STATUS_SHARING_VIOLATION;
1993 status = open_mode_check(conn, lck, access_mask, share_access,
1994 create_options, &file_existed);
1996 if (NT_STATUS_IS_OK(status)) {
1997 /* We might be going to allow this open. Check oplock
1999 /* Second pass - send break for both batch or
2000 * exclusive oplocks. */
2002 && delay_for_oplocks(lck, fsp, req->mid, 2,
2004 schedule_defer_open(lck, request_time, req);
2007 return NT_STATUS_SHARING_VIOLATION;
2011 if (!NT_STATUS_IS_OK(status)) {
2012 struct deferred_open_record state;
2016 state.delayed_for_oplocks = False;
2019 /* Do it all over again immediately. In the second
2020 * round we will find that the file existed and handle
2021 * the DELETE_PENDING and FCB cases correctly. No need
2022 * to duplicate the code here. Essentially this is a
2023 * "goto top of this function", but don't tell
2027 defer_open(lck, request_time, timeval_zero(),
2035 * We exit this block with the share entry *locked*.....
2040 SMB_ASSERT(lck != NULL);
2042 /* Delete streams if create_disposition requires it */
2043 if (file_existed && clear_ads &&
2044 !is_ntfs_stream_smb_fname(smb_fname)) {
2045 status = delete_all_streams(conn, smb_fname->base_name);
2046 if (!NT_STATUS_IS_OK(status)) {
2053 /* note that we ignore failure for the following. It is
2054 basically a hack for NFS, and NFS will never set one of
2055 these only read them. Nobody but Samba can ever set a deny
2056 mode and we have already checked our more authoritative
2057 locking database for permission to set this deny mode. If
2058 the kernel refuses the operations then the kernel is wrong.
2059 note that GPFS supports it as well - jmcd */
2061 if (fsp->fh->fd != -1) {
2062 ret_flock = SMB_VFS_KERNEL_FLOCK(fsp, share_access);
2063 if(ret_flock == -1 ){
2068 return NT_STATUS_SHARING_VIOLATION;
2073 * At this point onwards, we can guarentee that the share entry
2074 * is locked, whether we created the file or not, and that the
2075 * deny mode is compatible with all current opens.
2079 * If requested, truncate the file.
2082 if (flags2&O_TRUNC) {
2084 * We are modifing the file after open - update the stat
2087 if ((SMB_VFS_FTRUNCATE(fsp, 0) == -1) ||
2088 (SMB_VFS_FSTAT(fsp, &smb_fname->st)==-1)) {
2089 status = map_nt_error_from_unix(errno);
2096 /* Record the options we were opened with. */
2097 fsp->share_access = share_access;
2098 fsp->fh->private_options = create_options;
2100 * According to Samba4, SEC_FILE_READ_ATTRIBUTE is always granted,
2102 fsp->access_mask = access_mask | FILE_READ_ATTRIBUTES;
2105 /* stat opens on existing files don't get oplocks. */
2106 if (is_stat_open(open_access_mask)) {
2107 fsp->oplock_type = NO_OPLOCK;
2110 if (!(flags2 & O_TRUNC)) {
2111 info = FILE_WAS_OPENED;
2113 info = FILE_WAS_OVERWRITTEN;
2116 info = FILE_WAS_CREATED;
2124 * Setup the oplock info in both the shared memory and
2128 if (!set_file_oplock(fsp, fsp->oplock_type)) {
2129 /* Could not get the kernel oplock */
2130 fsp->oplock_type = NO_OPLOCK;
2133 if (info == FILE_WAS_OVERWRITTEN || info == FILE_WAS_CREATED || info == FILE_WAS_SUPERSEDED) {
2134 new_file_created = True;
2137 set_share_mode(lck, fsp, conn->server_info->utok.uid, 0,
2140 /* Handle strange delete on close create semantics. */
2141 if (create_options & FILE_DELETE_ON_CLOSE) {
2143 status = can_set_delete_on_close(fsp, True, new_dos_attributes);
2145 if (!NT_STATUS_IS_OK(status)) {
2146 /* Remember to delete the mode we just added. */
2147 del_share_mode(lck, fsp);
2152 /* Note that here we set the *inital* delete on close flag,
2153 not the regular one. The magic gets handled in close. */
2154 fsp->initial_delete_on_close = True;
2157 if (new_file_created) {
2158 /* Files should be initially set as archive */
2159 if (lp_map_archive(SNUM(conn)) ||
2160 lp_store_dos_attributes(SNUM(conn))) {
2162 SMB_STRUCT_STAT tmp_sbuf;
2163 SET_STAT_INVALID(tmp_sbuf);
2164 if (file_set_dosmode(
2166 new_dos_attributes | aARCH,
2167 &tmp_sbuf, parent_dir,
2169 unx_mode = tmp_sbuf.st_ex_mode;
2176 * Take care of inherited ACLs on created files - if default ACL not
2180 if (!posix_open && !file_existed && !def_acl) {
2182 int saved_errno = errno; /* We might get ENOSYS in the next
2185 if (SMB_VFS_FCHMOD_ACL(fsp, unx_mode) == -1 &&
2187 errno = saved_errno; /* Ignore ENOSYS */
2190 } else if (new_unx_mode) {
2194 /* Attributes need changing. File already existed. */
2197 int saved_errno = errno; /* We might get ENOSYS in the
2199 ret = SMB_VFS_FCHMOD_ACL(fsp, new_unx_mode);
2201 if (ret == -1 && errno == ENOSYS) {
2202 errno = saved_errno; /* Ignore ENOSYS */
2204 DEBUG(5, ("open_file_ntcreate: reset "
2205 "attributes of file %s to 0%o\n",
2206 smb_fname_str_dbg(smb_fname),
2207 (unsigned int)new_unx_mode));
2208 ret = 0; /* Don't do the fchmod below. */
2213 (SMB_VFS_FCHMOD(fsp, new_unx_mode) == -1))
2214 DEBUG(5, ("open_file_ntcreate: failed to reset "
2215 "attributes of file %s to 0%o\n",
2216 smb_fname_str_dbg(smb_fname),
2217 (unsigned int)new_unx_mode));
2220 /* If this is a successful open, we must remove any deferred open
2223 del_deferred_open_entry(lck, req->mid);
2227 return NT_STATUS_OK;
2231 /****************************************************************************
2232 Open a file for for write to ensure that we can fchmod it.
2233 ****************************************************************************/
2235 NTSTATUS open_file_fchmod(struct smb_request *req, connection_struct *conn,
2237 SMB_STRUCT_STAT *psbuf, files_struct **result)
2239 struct smb_filename *smb_fname = NULL;
2240 files_struct *fsp = NULL;
2243 if (!VALID_STAT(*psbuf)) {
2244 return NT_STATUS_INVALID_PARAMETER;
2247 status = file_new(req, conn, &fsp);
2248 if(!NT_STATUS_IS_OK(status)) {
2252 status = create_synthetic_smb_fname_split(talloc_tos(), fname, psbuf,
2254 if (!NT_STATUS_IS_OK(status)) {
2258 status = SMB_VFS_CREATE_FILE(
2261 0, /* root_dir_fid */
2262 smb_fname, /* fname */
2263 FILE_WRITE_DATA, /* access_mask */
2264 (FILE_SHARE_READ | FILE_SHARE_WRITE | /* share_access */
2266 FILE_OPEN, /* create_disposition*/
2267 0, /* create_options */
2268 0, /* file_attributes */
2269 0, /* oplock_request */
2270 0, /* allocation_size */
2276 *psbuf = smb_fname->st;
2277 TALLOC_FREE(smb_fname);
2280 * This is not a user visible file open.
2281 * Don't set a share mode.
2284 if (!NT_STATUS_IS_OK(status)) {
2285 file_free(req, fsp);
2290 return NT_STATUS_OK;
2293 /****************************************************************************
2294 Close the fchmod file fd - ensure no locks are lost.
2295 ****************************************************************************/
2297 NTSTATUS close_file_fchmod(struct smb_request *req, files_struct *fsp)
2299 NTSTATUS status = fd_close(fsp);
2300 file_free(req, fsp);
2304 static NTSTATUS mkdir_internal(connection_struct *conn,
2306 uint32 file_attributes,
2307 SMB_STRUCT_STAT *psbuf)
2311 const char *dirname;
2313 bool posix_open = false;
2315 if(!CAN_WRITE(conn)) {
2316 DEBUG(5,("mkdir_internal: failing create on read-only share "
2317 "%s\n", lp_servicename(SNUM(conn))));
2318 return NT_STATUS_ACCESS_DENIED;
2321 status = check_name(conn, name);
2322 if (!NT_STATUS_IS_OK(status)) {
2326 if (!parent_dirname(talloc_tos(), name, &parent_dir, &dirname)) {
2327 return NT_STATUS_NO_MEMORY;
2330 if (file_attributes & FILE_FLAG_POSIX_SEMANTICS) {
2332 mode = (mode_t)(file_attributes & ~FILE_FLAG_POSIX_SEMANTICS);
2334 mode = unix_mode(conn, aDIR, name, parent_dir);
2337 if (SMB_VFS_MKDIR(conn, name, mode) != 0) {
2338 return map_nt_error_from_unix(errno);
2341 /* Ensure we're checking for a symlink here.... */
2342 /* We don't want to get caught by a symlink racer. */
2344 if (SMB_VFS_LSTAT(conn, name, psbuf) == -1) {
2345 DEBUG(2, ("Could not stat directory '%s' just created: %s\n",
2346 name, strerror(errno)));
2347 return map_nt_error_from_unix(errno);
2350 if (!S_ISDIR(psbuf->st_ex_mode)) {
2351 DEBUG(0, ("Directory just '%s' created is not a directory\n",
2353 return NT_STATUS_ACCESS_DENIED;
2356 if (lp_store_dos_attributes(SNUM(conn))) {
2358 file_set_dosmode(conn, name,
2359 file_attributes | aDIR, NULL,
2365 if (lp_inherit_perms(SNUM(conn))) {
2366 inherit_access_posix_acl(conn, parent_dir, name, mode);
2369 if (!(file_attributes & FILE_FLAG_POSIX_SEMANTICS)) {
2371 * Check if high bits should have been set,
2372 * then (if bits are missing): add them.
2373 * Consider bits automagically set by UNIX, i.e. SGID bit from parent
2376 if (mode & ~(S_IRWXU|S_IRWXG|S_IRWXO) && (mode & ~psbuf->st_ex_mode)) {
2377 SMB_VFS_CHMOD(conn, name,
2378 psbuf->st_ex_mode | (mode & ~psbuf->st_ex_mode));
2382 /* Change the owner if required. */
2383 if (lp_inherit_owner(SNUM(conn))) {
2384 change_dir_owner_to_parent(conn, parent_dir, name, psbuf);
2387 notify_fname(conn, NOTIFY_ACTION_ADDED, FILE_NOTIFY_CHANGE_DIR_NAME,
2390 return NT_STATUS_OK;
2393 /****************************************************************************
2394 Open a directory from an NT SMB call.
2395 ****************************************************************************/
2397 static NTSTATUS open_directory(connection_struct *conn,
2398 struct smb_request *req,
2399 struct smb_filename *smb_dname,
2401 uint32 share_access,
2402 uint32 create_disposition,
2403 uint32 create_options,
2404 uint32 file_attributes,
2406 files_struct **result)
2408 files_struct *fsp = NULL;
2409 bool dir_existed = VALID_STAT(smb_dname->st) ? True : False;
2410 struct share_mode_lock *lck = NULL;
2413 struct timespec mtimespec;
2416 DEBUG(5,("open_directory: opening directory %s, access_mask = 0x%x, "
2417 "share_access = 0x%x create_options = 0x%x, "
2418 "create_disposition = 0x%x, file_attributes = 0x%x\n",
2419 smb_fname_str_dbg(smb_dname),
2420 (unsigned int)access_mask,
2421 (unsigned int)share_access,
2422 (unsigned int)create_options,
2423 (unsigned int)create_disposition,
2424 (unsigned int)file_attributes));
2426 status = get_full_smb_filename(talloc_tos(), smb_dname,
2428 if (!NT_STATUS_IS_OK(status)) {
2432 if (!(file_attributes & FILE_FLAG_POSIX_SEMANTICS) &&
2433 (conn->fs_capabilities & FILE_NAMED_STREAMS) &&
2434 is_ntfs_stream_smb_fname(smb_dname)) {
2435 DEBUG(2, ("open_directory: %s is a stream name!\n",
2436 smb_fname_str_dbg(smb_dname)));
2437 return NT_STATUS_NOT_A_DIRECTORY;
2440 status = calculate_access_mask(conn, fname, dir_existed,
2443 if (!NT_STATUS_IS_OK(status)) {
2444 DEBUG(10, ("open_directory: calculate_access_mask "
2445 "on file %s returned %s\n",
2446 smb_fname_str_dbg(smb_dname),
2447 nt_errstr(status)));
2451 /* We need to support SeSecurityPrivilege for this. */
2452 if (access_mask & SEC_FLAG_SYSTEM_SECURITY) {
2453 DEBUG(10, ("open_directory: open on %s "
2454 "failed - SEC_FLAG_SYSTEM_SECURITY denied.\n",
2455 smb_fname_str_dbg(smb_dname)));
2456 return NT_STATUS_PRIVILEGE_NOT_HELD;
2459 switch( create_disposition ) {
2462 info = FILE_WAS_OPENED;
2465 * We want to follow symlinks here.
2468 if (SMB_VFS_STAT(conn, fname, &smb_dname->st) != 0) {
2469 return map_nt_error_from_unix(errno);
2476 /* If directory exists error. If directory doesn't
2479 status = mkdir_internal(conn,
2484 if (!NT_STATUS_IS_OK(status)) {
2485 DEBUG(2, ("open_directory: unable to create "
2486 "%s. Error was %s\n",
2487 smb_fname_str_dbg(smb_dname),
2488 nt_errstr(status)));
2492 info = FILE_WAS_CREATED;
2497 * If directory exists open. If directory doesn't
2501 status = mkdir_internal(conn,
2506 if (NT_STATUS_IS_OK(status)) {
2507 info = FILE_WAS_CREATED;
2510 if (NT_STATUS_EQUAL(status,
2511 NT_STATUS_OBJECT_NAME_COLLISION)) {
2512 info = FILE_WAS_OPENED;
2513 status = NT_STATUS_OK;
2518 case FILE_SUPERSEDE:
2519 case FILE_OVERWRITE:
2520 case FILE_OVERWRITE_IF:
2522 DEBUG(5,("open_directory: invalid create_disposition "
2523 "0x%x for directory %s\n",
2524 (unsigned int)create_disposition,
2525 smb_fname_str_dbg(smb_dname)));
2526 return NT_STATUS_INVALID_PARAMETER;
2529 if(!S_ISDIR(smb_dname->st.st_ex_mode)) {
2530 DEBUG(5,("open_directory: %s is not a directory !\n",
2531 smb_fname_str_dbg(smb_dname)));
2532 return NT_STATUS_NOT_A_DIRECTORY;
2535 if (info == FILE_WAS_OPENED) {
2536 uint32_t access_granted = 0;
2537 status = check_open_rights(conn,
2542 /* Were we trying to do a directory open
2543 * for delete and didn't get DELETE
2544 * access (only) ? Check if the
2545 * directory allows DELETE_CHILD.
2547 * http://blogs.msdn.com/oldnewthing/archive/2004/06/04/148426.aspx
2550 if ((NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) &&
2551 (access_mask & DELETE_ACCESS) &&
2552 (access_granted == DELETE_ACCESS) &&
2553 can_delete_file_in_directory(conn, smb_dname))) {
2554 DEBUG(10,("open_directory: overrode ACCESS_DENIED "
2555 "on directory %s\n",
2556 smb_fname_str_dbg(smb_dname)));
2557 status = NT_STATUS_OK;
2560 if (!NT_STATUS_IS_OK(status)) {
2561 DEBUG(10, ("open_directory: check_open_rights on "
2562 "file %s failed with %s\n",
2563 smb_fname_str_dbg(smb_dname),
2564 nt_errstr(status)));
2569 status = file_new(req, conn, &fsp);
2570 if(!NT_STATUS_IS_OK(status)) {
2575 * Setup the files_struct for it.
2578 fsp->mode = smb_dname->st.st_ex_mode;
2579 fsp->file_id = vfs_file_id_from_sbuf(conn, &smb_dname->st);
2580 fsp->vuid = req ? req->vuid : UID_FIELD_INVALID;
2581 fsp->file_pid = req ? req->smbpid : 0;
2582 fsp->can_lock = False;
2583 fsp->can_read = False;
2584 fsp->can_write = False;
2586 fsp->share_access = share_access;
2587 fsp->fh->private_options = create_options;
2589 * According to Samba4, SEC_FILE_READ_ATTRIBUTE is always granted,
2591 fsp->access_mask = access_mask | FILE_READ_ATTRIBUTES;
2592 fsp->print_file = False;
2593 fsp->modified = False;
2594 fsp->oplock_type = NO_OPLOCK;
2595 fsp->sent_oplock_break = NO_BREAK_SENT;
2596 fsp->is_directory = True;
2597 fsp->posix_open = (file_attributes & FILE_FLAG_POSIX_SEMANTICS) ? True : False;
2599 string_set(&fsp->fsp_name,fname);
2601 mtimespec = smb_dname->st.st_ex_mtime;
2603 lck = get_share_mode_lock(talloc_tos(), fsp->file_id,
2608 DEBUG(0, ("open_directory: Could not get share mode lock for "
2609 "%s\n", smb_fname_str_dbg(smb_dname)));
2610 file_free(req, fsp);
2611 return NT_STATUS_SHARING_VIOLATION;
2614 status = open_mode_check(conn, lck, access_mask, share_access,
2615 create_options, &dir_existed);
2617 if (!NT_STATUS_IS_OK(status)) {
2619 file_free(req, fsp);
2623 set_share_mode(lck, fsp, conn->server_info->utok.uid, 0, NO_OPLOCK);
2625 /* For directories the delete on close bit at open time seems
2626 always to be honored on close... See test 19 in Samba4 BASE-DELETE. */
2627 if (create_options & FILE_DELETE_ON_CLOSE) {
2628 status = can_set_delete_on_close(fsp, True, 0);
2629 if (!NT_STATUS_IS_OK(status) && !NT_STATUS_EQUAL(status, NT_STATUS_DIRECTORY_NOT_EMPTY)) {
2631 file_free(req, fsp);
2635 if (NT_STATUS_IS_OK(status)) {
2636 /* Note that here we set the *inital* delete on close flag,
2637 not the regular one. The magic gets handled in close. */
2638 fsp->initial_delete_on_close = True;
2649 return NT_STATUS_OK;
2652 NTSTATUS create_directory(connection_struct *conn, struct smb_request *req,
2653 struct smb_filename *smb_dname)
2658 status = SMB_VFS_CREATE_FILE(
2661 0, /* root_dir_fid */
2662 smb_dname, /* fname */
2663 FILE_READ_ATTRIBUTES, /* access_mask */
2664 FILE_SHARE_NONE, /* share_access */
2665 FILE_CREATE, /* create_disposition*/
2666 FILE_DIRECTORY_FILE, /* create_options */
2667 FILE_ATTRIBUTE_DIRECTORY, /* file_attributes */
2668 0, /* oplock_request */
2669 0, /* allocation_size */
2675 if (NT_STATUS_IS_OK(status)) {
2676 close_file(req, fsp, NORMAL_CLOSE);
2682 /****************************************************************************
2683 Receive notification that one of our open files has been renamed by another
2685 ****************************************************************************/
2687 void msg_file_was_renamed(struct messaging_context *msg,
2690 struct server_id server_id,
2694 char *frm = (char *)data->data;
2696 const char *sharepath;
2697 const char *newname;
2700 if (data->data == NULL
2701 || data->length < MSG_FILE_RENAMED_MIN_SIZE + 2) {
2702 DEBUG(0, ("msg_file_was_renamed: Got invalid msg len %d\n",
2703 (int)data->length));
2707 /* Unpack the message. */
2708 pull_file_id_24(frm, &id);
2709 sharepath = &frm[24];
2710 newname = sharepath + strlen(sharepath) + 1;
2711 sp_len = strlen(sharepath);
2713 DEBUG(10,("msg_file_was_renamed: Got rename message for sharepath %s, new name %s, "
2715 sharepath, newname, file_id_string_tos(&id)));
2717 for(fsp = file_find_di_first(id); fsp; fsp = file_find_di_next(fsp)) {
2718 if (memcmp(fsp->conn->connectpath, sharepath, sp_len) == 0) {
2719 DEBUG(10,("msg_file_was_renamed: renaming file fnum %d from %s -> %s\n",
2720 fsp->fnum, fsp->fsp_name, newname ));
2721 string_set(&fsp->fsp_name, newname);
2724 /* Now we have the complete path we can work out if this is
2725 actually within this share and adjust newname accordingly. */
2726 DEBUG(10,("msg_file_was_renamed: share mismatch (sharepath %s "
2727 "not sharepath %s) "
2728 "fnum %d from %s -> %s\n",
2729 fsp->conn->connectpath,
2738 struct case_semantics_state {
2739 connection_struct *conn;
2740 bool case_sensitive;
2742 bool short_case_preserve;
2745 /****************************************************************************
2746 Restore case semantics.
2747 ****************************************************************************/
2748 static int restore_case_semantics(struct case_semantics_state *state)
2750 state->conn->case_sensitive = state->case_sensitive;
2751 state->conn->case_preserve = state->case_preserve;
2752 state->conn->short_case_preserve = state->short_case_preserve;
2756 /****************************************************************************
2757 Save case semantics.
2758 ****************************************************************************/
2759 struct case_semantics_state *set_posix_case_semantics(TALLOC_CTX *mem_ctx,
2760 connection_struct *conn)
2762 struct case_semantics_state *result;
2764 if (!(result = talloc(mem_ctx, struct case_semantics_state))) {
2765 DEBUG(0, ("talloc failed\n"));
2769 result->conn = conn;
2770 result->case_sensitive = conn->case_sensitive;
2771 result->case_preserve = conn->case_preserve;
2772 result->short_case_preserve = conn->short_case_preserve;
2775 conn->case_sensitive = True;
2776 conn->case_preserve = True;
2777 conn->short_case_preserve = True;
2779 talloc_set_destructor(result, restore_case_semantics);
2785 * If a main file is opened for delete, all streams need to be checked for
2786 * !FILE_SHARE_DELETE. Do this by opening with DELETE_ACCESS.
2787 * If that works, delete them all by setting the delete on close and close.
2790 NTSTATUS open_streams_for_delete(connection_struct *conn,
2793 struct stream_struct *stream_info;
2794 files_struct **streams;
2796 unsigned int num_streams;
2797 TALLOC_CTX *frame = talloc_stackframe();
2800 status = SMB_VFS_STREAMINFO(conn, NULL, fname, talloc_tos(),
2801 &num_streams, &stream_info);
2803 if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED)
2804 || NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
2805 DEBUG(10, ("no streams around\n"));
2807 return NT_STATUS_OK;
2810 if (!NT_STATUS_IS_OK(status)) {
2811 DEBUG(10, ("SMB_VFS_STREAMINFO failed: %s\n",
2812 nt_errstr(status)));
2816 DEBUG(10, ("open_streams_for_delete found %d streams\n",
2819 if (num_streams == 0) {
2821 return NT_STATUS_OK;
2824 streams = TALLOC_ARRAY(talloc_tos(), files_struct *, num_streams);
2825 if (streams == NULL) {
2826 DEBUG(0, ("talloc failed\n"));
2827 status = NT_STATUS_NO_MEMORY;
2831 for (i=0; i<num_streams; i++) {
2832 struct smb_filename *smb_fname = NULL;
2833 char *streamname = NULL;
2834 SMB_STRUCT_STAT sbuf;
2836 if (strequal(stream_info[i].name, "::$DATA")) {
2841 streamname = talloc_asprintf(talloc_tos(), "%s%s", fname,
2842 stream_info[i].name);
2843 if (streamname == NULL) {
2844 DEBUG(0, ("talloc_aprintf failed\n"));
2845 status = NT_STATUS_NO_MEMORY;
2848 if (SMB_VFS_STAT(conn, streamname, &sbuf) == -1) {
2849 SET_STAT_INVALID(sbuf);
2852 TALLOC_FREE(streamname);
2854 status = create_synthetic_smb_fname(talloc_tos(), fname,
2855 stream_info[i].name,
2857 if (!NT_STATUS_IS_OK(status)) {
2861 status = SMB_VFS_CREATE_FILE(
2864 0, /* root_dir_fid */
2865 smb_fname, /* fname */
2866 DELETE_ACCESS, /* access_mask */
2867 (FILE_SHARE_READ | /* share_access */
2868 FILE_SHARE_WRITE | FILE_SHARE_DELETE),
2869 FILE_OPEN, /* create_disposition*/
2870 NTCREATEX_OPTIONS_PRIVATE_STREAM_DELETE, /* create_options */
2871 FILE_ATTRIBUTE_NORMAL, /* file_attributes */
2872 0, /* oplock_request */
2873 0, /* allocation_size */
2876 &streams[i], /* result */
2879 if (!NT_STATUS_IS_OK(status)) {
2880 DEBUG(10, ("Could not open stream %s: %s\n",
2881 smb_fname_str_dbg(smb_fname),
2882 nt_errstr(status)));
2884 TALLOC_FREE(smb_fname);
2887 TALLOC_FREE(smb_fname);
2891 * don't touch the variable "status" beyond this point :-)
2894 for (i -= 1 ; i >= 0; i--) {
2895 if (streams[i] == NULL) {
2899 DEBUG(10, ("Closing stream # %d, %s\n", i,
2900 streams[i]->fsp_name));
2901 close_file(NULL, streams[i], NORMAL_CLOSE);
2910 * Wrapper around open_file_ntcreate and open_directory
2913 static NTSTATUS create_file_unixpath(connection_struct *conn,
2914 struct smb_request *req,
2915 struct smb_filename *smb_fname,
2916 uint32_t access_mask,
2917 uint32_t share_access,
2918 uint32_t create_disposition,
2919 uint32_t create_options,
2920 uint32_t file_attributes,
2921 uint32_t oplock_request,
2922 uint64_t allocation_size,
2923 struct security_descriptor *sd,
2924 struct ea_list *ea_list,
2926 files_struct **result,
2929 int info = FILE_WAS_OPENED;
2930 files_struct *base_fsp = NULL;
2931 files_struct *fsp = NULL;
2935 DEBUG(10,("create_file_unixpath: access_mask = 0x%x "
2936 "file_attributes = 0x%x, share_access = 0x%x, "
2937 "create_disposition = 0x%x create_options = 0x%x "
2938 "oplock_request = 0x%x ea_list = 0x%p, sd = 0x%p, "
2940 (unsigned int)access_mask,
2941 (unsigned int)file_attributes,
2942 (unsigned int)share_access,
2943 (unsigned int)create_disposition,
2944 (unsigned int)create_options,
2945 (unsigned int)oplock_request,
2946 ea_list, sd, smb_fname_str_dbg(smb_fname)));
2948 status = get_full_smb_filename(talloc_tos(), smb_fname,
2950 if (!NT_STATUS_IS_OK(status)) {
2954 if (create_options & FILE_OPEN_BY_FILE_ID) {
2955 status = NT_STATUS_NOT_SUPPORTED;
2959 if (create_options & NTCREATEX_OPTIONS_INVALID_PARAM_MASK) {
2960 status = NT_STATUS_INVALID_PARAMETER;
2965 oplock_request |= INTERNAL_OPEN_ONLY;
2968 if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
2969 && (access_mask & DELETE_ACCESS)
2970 && !is_ntfs_stream_smb_fname(smb_fname)) {
2972 * We can't open a file with DELETE access if any of the
2973 * streams is open without FILE_SHARE_DELETE
2975 status = open_streams_for_delete(conn, smb_fname->base_name);
2977 if (!NT_STATUS_IS_OK(status)) {
2982 /* This is the correct thing to do (check every time) but can_delete
2983 * is expensive (it may have to read the parent directory
2984 * permissions). So for now we're not doing it unless we have a strong
2985 * hint the client is really going to delete this file. If the client
2986 * is forcing FILE_CREATE let the filesystem take care of the
2989 /* Setting FILE_SHARE_DELETE is the hint. */
2991 if (lp_acl_check_permissions(SNUM(conn))
2992 && (create_disposition != FILE_CREATE)
2993 && (share_access & FILE_SHARE_DELETE)
2994 && (access_mask & DELETE_ACCESS)
2995 && (!(can_delete_file_in_directory(conn, smb_fname) ||
2996 can_access_file_acl(conn, fname, DELETE_ACCESS)))) {
2997 status = NT_STATUS_ACCESS_DENIED;
2998 DEBUG(10,("create_file_unixpath: open file %s "
2999 "for delete ACCESS_DENIED\n",
3000 smb_fname_str_dbg(smb_fname)));
3005 /* We need to support SeSecurityPrivilege for this. */
3006 if ((access_mask & SEC_FLAG_SYSTEM_SECURITY) &&
3007 !user_has_privileges(current_user.nt_user_token,
3009 status = NT_STATUS_PRIVILEGE_NOT_HELD;
3013 /* We need to support SeSecurityPrivilege for this. */
3014 if (access_mask & SEC_FLAG_SYSTEM_SECURITY) {
3015 status = NT_STATUS_PRIVILEGE_NOT_HELD;
3018 /* Don't allow a SACL set from an NTtrans create until we
3019 * support SeSecurityPrivilege. */
3020 if (!VALID_STAT(smb_fname->st) &&
3021 lp_nt_acl_support(SNUM(conn)) &&
3022 sd && (sd->sacl != NULL)) {
3023 status = NT_STATUS_PRIVILEGE_NOT_HELD;
3028 if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
3029 && is_ntfs_stream_smb_fname(smb_fname)
3030 && (!(create_options & NTCREATEX_OPTIONS_PRIVATE_STREAM_DELETE))) {
3031 uint32 base_create_disposition;
3032 struct smb_filename *smb_fname_base = NULL;
3033 SMB_STRUCT_STAT sbuf;
3035 if (create_options & FILE_DIRECTORY_FILE) {
3036 status = NT_STATUS_NOT_A_DIRECTORY;
3040 switch (create_disposition) {
3042 base_create_disposition = FILE_OPEN;
3045 base_create_disposition = FILE_OPEN_IF;
3049 if (SMB_VFS_STAT(conn, smb_fname->base_name, &sbuf) == -1) {
3050 SET_STAT_INVALID(sbuf);
3053 /* Create an smb_filename with stream_name == NULL. */
3054 status = create_synthetic_smb_fname(talloc_tos(),
3055 smb_fname->base_name,
3058 if (!NT_STATUS_IS_OK(status)) {
3062 /* Open the base file. */
3063 status = create_file_unixpath(conn, NULL, smb_fname_base, 0,
3066 | FILE_SHARE_DELETE,
3067 base_create_disposition,
3068 0, 0, 0, 0, NULL, NULL,
3070 TALLOC_FREE(smb_fname_base);
3072 if (!NT_STATUS_IS_OK(status)) {
3073 DEBUG(10, ("create_file_unixpath for base %s failed: "
3074 "%s\n", smb_fname->base_name,
3075 nt_errstr(status)));
3078 /* we don't need to low level fd */
3083 * If it's a request for a directory open, deal with it separately.
3086 if (create_options & FILE_DIRECTORY_FILE) {
3088 if (create_options & FILE_NON_DIRECTORY_FILE) {
3089 status = NT_STATUS_INVALID_PARAMETER;
3093 /* Can't open a temp directory. IFS kit test. */
3094 if (!(file_attributes & FILE_FLAG_POSIX_SEMANTICS) &&
3095 (file_attributes & FILE_ATTRIBUTE_TEMPORARY)) {
3096 status = NT_STATUS_INVALID_PARAMETER;
3101 * We will get a create directory here if the Win32
3102 * app specified a security descriptor in the
3103 * CreateDirectory() call.
3107 status = open_directory(
3108 conn, req, smb_fname, access_mask, share_access,
3109 create_disposition, create_options, file_attributes,
3114 * Ordinary file case.
3117 status = file_new(req, conn, &fsp);
3118 if(!NT_STATUS_IS_OK(status)) {
3123 * We're opening the stream element of a base_fsp
3124 * we already opened. Set up the base_fsp pointer.
3127 fsp->base_fsp = base_fsp;
3130 status = open_file_ntcreate(conn,
3142 if(!NT_STATUS_IS_OK(status)) {
3143 file_free(req, fsp);
3147 if (NT_STATUS_EQUAL(status, NT_STATUS_FILE_IS_A_DIRECTORY)) {
3149 /* A stream open never opens a directory */
3152 status = NT_STATUS_FILE_IS_A_DIRECTORY;
3157 * Fail the open if it was explicitly a non-directory
3161 if (create_options & FILE_NON_DIRECTORY_FILE) {
3162 status = NT_STATUS_FILE_IS_A_DIRECTORY;
3167 status = open_directory(
3168 conn, req, smb_fname, access_mask,
3169 share_access, create_disposition,
3170 create_options, file_attributes,
3175 if (!NT_STATUS_IS_OK(status)) {
3179 fsp->base_fsp = base_fsp;
3182 * According to the MS documentation, the only time the security
3183 * descriptor is applied to the opened file is iff we *created* the
3184 * file; an existing file stays the same.
3186 * Also, it seems (from observation) that you can open the file with
3187 * any access mask but you can still write the sd. We need to override
3188 * the granted access before we call set_sd
3189 * Patch for bug #2242 from Tom Lackemann <cessnatomny@yahoo.com>.
3192 if ((sd != NULL) && (info == FILE_WAS_CREATED)
3193 && lp_nt_acl_support(SNUM(conn))) {
3195 uint32_t sec_info_sent;
3196 uint32_t saved_access_mask = fsp->access_mask;
3198 sec_info_sent = get_sec_info(sd);
3200 fsp->access_mask = FILE_GENERIC_ALL;
3202 /* Convert all the generic bits. */
3203 security_acl_map_generic(sd->dacl, &file_generic_mapping);
3204 security_acl_map_generic(sd->sacl, &file_generic_mapping);
3206 if (sec_info_sent & (OWNER_SECURITY_INFORMATION|
3207 GROUP_SECURITY_INFORMATION|
3208 DACL_SECURITY_INFORMATION|
3209 SACL_SECURITY_INFORMATION)) {
3210 status = SMB_VFS_FSET_NT_ACL(fsp, sec_info_sent, sd);
3213 fsp->access_mask = saved_access_mask;
3215 if (!NT_STATUS_IS_OK(status)) {
3220 if ((ea_list != NULL) && (info == FILE_WAS_CREATED)) {
3221 status = set_ea(conn, fsp, fname, ea_list);
3222 if (!NT_STATUS_IS_OK(status)) {
3227 if (!fsp->is_directory && S_ISDIR(smb_fname->st.st_ex_mode)) {
3228 status = NT_STATUS_ACCESS_DENIED;
3232 /* Save the requested allocation size. */
3233 if ((info == FILE_WAS_CREATED) || (info == FILE_WAS_OVERWRITTEN)) {
3235 && (allocation_size > smb_fname->st.st_ex_size)) {
3236 fsp->initial_allocation_size = smb_roundup(
3237 fsp->conn, allocation_size);
3238 if (fsp->is_directory) {
3239 /* Can't set allocation size on a directory. */
3240 status = NT_STATUS_ACCESS_DENIED;
3243 if (vfs_allocate_file_space(
3244 fsp, fsp->initial_allocation_size) == -1) {
3245 status = NT_STATUS_DISK_FULL;
3249 fsp->initial_allocation_size = smb_roundup(
3250 fsp->conn, (uint64_t)smb_fname->st.st_ex_size);
3254 DEBUG(10, ("create_file_unixpath: info=%d\n", info));
3257 if (pinfo != NULL) {
3260 if ((fsp->fh != NULL) && (fsp->fh->fd != -1)) {
3261 SMB_VFS_FSTAT(fsp, &smb_fname->st);
3263 return NT_STATUS_OK;
3266 DEBUG(10, ("create_file_unixpath: %s\n", nt_errstr(status)));
3269 if (base_fsp && fsp->base_fsp == base_fsp) {
3271 * The close_file below will close
3276 close_file(req, fsp, ERROR_CLOSE);
3279 if (base_fsp != NULL) {
3280 close_file(req, base_fsp, ERROR_CLOSE);
3287 * Calculate the full path name given a relative fid.
3289 NTSTATUS get_relative_fid_filename(connection_struct *conn,
3290 struct smb_request *req,
3291 uint16_t root_dir_fid,
3292 struct smb_filename *smb_fname)
3294 files_struct *dir_fsp;
3295 char *parent_fname = NULL;
3296 char *new_base_name = NULL;
3299 if (root_dir_fid == 0 || !smb_fname) {
3300 status = NT_STATUS_INTERNAL_ERROR;
3304 dir_fsp = file_fsp(req, root_dir_fid);
3306 if (dir_fsp == NULL) {
3307 status = NT_STATUS_INVALID_HANDLE;
3311 if (!dir_fsp->is_directory) {
3314 * Check to see if this is a mac fork of some kind.
3317 if ((conn->fs_capabilities & FILE_NAMED_STREAMS) &&
3318 is_ntfs_stream_smb_fname(smb_fname)) {
3319 status = NT_STATUS_OBJECT_PATH_NOT_FOUND;
3324 we need to handle the case when we get a
3325 relative open relative to a file and the
3326 pathname is blank - this is a reopen!
3327 (hint from demyn plantenberg)
3330 status = NT_STATUS_INVALID_HANDLE;
3334 if (ISDOT(dir_fsp->fsp_name)) {
3336 * We're at the toplevel dir, the final file name
3337 * must not contain ./, as this is filtered out
3338 * normally by srvstr_get_path and unix_convert
3339 * explicitly rejects paths containing ./.
3341 parent_fname = talloc_strdup(talloc_tos(), "");
3342 if (parent_fname == NULL) {
3343 status = NT_STATUS_NO_MEMORY;
3347 size_t dir_name_len = strlen(dir_fsp->fsp_name);
3350 * Copy in the base directory name.
3353 parent_fname = TALLOC_ARRAY(talloc_tos(), char,
3355 if (parent_fname == NULL) {
3356 status = NT_STATUS_NO_MEMORY;
3359 memcpy(parent_fname, dir_fsp->fsp_name,
3363 * Ensure it ends in a '/'.
3364 * We used TALLOC_SIZE +2 to add space for the '/'.
3368 && (parent_fname[dir_name_len-1] != '\\')
3369 && (parent_fname[dir_name_len-1] != '/')) {
3370 parent_fname[dir_name_len] = '/';
3371 parent_fname[dir_name_len+1] = '\0';
3375 new_base_name = talloc_asprintf(smb_fname, "%s%s", parent_fname,
3376 smb_fname->base_name);
3377 if (new_base_name == NULL) {
3378 status = NT_STATUS_NO_MEMORY;
3382 TALLOC_FREE(smb_fname->base_name);
3383 smb_fname->base_name = new_base_name;
3384 status = NT_STATUS_OK;
3387 TALLOC_FREE(parent_fname);
3391 NTSTATUS create_file_default(connection_struct *conn,
3392 struct smb_request *req,
3393 uint16_t root_dir_fid,
3394 struct smb_filename *smb_fname,
3395 uint32_t access_mask,
3396 uint32_t share_access,
3397 uint32_t create_disposition,
3398 uint32_t create_options,
3399 uint32_t file_attributes,
3400 uint32_t oplock_request,
3401 uint64_t allocation_size,
3402 struct security_descriptor *sd,
3403 struct ea_list *ea_list,
3404 files_struct **result,
3407 int info = FILE_WAS_OPENED;
3408 files_struct *fsp = NULL;
3411 DEBUG(10,("create_file: access_mask = 0x%x "
3412 "file_attributes = 0x%x, share_access = 0x%x, "
3413 "create_disposition = 0x%x create_options = 0x%x "
3414 "oplock_request = 0x%x "
3415 "root_dir_fid = 0x%x, ea_list = 0x%p, sd = 0x%p, "
3417 (unsigned int)access_mask,
3418 (unsigned int)file_attributes,
3419 (unsigned int)share_access,
3420 (unsigned int)create_disposition,
3421 (unsigned int)create_options,
3422 (unsigned int)oplock_request,
3423 (unsigned int)root_dir_fid,
3424 ea_list, sd, smb_fname_str_dbg(smb_fname)));
3427 * Calculate the filename from the root_dir_if if necessary.
3430 if (root_dir_fid != 0) {
3431 status = get_relative_fid_filename(conn, req, root_dir_fid,
3433 if (!NT_STATUS_IS_OK(status)) {
3439 * Check to see if this is a mac fork of some kind.
3442 if (is_ntfs_stream_smb_fname(smb_fname)) {
3444 enum FAKE_FILE_TYPE fake_file_type;
3446 status = get_full_smb_filename(talloc_tos(), smb_fname,
3448 if (!NT_STATUS_IS_OK(status)) {
3452 fake_file_type = is_fake_file(fname);
3454 if (fake_file_type != FAKE_FILE_TYPE_NONE) {
3457 * Here we go! support for changing the disk quotas
3460 * We need to fake up to open this MAGIC QUOTA file
3461 * and return a valid FID.
3463 * w2k close this file directly after openening xp
3464 * also tries a QUERY_FILE_INFO on the file and then
3467 status = open_fake_file(req, conn, req->vuid,
3468 fake_file_type, fname,
3471 if (!NT_STATUS_IS_OK(status)) {
3475 ZERO_STRUCT(smb_fname->st);
3480 if (!(conn->fs_capabilities & FILE_NAMED_STREAMS)) {
3481 status = NT_STATUS_OBJECT_PATH_NOT_FOUND;
3486 /* All file access must go through check_name() */
3488 status = check_name(conn, smb_fname->base_name);
3489 if (!NT_STATUS_IS_OK(status)) {
3493 status = create_file_unixpath(
3494 conn, req, smb_fname, access_mask, share_access,
3495 create_disposition, create_options, file_attributes,
3496 oplock_request, allocation_size, sd, ea_list,
3499 if (!NT_STATUS_IS_OK(status)) {
3504 DEBUG(10, ("create_file: info=%d\n", info));
3507 if (pinfo != NULL) {
3510 return NT_STATUS_OK;
3513 DEBUG(10, ("create_file: %s\n", nt_errstr(status)));
3516 close_file(req, fsp, ERROR_CLOSE);