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
,
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
,
47 SMB_STRUCT_STAT
*psbuf
);
49 /****************************************************************************
50 SMB1 file varient of se_access_check. Never test FILE_READ_ATTRIBUTES.
51 ****************************************************************************/
53 NTSTATUS
smb1_file_se_access_check(const struct security_descriptor
*sd
,
54 const NT_USER_TOKEN
*token
,
55 uint32_t access_desired
,
56 uint32_t *access_granted
)
58 return se_access_check(sd
,
60 (access_desired
& ~FILE_READ_ATTRIBUTES
),
64 /****************************************************************************
65 Check if we have open rights.
66 ****************************************************************************/
68 static NTSTATUS
check_open_rights(struct connection_struct
*conn
,
71 uint32_t *access_granted
)
73 /* Check if we have rights to open. */
75 struct security_descriptor
*sd
;
79 if (conn
->server_info
->utok
.uid
== 0 || conn
->admin_user
) {
80 /* I'm sorry sir, I didn't know you were root... */
81 *access_granted
= access_mask
;
82 if (access_mask
& SEC_FLAG_MAXIMUM_ALLOWED
) {
83 *access_granted
|= FILE_GENERIC_ALL
;
88 status
= SMB_VFS_GET_NT_ACL(conn
, fname
,
89 (OWNER_SECURITY_INFORMATION
|
90 GROUP_SECURITY_INFORMATION
|
91 DACL_SECURITY_INFORMATION
),&sd
);
93 if (!NT_STATUS_IS_OK(status
)) {
94 DEBUG(10, ("check_open_rights: Could not get acl "
101 status
= smb1_file_se_access_check(sd
,
102 conn
->server_info
->ptok
,
108 DEBUG(10,("check_open_rights: file %s requesting "
109 "0x%x returning 0x%x (%s)\n",
111 (unsigned int)access_mask
,
112 (unsigned int)*access_granted
,
113 nt_errstr(status
) ));
118 /****************************************************************************
119 fd support routines - attempt to do a dos_open.
120 ****************************************************************************/
122 static NTSTATUS
fd_open(struct connection_struct
*conn
,
128 NTSTATUS status
= NT_STATUS_OK
;
132 * Never follow symlinks on a POSIX client. The
133 * client should be doing this.
136 if (fsp
->posix_open
|| !lp_symlinks(SNUM(conn
))) {
141 fsp
->fh
->fd
= SMB_VFS_OPEN(conn
,fname
,fsp
,flags
,mode
);
142 if (fsp
->fh
->fd
== -1) {
143 status
= map_nt_error_from_unix(errno
);
144 if (errno
== EMFILE
) {
145 static time_t last_warned
= 0L;
147 if (time((time_t *) NULL
) > last_warned
) {
148 DEBUG(0,("Too many open files, unable "
149 "to open more! smbd's max "
151 lp_max_open_files()));
152 last_warned
= time((time_t *) NULL
);
158 DEBUG(10,("fd_open: name %s, flags = 0%o mode = 0%o, fd = %d. %s\n",
159 fname
, flags
, (int)mode
, fsp
->fh
->fd
,
160 (fsp
->fh
->fd
== -1) ? strerror(errno
) : "" ));
165 /****************************************************************************
166 Close the file associated with a fsp.
167 ****************************************************************************/
169 NTSTATUS
fd_close(files_struct
*fsp
)
173 if (fsp
->fh
->fd
== -1) {
174 return NT_STATUS_OK
; /* What we used to call a stat open. */
176 if (fsp
->fh
->ref_count
> 1) {
177 return NT_STATUS_OK
; /* Shared handle. Only close last reference. */
180 ret
= SMB_VFS_CLOSE(fsp
);
183 return map_nt_error_from_unix(errno
);
188 /****************************************************************************
189 Change the ownership of a file to that of the parent directory.
190 Do this by fd if possible.
191 ****************************************************************************/
193 void change_file_owner_to_parent(connection_struct
*conn
,
194 const char *inherit_from_dir
,
197 SMB_STRUCT_STAT parent_st
;
200 ret
= SMB_VFS_STAT(conn
, inherit_from_dir
, &parent_st
);
202 DEBUG(0,("change_file_owner_to_parent: failed to stat parent "
203 "directory %s. Error was %s\n",
204 inherit_from_dir
, strerror(errno
) ));
209 ret
= SMB_VFS_FCHOWN(fsp
, parent_st
.st_uid
, (gid_t
)-1);
212 DEBUG(0,("change_file_owner_to_parent: failed to fchown "
213 "file %s to parent directory uid %u. Error "
214 "was %s\n", fsp
->fsp_name
,
215 (unsigned int)parent_st
.st_uid
,
219 DEBUG(10,("change_file_owner_to_parent: changed new file %s to "
220 "parent directory uid %u.\n", fsp
->fsp_name
,
221 (unsigned int)parent_st
.st_uid
));
224 NTSTATUS
change_dir_owner_to_parent(connection_struct
*conn
,
225 const char *inherit_from_dir
,
227 SMB_STRUCT_STAT
*psbuf
)
229 char *saved_dir
= NULL
;
230 SMB_STRUCT_STAT sbuf
;
231 SMB_STRUCT_STAT parent_st
;
232 TALLOC_CTX
*ctx
= talloc_tos();
233 NTSTATUS status
= NT_STATUS_OK
;
236 ret
= SMB_VFS_STAT(conn
, inherit_from_dir
, &parent_st
);
238 status
= map_nt_error_from_unix(errno
);
239 DEBUG(0,("change_dir_owner_to_parent: failed to stat parent "
240 "directory %s. Error was %s\n",
241 inherit_from_dir
, strerror(errno
) ));
245 /* We've already done an lstat into psbuf, and we know it's a
246 directory. If we can cd into the directory and the dev/ino
247 are the same then we can safely chown without races as
248 we're locking the directory in place by being in it. This
249 should work on any UNIX (thanks tridge :-). JRA.
252 saved_dir
= vfs_GetWd(ctx
,conn
);
254 status
= map_nt_error_from_unix(errno
);
255 DEBUG(0,("change_dir_owner_to_parent: failed to get "
256 "current working directory. Error was %s\n",
261 /* Chdir into the new path. */
262 if (vfs_ChDir(conn
, fname
) == -1) {
263 status
= map_nt_error_from_unix(errno
);
264 DEBUG(0,("change_dir_owner_to_parent: failed to change "
265 "current working directory to %s. Error "
266 "was %s\n", fname
, strerror(errno
) ));
270 if (SMB_VFS_STAT(conn
,".",&sbuf
) == -1) {
271 status
= map_nt_error_from_unix(errno
);
272 DEBUG(0,("change_dir_owner_to_parent: failed to stat "
273 "directory '.' (%s) Error was %s\n",
274 fname
, strerror(errno
)));
278 /* Ensure we're pointing at the same place. */
279 if (sbuf
.st_dev
!= psbuf
->st_dev
||
280 sbuf
.st_ino
!= psbuf
->st_ino
||
281 sbuf
.st_mode
!= psbuf
->st_mode
) {
282 DEBUG(0,("change_dir_owner_to_parent: "
283 "device/inode/mode on directory %s changed. "
284 "Refusing to chown !\n", fname
));
285 status
= NT_STATUS_ACCESS_DENIED
;
290 ret
= SMB_VFS_CHOWN(conn
, ".", parent_st
.st_uid
, (gid_t
)-1);
293 status
= map_nt_error_from_unix(errno
);
294 DEBUG(10,("change_dir_owner_to_parent: failed to chown "
295 "directory %s to parent directory uid %u. "
296 "Error was %s\n", fname
,
297 (unsigned int)parent_st
.st_uid
, strerror(errno
) ));
301 DEBUG(10,("change_dir_owner_to_parent: changed ownership of new "
302 "directory %s to parent directory uid %u.\n",
303 fname
, (unsigned int)parent_st
.st_uid
));
307 vfs_ChDir(conn
,saved_dir
);
311 /****************************************************************************
313 ****************************************************************************/
315 static NTSTATUS
open_file(files_struct
*fsp
,
316 connection_struct
*conn
,
317 struct smb_request
*req
,
318 const char *parent_dir
,
321 SMB_STRUCT_STAT
*psbuf
,
324 uint32 access_mask
, /* client requested access mask. */
325 uint32 open_access_mask
) /* what we're actually using in the open. */
327 NTSTATUS status
= NT_STATUS_OK
;
328 int accmode
= (flags
& O_ACCMODE
);
329 int local_flags
= flags
;
330 bool file_existed
= VALID_STAT(*psbuf
);
335 /* Check permissions */
338 * This code was changed after seeing a client open request
339 * containing the open mode of (DENY_WRITE/read-only) with
340 * the 'create if not exist' bit set. The previous code
341 * would fail to open the file read only on a read-only share
342 * as it was checking the flags parameter directly against O_RDONLY,
343 * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
347 if (!CAN_WRITE(conn
)) {
348 /* It's a read-only share - fail if we wanted to write. */
349 if(accmode
!= O_RDONLY
|| (flags
& O_TRUNC
) || (flags
& O_APPEND
)) {
350 DEBUG(3,("Permission denied opening %s\n", path
));
351 return NT_STATUS_ACCESS_DENIED
;
352 } else if(flags
& O_CREAT
) {
353 /* We don't want to write - but we must make sure that
354 O_CREAT doesn't create the file if we have write
355 access into the directory.
357 flags
&= ~(O_CREAT
|O_EXCL
);
358 local_flags
&= ~(O_CREAT
|O_EXCL
);
363 * This little piece of insanity is inspired by the
364 * fact that an NT client can open a file for O_RDONLY,
365 * but set the create disposition to FILE_EXISTS_TRUNCATE.
366 * If the client *can* write to the file, then it expects to
367 * truncate the file, even though it is opening for readonly.
368 * Quicken uses this stupid trick in backup file creation...
369 * Thanks *greatly* to "David W. Chapman Jr." <dwcjr@inethouston.net>
370 * for helping track this one down. It didn't bite us in 2.0.x
371 * as we always opened files read-write in that release. JRA.
374 if ((accmode
== O_RDONLY
) && ((flags
& O_TRUNC
) == O_TRUNC
)) {
375 DEBUG(10,("open_file: truncate requested on read-only open "
376 "for file %s\n", path
));
377 local_flags
= (flags
& ~O_ACCMODE
)|O_RDWR
;
380 if ((open_access_mask
& (FILE_READ_DATA
|FILE_WRITE_DATA
|FILE_APPEND_DATA
|FILE_EXECUTE
)) ||
381 (!file_existed
&& (local_flags
& O_CREAT
)) ||
382 ((local_flags
& O_TRUNC
) == O_TRUNC
) ) {
386 * We can't actually truncate here as the file may be locked.
387 * open_file_ntcreate will take care of the truncate later. JRA.
390 local_flags
&= ~O_TRUNC
;
392 #if defined(O_NONBLOCK) && defined(S_ISFIFO)
394 * We would block on opening a FIFO with no one else on the
395 * other end. Do what we used to do and add O_NONBLOCK to the
399 if (file_existed
&& S_ISFIFO(psbuf
->st_mode
)) {
400 local_flags
|= O_NONBLOCK
;
404 /* Don't create files with Microsoft wildcard characters. */
407 * wildcard characters are allowed in stream names
408 * only test the basefilename
410 wild
= fsp
->base_fsp
->fsp_name
;
414 if ((local_flags
& O_CREAT
) && !file_existed
&&
416 return NT_STATUS_OBJECT_NAME_INVALID
;
419 /* Actually do the open */
420 status
= fd_open(conn
, path
, fsp
, local_flags
, unx_mode
);
421 if (!NT_STATUS_IS_OK(status
)) {
422 DEBUG(3,("Error opening file %s (%s) (local_flags=%d) "
424 path
,nt_errstr(status
),local_flags
,flags
));
428 if ((local_flags
& O_CREAT
) && !file_existed
) {
430 /* Inherit the ACL if required */
431 if (lp_inherit_perms(SNUM(conn
))) {
432 inherit_access_posix_acl(conn
, parent_dir
, path
,
436 /* Change the owner if required. */
437 if (lp_inherit_owner(SNUM(conn
))) {
438 change_file_owner_to_parent(conn
, parent_dir
,
442 notify_fname(conn
, NOTIFY_ACTION_ADDED
,
443 FILE_NOTIFY_CHANGE_FILE_NAME
, path
);
447 fsp
->fh
->fd
= -1; /* What we used to call a stat open. */
449 uint32_t access_granted
= 0;
451 status
= check_open_rights(conn
,
455 if (!NT_STATUS_IS_OK(status
)) {
456 if (NT_STATUS_EQUAL(status
, NT_STATUS_ACCESS_DENIED
)) {
458 * On NT_STATUS_ACCESS_DENIED, access_granted
459 * contains the denied bits.
462 if ((access_mask
& FILE_WRITE_ATTRIBUTES
) &&
463 (access_granted
& FILE_WRITE_ATTRIBUTES
) &&
464 (lp_map_readonly(SNUM(conn
)) ||
465 lp_map_archive(SNUM(conn
)) ||
466 lp_map_hidden(SNUM(conn
)) ||
467 lp_map_system(SNUM(conn
)))) {
468 access_granted
&= ~FILE_WRITE_ATTRIBUTES
;
470 DEBUG(10,("open_file: overrode FILE_WRITE_ATTRIBUTES "
475 if ((access_mask
& DELETE_ACCESS
) &&
476 (access_granted
& DELETE_ACCESS
) &&
477 can_delete_file_in_directory(conn
, path
)) {
478 /* Were we trying to do a stat open
479 * for delete and didn't get DELETE
480 * access (only) ? Check if the
481 * directory allows DELETE_CHILD.
483 * http://blogs.msdn.com/oldnewthing/archive/2004/06/04/148426.aspx
486 access_granted
&= ~DELETE_ACCESS
;
488 DEBUG(10,("open_file: overrode DELETE_ACCESS "
493 if (access_granted
!= 0) {
494 DEBUG(10, ("open_file: Access denied on "
499 } else if (NT_STATUS_EQUAL(status
, NT_STATUS_OBJECT_NAME_NOT_FOUND
) &&
501 S_ISLNK(psbuf
->st_mode
)) {
502 /* This is a POSIX stat open for delete
503 * or rename on a symlink that points
505 DEBUG(10, ("open_file: allowing POSIX open "
506 "on bad symlink %s\n",
509 DEBUG(10, ("open_file: check_open_rights "
510 "on file %s returned %s\n",
511 path
, nt_errstr(status
) ));
521 if (fsp
->fh
->fd
== -1) {
522 ret
= SMB_VFS_STAT(conn
, path
, psbuf
);
524 ret
= SMB_VFS_FSTAT(fsp
, psbuf
);
525 /* If we have an fd, this stat should succeed. */
527 DEBUG(0,("Error doing fstat on open file %s "
528 "(%s)\n", path
,strerror(errno
) ));
532 /* For a non-io open, this stat failing means file not found. JRA */
534 status
= map_nt_error_from_unix(errno
);
541 * POSIX allows read-only opens of directories. We don't
542 * want to do this (we use a different code path for this)
543 * so catch a directory open and return an EISDIR. JRA.
546 if(S_ISDIR(psbuf
->st_mode
)) {
549 return NT_STATUS_FILE_IS_A_DIRECTORY
;
552 fsp
->mode
= psbuf
->st_mode
;
553 fsp
->file_id
= vfs_file_id_from_sbuf(conn
, psbuf
);
554 fsp
->vuid
= req
? req
->vuid
: UID_FIELD_INVALID
;
555 fsp
->file_pid
= req
? req
->smbpid
: 0;
556 fsp
->can_lock
= True
;
557 fsp
->can_read
= (access_mask
& (FILE_READ_DATA
)) ? True
: False
;
558 if (!CAN_WRITE(conn
)) {
559 fsp
->can_write
= False
;
561 fsp
->can_write
= (access_mask
& (FILE_WRITE_DATA
| FILE_APPEND_DATA
)) ?
564 fsp
->print_file
= False
;
565 fsp
->modified
= False
;
566 fsp
->sent_oplock_break
= NO_BREAK_SENT
;
567 fsp
->is_directory
= False
;
568 if (conn
->aio_write_behind_list
&&
569 is_in_path(path
, conn
->aio_write_behind_list
, conn
->case_sensitive
)) {
570 fsp
->aio_write_behind
= True
;
573 string_set(&fsp
->fsp_name
, path
);
574 fsp
->wcp
= NULL
; /* Write cache pointer. */
576 DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
577 conn
->server_info
->unix_name
,
579 BOOLSTR(fsp
->can_read
), BOOLSTR(fsp
->can_write
),
580 conn
->num_files_open
));
586 /*******************************************************************
587 Return True if the filename is one of the special executable types.
588 ********************************************************************/
590 bool is_executable(const char *fname
)
592 if ((fname
= strrchr_m(fname
,'.'))) {
593 if (strequal(fname
,".com") ||
594 strequal(fname
,".dll") ||
595 strequal(fname
,".exe") ||
596 strequal(fname
,".sym")) {
603 /****************************************************************************
604 Check if we can open a file with a share mode.
605 Returns True if conflict, False if not.
606 ****************************************************************************/
608 static bool share_conflict(struct share_mode_entry
*entry
,
612 DEBUG(10,("share_conflict: entry->access_mask = 0x%x, "
613 "entry->share_access = 0x%x, "
614 "entry->private_options = 0x%x\n",
615 (unsigned int)entry
->access_mask
,
616 (unsigned int)entry
->share_access
,
617 (unsigned int)entry
->private_options
));
619 DEBUG(10,("share_conflict: access_mask = 0x%x, share_access = 0x%x\n",
620 (unsigned int)access_mask
, (unsigned int)share_access
));
622 if ((entry
->access_mask
& (FILE_WRITE_DATA
|
626 DELETE_ACCESS
)) == 0) {
627 DEBUG(10,("share_conflict: No conflict due to "
628 "entry->access_mask = 0x%x\n",
629 (unsigned int)entry
->access_mask
));
633 if ((access_mask
& (FILE_WRITE_DATA
|
637 DELETE_ACCESS
)) == 0) {
638 DEBUG(10,("share_conflict: No conflict due to "
639 "access_mask = 0x%x\n",
640 (unsigned int)access_mask
));
644 #if 1 /* JRA TEST - Superdebug. */
645 #define CHECK_MASK(num, am, right, sa, share) \
646 DEBUG(10,("share_conflict: [%d] am (0x%x) & right (0x%x) = 0x%x\n", \
647 (unsigned int)(num), (unsigned int)(am), \
648 (unsigned int)(right), (unsigned int)(am)&(right) )); \
649 DEBUG(10,("share_conflict: [%d] sa (0x%x) & share (0x%x) = 0x%x\n", \
650 (unsigned int)(num), (unsigned int)(sa), \
651 (unsigned int)(share), (unsigned int)(sa)&(share) )); \
652 if (((am) & (right)) && !((sa) & (share))) { \
653 DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
654 sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
655 (unsigned int)(share) )); \
659 #define CHECK_MASK(num, am, right, sa, share) \
660 if (((am) & (right)) && !((sa) & (share))) { \
661 DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
662 sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
663 (unsigned int)(share) )); \
668 CHECK_MASK(1, entry
->access_mask
, FILE_WRITE_DATA
| FILE_APPEND_DATA
,
669 share_access
, FILE_SHARE_WRITE
);
670 CHECK_MASK(2, access_mask
, FILE_WRITE_DATA
| FILE_APPEND_DATA
,
671 entry
->share_access
, FILE_SHARE_WRITE
);
673 CHECK_MASK(3, entry
->access_mask
, FILE_READ_DATA
| FILE_EXECUTE
,
674 share_access
, FILE_SHARE_READ
);
675 CHECK_MASK(4, access_mask
, FILE_READ_DATA
| FILE_EXECUTE
,
676 entry
->share_access
, FILE_SHARE_READ
);
678 CHECK_MASK(5, entry
->access_mask
, DELETE_ACCESS
,
679 share_access
, FILE_SHARE_DELETE
);
680 CHECK_MASK(6, access_mask
, DELETE_ACCESS
,
681 entry
->share_access
, FILE_SHARE_DELETE
);
683 DEBUG(10,("share_conflict: No conflict.\n"));
687 #if defined(DEVELOPER)
688 static void validate_my_share_entries(int num
,
689 struct share_mode_entry
*share_entry
)
693 if (!procid_is_me(&share_entry
->pid
)) {
697 if (is_deferred_open_entry(share_entry
) &&
698 !open_was_deferred(share_entry
->op_mid
)) {
699 char *str
= talloc_asprintf(talloc_tos(),
700 "Got a deferred entry without a request: "
702 share_mode_str(talloc_tos(), num
, share_entry
));
706 if (!is_valid_share_mode_entry(share_entry
)) {
710 fsp
= file_find_dif(share_entry
->id
,
711 share_entry
->share_file_id
);
713 DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
714 share_mode_str(talloc_tos(), num
, share_entry
) ));
715 smb_panic("validate_my_share_entries: Cannot match a "
716 "share entry with an open file\n");
719 if (is_deferred_open_entry(share_entry
) ||
720 is_unused_share_mode_entry(share_entry
)) {
724 if ((share_entry
->op_type
== NO_OPLOCK
) &&
725 (fsp
->oplock_type
== FAKE_LEVEL_II_OPLOCK
)) {
726 /* Someone has already written to it, but I haven't yet
731 if (((uint16
)fsp
->oplock_type
) != share_entry
->op_type
) {
740 DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
741 share_mode_str(talloc_tos(), num
, share_entry
) ));
742 str
= talloc_asprintf(talloc_tos(),
743 "validate_my_share_entries: "
744 "file %s, oplock_type = 0x%x, op_type = 0x%x\n",
745 fsp
->fsp_name
, (unsigned int)fsp
->oplock_type
,
746 (unsigned int)share_entry
->op_type
);
752 bool is_stat_open(uint32 access_mask
)
754 return (access_mask
&&
755 ((access_mask
& ~(SYNCHRONIZE_ACCESS
| FILE_READ_ATTRIBUTES
|
756 FILE_WRITE_ATTRIBUTES
))==0) &&
757 ((access_mask
& (SYNCHRONIZE_ACCESS
|FILE_READ_ATTRIBUTES
|
758 FILE_WRITE_ATTRIBUTES
)) != 0));
761 /****************************************************************************
762 Deal with share modes
763 Invarient: Share mode must be locked on entry and exit.
764 Returns -1 on error, or number of share modes on success (may be zero).
765 ****************************************************************************/
767 static NTSTATUS
open_mode_check(connection_struct
*conn
,
769 struct share_mode_lock
*lck
,
772 uint32 create_options
,
777 if(lck
->num_share_modes
== 0) {
781 *file_existed
= True
;
783 /* A delete on close prohibits everything */
785 if (lck
->delete_on_close
) {
786 return NT_STATUS_DELETE_PENDING
;
789 if (is_stat_open(access_mask
)) {
790 /* Stat open that doesn't trigger oplock breaks or share mode
791 * checks... ! JRA. */
796 * Check if the share modes will give us access.
799 #if defined(DEVELOPER)
800 for(i
= 0; i
< lck
->num_share_modes
; i
++) {
801 validate_my_share_entries(i
, &lck
->share_modes
[i
]);
805 if (!lp_share_modes(SNUM(conn
))) {
809 /* Now we check the share modes, after any oplock breaks. */
810 for(i
= 0; i
< lck
->num_share_modes
; i
++) {
812 if (!is_valid_share_mode_entry(&lck
->share_modes
[i
])) {
816 /* someone else has a share lock on it, check to see if we can
818 if (share_conflict(&lck
->share_modes
[i
],
819 access_mask
, share_access
)) {
820 return NT_STATUS_SHARING_VIOLATION
;
827 static bool is_delete_request(files_struct
*fsp
) {
828 return ((fsp
->access_mask
== DELETE_ACCESS
) &&
829 (fsp
->oplock_type
== NO_OPLOCK
));
833 * Send a break message to the oplock holder and delay the open for
837 static NTSTATUS
send_break_message(files_struct
*fsp
,
838 struct share_mode_entry
*exclusive
,
843 char msg
[MSG_SMB_SHARE_MODE_ENTRY_SIZE
];
845 DEBUG(10, ("Sending break request to PID %s\n",
846 procid_str_static(&exclusive
->pid
)));
847 exclusive
->op_mid
= mid
;
849 /* Create the message. */
850 share_mode_entry_to_message(msg
, exclusive
);
852 /* Add in the FORCE_OPLOCK_BREAK_TO_NONE bit in the message if set. We
853 don't want this set in the share mode struct pointed to by lck. */
855 if (oplock_request
& FORCE_OPLOCK_BREAK_TO_NONE
) {
856 SSVAL(msg
,6,exclusive
->op_type
| FORCE_OPLOCK_BREAK_TO_NONE
);
859 status
= messaging_send_buf(smbd_messaging_context(), exclusive
->pid
,
860 MSG_SMB_BREAK_REQUEST
,
862 MSG_SMB_SHARE_MODE_ENTRY_SIZE
);
863 if (!NT_STATUS_IS_OK(status
)) {
864 DEBUG(3, ("Could not send oplock break message: %s\n",
872 * 1) No files open at all or internal open: Grant whatever the client wants.
874 * 2) Exclusive (or batch) oplock around: If the requested access is a delete
875 * request, break if the oplock around is a batch oplock. If it's another
876 * requested access type, break.
878 * 3) Only level2 around: Grant level2 and do nothing else.
881 static bool delay_for_oplocks(struct share_mode_lock
*lck
,
888 struct share_mode_entry
*exclusive
= NULL
;
889 bool valid_entry
= false;
890 bool have_level2
= false;
891 bool have_a_none_oplock
= false;
892 bool allow_level2
= (global_client_caps
& CAP_LEVEL_II_OPLOCKS
) &&
893 lp_level2_oplocks(SNUM(fsp
->conn
));
895 if (oplock_request
& INTERNAL_OPEN_ONLY
) {
896 fsp
->oplock_type
= NO_OPLOCK
;
899 if ((oplock_request
& INTERNAL_OPEN_ONLY
) || is_stat_open(fsp
->access_mask
)) {
903 for (i
=0; i
<lck
->num_share_modes
; i
++) {
905 if (!is_valid_share_mode_entry(&lck
->share_modes
[i
])) {
909 /* At least one entry is not an invalid or deferred entry. */
912 if (pass_number
== 1) {
913 if (BATCH_OPLOCK_TYPE(lck
->share_modes
[i
].op_type
)) {
914 SMB_ASSERT(exclusive
== NULL
);
915 exclusive
= &lck
->share_modes
[i
];
918 if (EXCLUSIVE_OPLOCK_TYPE(lck
->share_modes
[i
].op_type
)) {
919 SMB_ASSERT(exclusive
== NULL
);
920 exclusive
= &lck
->share_modes
[i
];
924 if (LEVEL_II_OPLOCK_TYPE(lck
->share_modes
[i
].op_type
)) {
925 SMB_ASSERT(exclusive
== NULL
);
929 if (lck
->share_modes
[i
].op_type
== NO_OPLOCK
) {
930 have_a_none_oplock
= true;
934 if (exclusive
!= NULL
) { /* Found an exclusive oplock */
935 bool delay_it
= is_delete_request(fsp
) ?
936 BATCH_OPLOCK_TYPE(exclusive
->op_type
) : true;
937 SMB_ASSERT(!have_level2
);
939 send_break_message(fsp
, exclusive
, mid
, oplock_request
);
945 * Match what was requested (fsp->oplock_type) with
946 * what was found in the existing share modes.
950 /* All entries are placeholders or deferred.
951 * Directly grant whatever the client wants. */
952 if (fsp
->oplock_type
== NO_OPLOCK
) {
953 /* Store a level2 oplock, but don't tell the client */
954 fsp
->oplock_type
= FAKE_LEVEL_II_OPLOCK
;
956 } else if (have_a_none_oplock
) {
957 fsp
->oplock_type
= NO_OPLOCK
;
958 } else if (have_level2
) {
959 if (fsp
->oplock_type
== NO_OPLOCK
||
960 fsp
->oplock_type
== FAKE_LEVEL_II_OPLOCK
) {
961 /* Store a level2 oplock, but don't tell the client */
962 fsp
->oplock_type
= FAKE_LEVEL_II_OPLOCK
;
964 fsp
->oplock_type
= LEVEL_II_OPLOCK
;
967 /* This case can never happen. */
972 * Don't grant level2 to clients that don't want them
973 * or if we've turned them off.
975 if (fsp
->oplock_type
== LEVEL_II_OPLOCK
&& !allow_level2
) {
976 fsp
->oplock_type
= FAKE_LEVEL_II_OPLOCK
;
979 DEBUG(10,("delay_for_oplocks: oplock type 0x%x on file %s\n",
980 fsp
->oplock_type
, fsp
->fsp_name
));
986 bool request_timed_out(struct timeval request_time
,
987 struct timeval timeout
)
989 struct timeval now
, end_time
;
991 end_time
= timeval_sum(&request_time
, &timeout
);
992 return (timeval_compare(&end_time
, &now
) < 0);
995 /****************************************************************************
996 Handle the 1 second delay in returning a SHARING_VIOLATION error.
997 ****************************************************************************/
999 static void defer_open(struct share_mode_lock
*lck
,
1000 struct timeval request_time
,
1001 struct timeval timeout
,
1002 struct smb_request
*req
,
1003 struct deferred_open_record
*state
)
1007 /* Paranoia check */
1009 for (i
=0; i
<lck
->num_share_modes
; i
++) {
1010 struct share_mode_entry
*e
= &lck
->share_modes
[i
];
1012 if (!is_deferred_open_entry(e
)) {
1016 if (procid_is_me(&e
->pid
) && (e
->op_mid
== req
->mid
)) {
1017 DEBUG(0, ("Trying to defer an already deferred "
1018 "request: mid=%d, exiting\n", req
->mid
));
1019 exit_server("attempt to defer a deferred request");
1023 /* End paranoia check */
1025 DEBUG(10,("defer_open_sharing_error: time [%u.%06u] adding deferred "
1026 "open entry for mid %u\n",
1027 (unsigned int)request_time
.tv_sec
,
1028 (unsigned int)request_time
.tv_usec
,
1029 (unsigned int)req
->mid
));
1031 if (!push_deferred_smb_message(req
, request_time
, timeout
,
1032 (char *)state
, sizeof(*state
))) {
1033 exit_server("push_deferred_smb_message failed");
1035 add_deferred_open(lck
, req
->mid
, request_time
, state
->id
);
1038 * Push the MID of this packet on the signing queue.
1039 * We only do this once, the first time we push the packet
1040 * onto the deferred open queue, as this has a side effect
1041 * of incrementing the response sequence number.
1044 srv_defer_sign_response(req
->mid
);
1048 /****************************************************************************
1049 On overwrite open ensure that the attributes match.
1050 ****************************************************************************/
1052 bool open_match_attributes(connection_struct
*conn
,
1054 uint32 old_dos_attr
,
1055 uint32 new_dos_attr
,
1056 mode_t existing_unx_mode
,
1057 mode_t new_unx_mode
,
1058 mode_t
*returned_unx_mode
)
1060 uint32 noarch_old_dos_attr
, noarch_new_dos_attr
;
1062 noarch_old_dos_attr
= (old_dos_attr
& ~FILE_ATTRIBUTE_ARCHIVE
);
1063 noarch_new_dos_attr
= (new_dos_attr
& ~FILE_ATTRIBUTE_ARCHIVE
);
1065 if((noarch_old_dos_attr
== 0 && noarch_new_dos_attr
!= 0) ||
1066 (noarch_old_dos_attr
!= 0 && ((noarch_old_dos_attr
& noarch_new_dos_attr
) == noarch_old_dos_attr
))) {
1067 *returned_unx_mode
= new_unx_mode
;
1069 *returned_unx_mode
= (mode_t
)0;
1072 DEBUG(10,("open_match_attributes: file %s old_dos_attr = 0x%x, "
1073 "existing_unx_mode = 0%o, new_dos_attr = 0x%x "
1074 "returned_unx_mode = 0%o\n",
1076 (unsigned int)old_dos_attr
,
1077 (unsigned int)existing_unx_mode
,
1078 (unsigned int)new_dos_attr
,
1079 (unsigned int)*returned_unx_mode
));
1081 /* If we're mapping SYSTEM and HIDDEN ensure they match. */
1082 if (lp_map_system(SNUM(conn
)) || lp_store_dos_attributes(SNUM(conn
))) {
1083 if ((old_dos_attr
& FILE_ATTRIBUTE_SYSTEM
) &&
1084 !(new_dos_attr
& FILE_ATTRIBUTE_SYSTEM
)) {
1088 if (lp_map_hidden(SNUM(conn
)) || lp_store_dos_attributes(SNUM(conn
))) {
1089 if ((old_dos_attr
& FILE_ATTRIBUTE_HIDDEN
) &&
1090 !(new_dos_attr
& FILE_ATTRIBUTE_HIDDEN
)) {
1097 /****************************************************************************
1098 Special FCB or DOS processing in the case of a sharing violation.
1099 Try and find a duplicated file handle.
1100 ****************************************************************************/
1102 NTSTATUS
fcb_or_dos_open(struct smb_request
*req
,
1103 connection_struct
*conn
,
1104 files_struct
*fsp_to_dup_into
,
1110 uint32 share_access
,
1111 uint32 create_options
)
1115 DEBUG(5,("fcb_or_dos_open: attempting old open semantics for "
1116 "file %s.\n", fname
));
1118 for(fsp
= file_find_di_first(id
); fsp
;
1119 fsp
= file_find_di_next(fsp
)) {
1121 DEBUG(10,("fcb_or_dos_open: checking file %s, fd = %d, "
1122 "vuid = %u, file_pid = %u, private_options = 0x%x "
1123 "access_mask = 0x%x\n", fsp
->fsp_name
,
1124 fsp
->fh
->fd
, (unsigned int)fsp
->vuid
,
1125 (unsigned int)fsp
->file_pid
,
1126 (unsigned int)fsp
->fh
->private_options
,
1127 (unsigned int)fsp
->access_mask
));
1129 if (fsp
->fh
->fd
!= -1 &&
1130 fsp
->vuid
== vuid
&&
1131 fsp
->file_pid
== file_pid
&&
1132 (fsp
->fh
->private_options
& (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS
|
1133 NTCREATEX_OPTIONS_PRIVATE_DENY_FCB
)) &&
1134 (fsp
->access_mask
& FILE_WRITE_DATA
) &&
1135 strequal(fsp
->fsp_name
, fname
)) {
1136 DEBUG(10,("fcb_or_dos_open: file match\n"));
1142 return NT_STATUS_NOT_FOUND
;
1145 /* quite an insane set of semantics ... */
1146 if (is_executable(fname
) &&
1147 (fsp
->fh
->private_options
& NTCREATEX_OPTIONS_PRIVATE_DENY_DOS
)) {
1148 DEBUG(10,("fcb_or_dos_open: file fail due to is_executable.\n"));
1149 return NT_STATUS_INVALID_PARAMETER
;
1152 /* We need to duplicate this fsp. */
1153 dup_file_fsp(req
, fsp
, access_mask
, share_access
,
1154 create_options
, fsp_to_dup_into
);
1156 return NT_STATUS_OK
;
1159 /****************************************************************************
1160 Open a file with a share mode - old openX method - map into NTCreate.
1161 ****************************************************************************/
1163 bool map_open_params_to_ntcreate(const char *fname
, int deny_mode
, int open_func
,
1164 uint32
*paccess_mask
,
1165 uint32
*pshare_mode
,
1166 uint32
*pcreate_disposition
,
1167 uint32
*pcreate_options
)
1171 uint32 create_disposition
;
1172 uint32 create_options
= FILE_NON_DIRECTORY_FILE
;
1174 DEBUG(10,("map_open_params_to_ntcreate: fname = %s, deny_mode = 0x%x, "
1175 "open_func = 0x%x\n",
1176 fname
, (unsigned int)deny_mode
, (unsigned int)open_func
));
1178 /* Create the NT compatible access_mask. */
1179 switch (GET_OPENX_MODE(deny_mode
)) {
1180 case DOS_OPEN_EXEC
: /* Implies read-only - used to be FILE_READ_DATA */
1181 case DOS_OPEN_RDONLY
:
1182 access_mask
= FILE_GENERIC_READ
;
1184 case DOS_OPEN_WRONLY
:
1185 access_mask
= FILE_GENERIC_WRITE
;
1189 access_mask
= FILE_GENERIC_READ
|FILE_GENERIC_WRITE
;
1192 DEBUG(10,("map_open_params_to_ntcreate: bad open mode = 0x%x\n",
1193 (unsigned int)GET_OPENX_MODE(deny_mode
)));
1197 /* Create the NT compatible create_disposition. */
1198 switch (open_func
) {
1199 case OPENX_FILE_EXISTS_FAIL
|OPENX_FILE_CREATE_IF_NOT_EXIST
:
1200 create_disposition
= FILE_CREATE
;
1203 case OPENX_FILE_EXISTS_OPEN
:
1204 create_disposition
= FILE_OPEN
;
1207 case OPENX_FILE_EXISTS_OPEN
|OPENX_FILE_CREATE_IF_NOT_EXIST
:
1208 create_disposition
= FILE_OPEN_IF
;
1211 case OPENX_FILE_EXISTS_TRUNCATE
:
1212 create_disposition
= FILE_OVERWRITE
;
1215 case OPENX_FILE_EXISTS_TRUNCATE
|OPENX_FILE_CREATE_IF_NOT_EXIST
:
1216 create_disposition
= FILE_OVERWRITE_IF
;
1220 /* From samba4 - to be confirmed. */
1221 if (GET_OPENX_MODE(deny_mode
) == DOS_OPEN_EXEC
) {
1222 create_disposition
= FILE_CREATE
;
1225 DEBUG(10,("map_open_params_to_ntcreate: bad "
1226 "open_func 0x%x\n", (unsigned int)open_func
));
1230 /* Create the NT compatible share modes. */
1231 switch (GET_DENY_MODE(deny_mode
)) {
1233 share_mode
= FILE_SHARE_NONE
;
1237 share_mode
= FILE_SHARE_READ
;
1241 share_mode
= FILE_SHARE_WRITE
;
1245 share_mode
= FILE_SHARE_READ
|FILE_SHARE_WRITE
;
1249 create_options
|= NTCREATEX_OPTIONS_PRIVATE_DENY_DOS
;
1250 if (is_executable(fname
)) {
1251 share_mode
= FILE_SHARE_READ
|FILE_SHARE_WRITE
;
1253 if (GET_OPENX_MODE(deny_mode
) == DOS_OPEN_RDONLY
) {
1254 share_mode
= FILE_SHARE_READ
;
1256 share_mode
= FILE_SHARE_NONE
;
1262 create_options
|= NTCREATEX_OPTIONS_PRIVATE_DENY_FCB
;
1263 share_mode
= FILE_SHARE_NONE
;
1267 DEBUG(10,("map_open_params_to_ntcreate: bad deny_mode 0x%x\n",
1268 (unsigned int)GET_DENY_MODE(deny_mode
) ));
1272 DEBUG(10,("map_open_params_to_ntcreate: file %s, access_mask = 0x%x, "
1273 "share_mode = 0x%x, create_disposition = 0x%x, "
1274 "create_options = 0x%x\n",
1276 (unsigned int)access_mask
,
1277 (unsigned int)share_mode
,
1278 (unsigned int)create_disposition
,
1279 (unsigned int)create_options
));
1282 *paccess_mask
= access_mask
;
1285 *pshare_mode
= share_mode
;
1287 if (pcreate_disposition
) {
1288 *pcreate_disposition
= create_disposition
;
1290 if (pcreate_options
) {
1291 *pcreate_options
= create_options
;
1298 static void schedule_defer_open(struct share_mode_lock
*lck
,
1299 struct timeval request_time
,
1300 struct smb_request
*req
)
1302 struct deferred_open_record state
;
1304 /* This is a relative time, added to the absolute
1305 request_time value to get the absolute timeout time.
1306 Note that if this is the second or greater time we enter
1307 this codepath for this particular request mid then
1308 request_time is left as the absolute time of the *first*
1309 time this request mid was processed. This is what allows
1310 the request to eventually time out. */
1312 struct timeval timeout
;
1314 /* Normally the smbd we asked should respond within
1315 * OPLOCK_BREAK_TIMEOUT seconds regardless of whether
1316 * the client did, give twice the timeout as a safety
1317 * measure here in case the other smbd is stuck
1318 * somewhere else. */
1320 timeout
= timeval_set(OPLOCK_BREAK_TIMEOUT
*2, 0);
1322 /* Nothing actually uses state.delayed_for_oplocks
1323 but it's handy to differentiate in debug messages
1324 between a 30 second delay due to oplock break, and
1325 a 1 second delay for share mode conflicts. */
1327 state
.delayed_for_oplocks
= True
;
1330 if (!request_timed_out(request_time
, timeout
)) {
1331 defer_open(lck
, request_time
, timeout
, req
, &state
);
1335 /****************************************************************************
1336 Work out what access_mask to use from what the client sent us.
1337 ****************************************************************************/
1339 static NTSTATUS
calculate_access_mask(connection_struct
*conn
,
1342 uint32_t access_mask
,
1343 uint32_t *access_mask_out
)
1348 * Convert GENERIC bits to specific bits.
1351 se_map_generic(&access_mask
, &file_generic_mapping
);
1353 /* Calculate MAXIMUM_ALLOWED_ACCESS if requested. */
1354 if (access_mask
& MAXIMUM_ALLOWED_ACCESS
) {
1357 struct security_descriptor
*sd
;
1358 uint32_t access_granted
= 0;
1360 status
= SMB_VFS_GET_NT_ACL(conn
, fname
,
1361 (OWNER_SECURITY_INFORMATION
|
1362 GROUP_SECURITY_INFORMATION
|
1363 DACL_SECURITY_INFORMATION
),&sd
);
1365 if (!NT_STATUS_IS_OK(status
)) {
1366 DEBUG(10, ("calculate_access_mask: Could not get acl "
1369 nt_errstr(status
)));
1370 return NT_STATUS_ACCESS_DENIED
;
1373 status
= smb1_file_se_access_check(sd
,
1374 conn
->server_info
->ptok
,
1380 if (!NT_STATUS_IS_OK(status
)) {
1381 DEBUG(10, ("calculate_access_mask: Access denied on "
1382 "file %s: when calculating maximum access\n",
1384 return NT_STATUS_ACCESS_DENIED
;
1387 access_mask
= access_granted
;
1389 access_mask
= FILE_GENERIC_ALL
;
1393 *access_mask_out
= access_mask
;
1394 return NT_STATUS_OK
;
1397 /****************************************************************************
1398 Open a file with a share mode. Passed in an already created files_struct *.
1399 ****************************************************************************/
1401 static NTSTATUS
open_file_ntcreate(connection_struct
*conn
,
1402 struct smb_request
*req
,
1404 SMB_STRUCT_STAT
*psbuf
,
1405 uint32 access_mask
, /* access bits (FILE_READ_DATA etc.) */
1406 uint32 share_access
, /* share constants (FILE_SHARE_READ etc) */
1407 uint32 create_disposition
, /* FILE_OPEN_IF etc. */
1408 uint32 create_options
, /* options such as delete on close. */
1409 uint32 new_dos_attributes
, /* attributes used for new file. */
1410 int oplock_request
, /* internal Samba oplock codes. */
1411 /* Information (FILE_EXISTS etc.) */
1417 bool file_existed
= VALID_STAT(*psbuf
);
1418 bool def_acl
= False
;
1419 bool posix_open
= False
;
1420 bool new_file_created
= False
;
1421 bool clear_ads
= false;
1423 NTSTATUS fsp_open
= NT_STATUS_ACCESS_DENIED
;
1424 mode_t new_unx_mode
= (mode_t
)0;
1425 mode_t unx_mode
= (mode_t
)0;
1427 uint32 existing_dos_attributes
= 0;
1428 struct pending_message_list
*pml
= NULL
;
1429 struct timeval request_time
= timeval_zero();
1430 struct share_mode_lock
*lck
= NULL
;
1431 uint32 open_access_mask
= access_mask
;
1435 const char *newname
;
1439 if (conn
->printer
) {
1441 * Printers are handled completely differently.
1442 * Most of the passed parameters are ignored.
1446 *pinfo
= FILE_WAS_CREATED
;
1449 DEBUG(10, ("open_file_ntcreate: printer open fname=%s\n", fname
));
1451 return print_fsp_open(req
, conn
, fname
, req
->vuid
, fsp
, psbuf
);
1454 if (!parent_dirname(talloc_tos(), fname
, &parent_dir
, &newname
)) {
1455 return NT_STATUS_NO_MEMORY
;
1458 if (new_dos_attributes
& FILE_FLAG_POSIX_SEMANTICS
) {
1460 unx_mode
= (mode_t
)(new_dos_attributes
& ~FILE_FLAG_POSIX_SEMANTICS
);
1461 new_dos_attributes
= 0;
1463 /* We add aARCH to this as this mode is only used if the file is
1465 unx_mode
= unix_mode(conn
, new_dos_attributes
| aARCH
, fname
,
1469 DEBUG(10, ("open_file_ntcreate: fname=%s, dos_attrs=0x%x "
1470 "access_mask=0x%x share_access=0x%x "
1471 "create_disposition = 0x%x create_options=0x%x "
1472 "unix mode=0%o oplock_request=%d\n",
1473 fname
, new_dos_attributes
, access_mask
, share_access
,
1474 create_disposition
, create_options
, (unsigned int)unx_mode
,
1477 if ((req
== NULL
) && ((oplock_request
& INTERNAL_OPEN_ONLY
) == 0)) {
1478 DEBUG(0, ("No smb request but not an internal only open!\n"));
1479 return NT_STATUS_INTERNAL_ERROR
;
1483 * Only non-internal opens can be deferred at all
1487 && ((pml
= get_open_deferred_message(req
->mid
)) != NULL
)) {
1488 struct deferred_open_record
*state
=
1489 (struct deferred_open_record
*)pml
->private_data
.data
;
1491 /* Remember the absolute time of the original
1492 request with this mid. We'll use it later to
1493 see if this has timed out. */
1495 request_time
= pml
->request_time
;
1497 /* Remove the deferred open entry under lock. */
1498 lck
= get_share_mode_lock(talloc_tos(), state
->id
, NULL
, NULL
,
1501 DEBUG(0, ("could not get share mode lock\n"));
1503 del_deferred_open_entry(lck
, req
->mid
);
1507 /* Ensure we don't reprocess this message. */
1508 remove_deferred_open_smb_message(req
->mid
);
1511 status
= check_name(conn
, fname
);
1512 if (!NT_STATUS_IS_OK(status
)) {
1517 new_dos_attributes
&= SAMBA_ATTRIBUTES_MASK
;
1519 existing_dos_attributes
= dos_mode(conn
, fname
, psbuf
);
1523 /* ignore any oplock requests if oplocks are disabled */
1524 if (!lp_oplocks(SNUM(conn
)) || global_client_failed_oplock_break
||
1525 IS_VETO_OPLOCK_PATH(conn
, fname
)) {
1526 /* Mask off everything except the private Samba bits. */
1527 oplock_request
&= SAMBA_PRIVATE_OPLOCK_MASK
;
1530 /* this is for OS/2 long file names - say we don't support them */
1531 if (!lp_posix_pathnames() && strstr(fname
,".+,;=[].")) {
1532 /* OS/2 Workplace shell fix may be main code stream in a later
1534 DEBUG(5,("open_file_ntcreate: OS/2 long filenames are not "
1536 if (use_nt_status()) {
1537 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
1539 return NT_STATUS_DOS(ERRDOS
, ERRcannotopen
);
1542 switch( create_disposition
) {
1544 * Currently we're using FILE_SUPERSEDE as the same as
1545 * FILE_OVERWRITE_IF but they really are
1546 * different. FILE_SUPERSEDE deletes an existing file
1547 * (requiring delete access) then recreates it.
1549 case FILE_SUPERSEDE
:
1550 /* If file exists replace/overwrite. If file doesn't
1552 flags2
|= (O_CREAT
| O_TRUNC
);
1556 case FILE_OVERWRITE_IF
:
1557 /* If file exists replace/overwrite. If file doesn't
1559 flags2
|= (O_CREAT
| O_TRUNC
);
1564 /* If file exists open. If file doesn't exist error. */
1565 if (!file_existed
) {
1566 DEBUG(5,("open_file_ntcreate: FILE_OPEN "
1567 "requested for file %s and file "
1568 "doesn't exist.\n", fname
));
1570 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
1574 case FILE_OVERWRITE
:
1575 /* If file exists overwrite. If file doesn't exist
1577 if (!file_existed
) {
1578 DEBUG(5,("open_file_ntcreate: FILE_OVERWRITE "
1579 "requested for file %s and file "
1580 "doesn't exist.\n", fname
));
1582 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
1589 /* If file exists error. If file doesn't exist
1592 DEBUG(5,("open_file_ntcreate: FILE_CREATE "
1593 "requested for file %s and file "
1594 "already exists.\n", fname
));
1595 if (S_ISDIR(psbuf
->st_mode
)) {
1600 return map_nt_error_from_unix(errno
);
1602 flags2
|= (O_CREAT
|O_EXCL
);
1606 /* If file exists open. If file doesn't exist
1612 return NT_STATUS_INVALID_PARAMETER
;
1615 /* We only care about matching attributes on file exists and
1618 if (!posix_open
&& file_existed
&& ((create_disposition
== FILE_OVERWRITE
) ||
1619 (create_disposition
== FILE_OVERWRITE_IF
))) {
1620 if (!open_match_attributes(conn
, fname
,
1621 existing_dos_attributes
,
1622 new_dos_attributes
, psbuf
->st_mode
,
1623 unx_mode
, &new_unx_mode
)) {
1624 DEBUG(5,("open_file_ntcreate: attributes missmatch "
1625 "for file %s (%x %x) (0%o, 0%o)\n",
1626 fname
, existing_dos_attributes
,
1628 (unsigned int)psbuf
->st_mode
,
1629 (unsigned int)unx_mode
));
1631 return NT_STATUS_ACCESS_DENIED
;
1635 status
= calculate_access_mask(conn
, fname
, file_existed
,
1638 if (!NT_STATUS_IS_OK(status
)) {
1639 DEBUG(10, ("open_file_ntcreate: calculate_access_mask "
1640 "on file %s returned %s\n",
1642 nt_errstr(status
)));
1646 open_access_mask
= access_mask
;
1648 if ((flags2
& O_TRUNC
) || (oplock_request
& FORCE_OPLOCK_BREAK_TO_NONE
)) {
1649 open_access_mask
|= FILE_WRITE_DATA
; /* This will cause oplock breaks. */
1652 DEBUG(10, ("open_file_ntcreate: fname=%s, after mapping "
1653 "access_mask=0x%x\n", fname
, access_mask
));
1656 * Note that we ignore the append flag as append does not
1657 * mean the same thing under DOS and Unix.
1660 if ((access_mask
& (FILE_WRITE_DATA
| FILE_APPEND_DATA
)) ||
1661 (oplock_request
& FORCE_OPLOCK_BREAK_TO_NONE
)) {
1662 /* DENY_DOS opens are always underlying read-write on the
1663 file handle, no matter what the requested access mask
1665 if ((create_options
& NTCREATEX_OPTIONS_PRIVATE_DENY_DOS
) ||
1666 access_mask
& (FILE_READ_ATTRIBUTES
|FILE_READ_DATA
|FILE_READ_EA
|FILE_EXECUTE
)) {
1676 * Currently we only look at FILE_WRITE_THROUGH for create options.
1680 if ((create_options
& FILE_WRITE_THROUGH
) && lp_strict_sync(SNUM(conn
))) {
1685 if (posix_open
&& (access_mask
& FILE_APPEND_DATA
)) {
1689 if (!posix_open
&& !CAN_WRITE(conn
)) {
1691 * We should really return a permission denied error if either
1692 * O_CREAT or O_TRUNC are set, but for compatibility with
1693 * older versions of Samba we just AND them out.
1695 flags2
&= ~(O_CREAT
|O_TRUNC
);
1699 * Ensure we can't write on a read-only share or file.
1702 if (flags
!= O_RDONLY
&& file_existed
&&
1703 (!CAN_WRITE(conn
) || IS_DOS_READONLY(existing_dos_attributes
))) {
1704 DEBUG(5,("open_file_ntcreate: write access requested for "
1705 "file %s on read only %s\n",
1706 fname
, !CAN_WRITE(conn
) ? "share" : "file" ));
1708 return NT_STATUS_ACCESS_DENIED
;
1711 fsp
->file_id
= vfs_file_id_from_sbuf(conn
, psbuf
);
1712 fsp
->share_access
= share_access
;
1713 fsp
->fh
->private_options
= create_options
;
1714 fsp
->access_mask
= open_access_mask
; /* We change this to the
1715 * requested access_mask after
1716 * the open is done. */
1717 fsp
->posix_open
= posix_open
;
1719 /* Ensure no SAMBA_PRIVATE bits can be set. */
1720 fsp
->oplock_type
= (oplock_request
& ~SAMBA_PRIVATE_OPLOCK_MASK
);
1722 if (timeval_is_zero(&request_time
)) {
1723 request_time
= fsp
->open_time
;
1727 struct timespec old_write_time
= get_mtimespec(psbuf
);
1728 id
= vfs_file_id_from_sbuf(conn
, psbuf
);
1730 lck
= get_share_mode_lock(talloc_tos(), id
,
1732 fname
, &old_write_time
);
1735 DEBUG(0, ("Could not get share mode lock\n"));
1736 return NT_STATUS_SHARING_VIOLATION
;
1739 /* First pass - send break only on batch oplocks. */
1741 && delay_for_oplocks(lck
, fsp
, req
->mid
, 1,
1743 schedule_defer_open(lck
, request_time
, req
);
1745 return NT_STATUS_SHARING_VIOLATION
;
1748 /* Use the client requested access mask here, not the one we
1750 status
= open_mode_check(conn
, fname
, lck
,
1751 access_mask
, share_access
,
1752 create_options
, &file_existed
);
1754 if (NT_STATUS_IS_OK(status
)) {
1755 /* We might be going to allow this open. Check oplock
1757 /* Second pass - send break for both batch or
1758 * exclusive oplocks. */
1760 && delay_for_oplocks(lck
, fsp
, req
->mid
, 2,
1762 schedule_defer_open(lck
, request_time
, req
);
1764 return NT_STATUS_SHARING_VIOLATION
;
1768 if (NT_STATUS_EQUAL(status
, NT_STATUS_DELETE_PENDING
)) {
1769 /* DELETE_PENDING is not deferred for a second */
1774 if (!NT_STATUS_IS_OK(status
)) {
1775 uint32 can_access_mask
;
1776 bool can_access
= True
;
1778 SMB_ASSERT(NT_STATUS_EQUAL(status
, NT_STATUS_SHARING_VIOLATION
));
1780 /* Check if this can be done with the deny_dos and fcb
1782 if (create_options
&
1783 (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS
|
1784 NTCREATEX_OPTIONS_PRIVATE_DENY_FCB
)) {
1786 DEBUG(0, ("DOS open without an SMB "
1789 return NT_STATUS_INTERNAL_ERROR
;
1792 /* Use the client requested access mask here,
1793 * not the one we open with. */
1794 status
= fcb_or_dos_open(req
,
1805 if (NT_STATUS_IS_OK(status
)) {
1808 *pinfo
= FILE_WAS_OPENED
;
1810 return NT_STATUS_OK
;
1815 * This next line is a subtlety we need for
1816 * MS-Access. If a file open will fail due to share
1817 * permissions and also for security (access) reasons,
1818 * we need to return the access failed error, not the
1819 * share error. We can't open the file due to kernel
1820 * oplock deadlock (it's possible we failed above on
1821 * the open_mode_check()) so use a userspace check.
1824 if (flags
& O_RDWR
) {
1825 can_access_mask
= FILE_READ_DATA
|FILE_WRITE_DATA
;
1826 } else if (flags
& O_WRONLY
) {
1827 can_access_mask
= FILE_WRITE_DATA
;
1829 can_access_mask
= FILE_READ_DATA
;
1832 if (((can_access_mask
& FILE_WRITE_DATA
) && !CAN_WRITE(conn
)) ||
1833 !can_access_file_data(conn
,fname
,psbuf
,can_access_mask
)) {
1838 * If we're returning a share violation, ensure we
1839 * cope with the braindead 1 second delay.
1842 if (!(oplock_request
& INTERNAL_OPEN_ONLY
) &&
1843 lp_defer_sharing_violations()) {
1844 struct timeval timeout
;
1845 struct deferred_open_record state
;
1848 /* this is a hack to speed up torture tests
1850 timeout_usecs
= lp_parm_int(SNUM(conn
),
1851 "smbd","sharedelay",
1852 SHARING_VIOLATION_USEC_WAIT
);
1854 /* This is a relative time, added to the absolute
1855 request_time value to get the absolute timeout time.
1856 Note that if this is the second or greater time we enter
1857 this codepath for this particular request mid then
1858 request_time is left as the absolute time of the *first*
1859 time this request mid was processed. This is what allows
1860 the request to eventually time out. */
1862 timeout
= timeval_set(0, timeout_usecs
);
1864 /* Nothing actually uses state.delayed_for_oplocks
1865 but it's handy to differentiate in debug messages
1866 between a 30 second delay due to oplock break, and
1867 a 1 second delay for share mode conflicts. */
1869 state
.delayed_for_oplocks
= False
;
1873 && !request_timed_out(request_time
,
1875 defer_open(lck
, request_time
, timeout
,
1883 * We have detected a sharing violation here
1884 * so return the correct error code
1886 status
= NT_STATUS_SHARING_VIOLATION
;
1888 status
= NT_STATUS_ACCESS_DENIED
;
1894 * We exit this block with the share entry *locked*.....
1898 SMB_ASSERT(!file_existed
|| (lck
!= NULL
));
1901 * Ensure we pay attention to default ACLs on directories if required.
1904 if ((flags2
& O_CREAT
) && lp_inherit_acls(SNUM(conn
)) &&
1905 (def_acl
= directory_has_default_acl(conn
, parent_dir
))) {
1909 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o, "
1910 "access_mask = 0x%x, open_access_mask = 0x%x\n",
1911 (unsigned int)flags
, (unsigned int)flags2
,
1912 (unsigned int)unx_mode
, (unsigned int)access_mask
,
1913 (unsigned int)open_access_mask
));
1916 * open_file strips any O_TRUNC flags itself.
1919 fsp_open
= open_file(fsp
, conn
, req
, parent_dir
, newname
, fname
, psbuf
,
1920 flags
|flags2
, unx_mode
, access_mask
,
1923 if (!NT_STATUS_IS_OK(fsp_open
)) {
1930 if (!file_existed
) {
1931 struct timespec old_write_time
= get_mtimespec(psbuf
);
1933 * Deal with the race condition where two smbd's detect the
1934 * file doesn't exist and do the create at the same time. One
1935 * of them will win and set a share mode, the other (ie. this
1936 * one) should check if the requested share mode for this
1937 * create is allowed.
1941 * Now the file exists and fsp is successfully opened,
1942 * fsp->dev and fsp->inode are valid and should replace the
1943 * dev=0,inode=0 from a non existent file. Spotted by
1944 * Nadav Danieli <nadavd@exanet.com>. JRA.
1949 lck
= get_share_mode_lock(talloc_tos(), id
,
1951 fname
, &old_write_time
);
1954 DEBUG(0, ("open_file_ntcreate: Could not get share "
1955 "mode lock for %s\n", fname
));
1957 return NT_STATUS_SHARING_VIOLATION
;
1960 /* First pass - send break only on batch oplocks. */
1962 && delay_for_oplocks(lck
, fsp
, req
->mid
, 1,
1964 schedule_defer_open(lck
, request_time
, req
);
1967 return NT_STATUS_SHARING_VIOLATION
;
1970 status
= open_mode_check(conn
, fname
, lck
,
1971 access_mask
, share_access
,
1972 create_options
, &file_existed
);
1974 if (NT_STATUS_IS_OK(status
)) {
1975 /* We might be going to allow this open. Check oplock
1977 /* Second pass - send break for both batch or
1978 * exclusive oplocks. */
1980 && delay_for_oplocks(lck
, fsp
, req
->mid
, 2,
1982 schedule_defer_open(lck
, request_time
, req
);
1985 return NT_STATUS_SHARING_VIOLATION
;
1989 if (!NT_STATUS_IS_OK(status
)) {
1990 struct deferred_open_record state
;
1994 state
.delayed_for_oplocks
= False
;
1997 /* Do it all over again immediately. In the second
1998 * round we will find that the file existed and handle
1999 * the DELETE_PENDING and FCB cases correctly. No need
2000 * to duplicate the code here. Essentially this is a
2001 * "goto top of this function", but don't tell
2005 defer_open(lck
, request_time
, timeval_zero(),
2013 * We exit this block with the share entry *locked*.....
2018 SMB_ASSERT(lck
!= NULL
);
2020 /* Delete streams if create_disposition requires it */
2021 if (file_existed
&& clear_ads
&& !is_ntfs_stream_name(fname
)) {
2022 status
= delete_all_streams(conn
, fname
);
2023 if (!NT_STATUS_IS_OK(status
)) {
2030 /* note that we ignore failure for the following. It is
2031 basically a hack for NFS, and NFS will never set one of
2032 these only read them. Nobody but Samba can ever set a deny
2033 mode and we have already checked our more authoritative
2034 locking database for permission to set this deny mode. If
2035 the kernel refuses the operations then the kernel is wrong.
2036 note that GPFS supports it as well - jmcd */
2038 if (fsp
->fh
->fd
!= -1) {
2039 ret_flock
= SMB_VFS_KERNEL_FLOCK(fsp
, share_access
);
2040 if(ret_flock
== -1 ){
2045 return NT_STATUS_SHARING_VIOLATION
;
2050 * At this point onwards, we can guarentee that the share entry
2051 * is locked, whether we created the file or not, and that the
2052 * deny mode is compatible with all current opens.
2056 * If requested, truncate the file.
2059 if (flags2
&O_TRUNC
) {
2061 * We are modifing the file after open - update the stat
2064 if ((SMB_VFS_FTRUNCATE(fsp
, 0) == -1) ||
2065 (SMB_VFS_FSTAT(fsp
, psbuf
)==-1)) {
2066 status
= map_nt_error_from_unix(errno
);
2073 /* Record the options we were opened with. */
2074 fsp
->share_access
= share_access
;
2075 fsp
->fh
->private_options
= create_options
;
2077 * According to Samba4, SEC_FILE_READ_ATTRIBUTE is always granted,
2079 fsp
->access_mask
= access_mask
| FILE_READ_ATTRIBUTES
;
2082 /* stat opens on existing files don't get oplocks. */
2083 if (is_stat_open(open_access_mask
)) {
2084 fsp
->oplock_type
= NO_OPLOCK
;
2087 if (!(flags2
& O_TRUNC
)) {
2088 info
= FILE_WAS_OPENED
;
2090 info
= FILE_WAS_OVERWRITTEN
;
2093 info
= FILE_WAS_CREATED
;
2101 * Setup the oplock info in both the shared memory and
2105 if (!set_file_oplock(fsp
, fsp
->oplock_type
)) {
2106 /* Could not get the kernel oplock */
2107 fsp
->oplock_type
= NO_OPLOCK
;
2110 if (info
== FILE_WAS_OVERWRITTEN
|| info
== FILE_WAS_CREATED
|| info
== FILE_WAS_SUPERSEDED
) {
2111 new_file_created
= True
;
2114 set_share_mode(lck
, fsp
, conn
->server_info
->utok
.uid
, 0,
2117 /* Handle strange delete on close create semantics. */
2118 if (create_options
& FILE_DELETE_ON_CLOSE
) {
2120 status
= can_set_delete_on_close(fsp
, True
, new_dos_attributes
);
2122 if (!NT_STATUS_IS_OK(status
)) {
2123 /* Remember to delete the mode we just added. */
2124 del_share_mode(lck
, fsp
);
2129 /* Note that here we set the *inital* delete on close flag,
2130 not the regular one. The magic gets handled in close. */
2131 fsp
->initial_delete_on_close
= True
;
2134 if (new_file_created
) {
2135 /* Files should be initially set as archive */
2136 if (lp_map_archive(SNUM(conn
)) ||
2137 lp_store_dos_attributes(SNUM(conn
))) {
2139 SMB_STRUCT_STAT tmp_sbuf
;
2140 SET_STAT_INVALID(tmp_sbuf
);
2141 if (file_set_dosmode(
2143 new_dos_attributes
| aARCH
,
2144 &tmp_sbuf
, parent_dir
,
2146 unx_mode
= tmp_sbuf
.st_mode
;
2153 * Take care of inherited ACLs on created files - if default ACL not
2157 if (!posix_open
&& !file_existed
&& !def_acl
) {
2159 int saved_errno
= errno
; /* We might get ENOSYS in the next
2162 if (SMB_VFS_FCHMOD_ACL(fsp
, unx_mode
) == -1 &&
2164 errno
= saved_errno
; /* Ignore ENOSYS */
2167 } else if (new_unx_mode
) {
2171 /* Attributes need changing. File already existed. */
2174 int saved_errno
= errno
; /* We might get ENOSYS in the
2176 ret
= SMB_VFS_FCHMOD_ACL(fsp
, new_unx_mode
);
2178 if (ret
== -1 && errno
== ENOSYS
) {
2179 errno
= saved_errno
; /* Ignore ENOSYS */
2181 DEBUG(5, ("open_file_ntcreate: reset "
2182 "attributes of file %s to 0%o\n",
2183 fname
, (unsigned int)new_unx_mode
));
2184 ret
= 0; /* Don't do the fchmod below. */
2189 (SMB_VFS_FCHMOD(fsp
, new_unx_mode
) == -1))
2190 DEBUG(5, ("open_file_ntcreate: failed to reset "
2191 "attributes of file %s to 0%o\n",
2192 fname
, (unsigned int)new_unx_mode
));
2195 /* If this is a successful open, we must remove any deferred open
2198 del_deferred_open_entry(lck
, req
->mid
);
2202 return NT_STATUS_OK
;
2206 /****************************************************************************
2207 Open a file for for write to ensure that we can fchmod it.
2208 ****************************************************************************/
2210 NTSTATUS
open_file_fchmod(connection_struct
*conn
,
2212 SMB_STRUCT_STAT
*psbuf
, files_struct
**result
)
2214 if (!VALID_STAT(*psbuf
)) {
2215 return NT_STATUS_INVALID_PARAMETER
;
2218 return SMB_VFS_CREATE_FILE(
2221 0, /* root_dir_fid */
2223 0, /* create_file_flags */
2224 FILE_WRITE_DATA
, /* access_mask */
2225 (FILE_SHARE_READ
| FILE_SHARE_WRITE
| /* share_access */
2227 FILE_OPEN
, /* create_disposition*/
2228 0, /* create_options */
2229 0, /* file_attributes */
2230 INTERNAL_OPEN_ONLY
, /* oplock_request */
2231 0, /* allocation_size */
2234 result
, /* result */
2239 static NTSTATUS
mkdir_internal(connection_struct
*conn
,
2241 uint32 file_attributes
,
2242 SMB_STRUCT_STAT
*psbuf
)
2246 const char *dirname
;
2248 bool posix_open
= false;
2250 if(!CAN_WRITE(conn
)) {
2251 DEBUG(5,("mkdir_internal: failing create on read-only share "
2252 "%s\n", lp_servicename(SNUM(conn
))));
2253 return NT_STATUS_ACCESS_DENIED
;
2256 status
= check_name(conn
, name
);
2257 if (!NT_STATUS_IS_OK(status
)) {
2261 if (!parent_dirname(talloc_tos(), name
, &parent_dir
, &dirname
)) {
2262 return NT_STATUS_NO_MEMORY
;
2265 if (file_attributes
& FILE_FLAG_POSIX_SEMANTICS
) {
2267 mode
= (mode_t
)(file_attributes
& ~FILE_FLAG_POSIX_SEMANTICS
);
2269 mode
= unix_mode(conn
, aDIR
, name
, parent_dir
);
2272 if (SMB_VFS_MKDIR(conn
, name
, mode
) != 0) {
2273 return map_nt_error_from_unix(errno
);
2276 /* Ensure we're checking for a symlink here.... */
2277 /* We don't want to get caught by a symlink racer. */
2279 if (SMB_VFS_LSTAT(conn
, name
, psbuf
) == -1) {
2280 DEBUG(2, ("Could not stat directory '%s' just created: %s\n",
2281 name
, strerror(errno
)));
2282 return map_nt_error_from_unix(errno
);
2285 if (!S_ISDIR(psbuf
->st_mode
)) {
2286 DEBUG(0, ("Directory just '%s' created is not a directory\n",
2288 return NT_STATUS_ACCESS_DENIED
;
2291 if (lp_store_dos_attributes(SNUM(conn
))) {
2293 file_set_dosmode(conn
, name
,
2294 file_attributes
| aDIR
, NULL
,
2300 if (lp_inherit_perms(SNUM(conn
))) {
2301 inherit_access_posix_acl(conn
, parent_dir
, name
, mode
);
2304 if (!(file_attributes
& FILE_FLAG_POSIX_SEMANTICS
)) {
2306 * Check if high bits should have been set,
2307 * then (if bits are missing): add them.
2308 * Consider bits automagically set by UNIX, i.e. SGID bit from parent
2311 if (mode
& ~(S_IRWXU
|S_IRWXG
|S_IRWXO
) && (mode
& ~psbuf
->st_mode
)) {
2312 SMB_VFS_CHMOD(conn
, name
,
2313 psbuf
->st_mode
| (mode
& ~psbuf
->st_mode
));
2317 /* Change the owner if required. */
2318 if (lp_inherit_owner(SNUM(conn
))) {
2319 change_dir_owner_to_parent(conn
, parent_dir
, name
, psbuf
);
2322 notify_fname(conn
, NOTIFY_ACTION_ADDED
, FILE_NOTIFY_CHANGE_DIR_NAME
,
2325 return NT_STATUS_OK
;
2328 /****************************************************************************
2329 Open a directory from an NT SMB call.
2330 ****************************************************************************/
2332 static NTSTATUS
open_directory(connection_struct
*conn
,
2333 struct smb_request
*req
,
2335 SMB_STRUCT_STAT
*psbuf
,
2337 uint32 share_access
,
2338 uint32 create_disposition
,
2339 uint32 create_options
,
2340 uint32 file_attributes
,
2342 files_struct
**result
)
2344 files_struct
*fsp
= NULL
;
2345 bool dir_existed
= VALID_STAT(*psbuf
) ? True
: False
;
2346 struct share_mode_lock
*lck
= NULL
;
2348 struct timespec mtimespec
;
2351 DEBUG(5,("open_directory: opening directory %s, access_mask = 0x%x, "
2352 "share_access = 0x%x create_options = 0x%x, "
2353 "create_disposition = 0x%x, file_attributes = 0x%x\n",
2355 (unsigned int)access_mask
,
2356 (unsigned int)share_access
,
2357 (unsigned int)create_options
,
2358 (unsigned int)create_disposition
,
2359 (unsigned int)file_attributes
));
2361 if (!(file_attributes
& FILE_FLAG_POSIX_SEMANTICS
) &&
2362 (conn
->fs_capabilities
& FILE_NAMED_STREAMS
) &&
2363 is_ntfs_stream_name(fname
)) {
2364 DEBUG(2, ("open_directory: %s is a stream name!\n", fname
));
2365 return NT_STATUS_NOT_A_DIRECTORY
;
2368 status
= calculate_access_mask(conn
, fname
, dir_existed
,
2371 if (!NT_STATUS_IS_OK(status
)) {
2372 DEBUG(10, ("open_directory: calculate_access_mask "
2373 "on file %s returned %s\n",
2375 nt_errstr(status
)));
2379 /* We need to support SeSecurityPrivilege for this. */
2380 if (access_mask
& SEC_FLAG_SYSTEM_SECURITY
) {
2381 DEBUG(10, ("open_directory: open on %s "
2382 "failed - SEC_FLAG_SYSTEM_SECURITY denied.\n",
2384 return NT_STATUS_PRIVILEGE_NOT_HELD
;
2387 switch( create_disposition
) {
2390 info
= FILE_WAS_OPENED
;
2393 * We want to follow symlinks here.
2396 if (SMB_VFS_STAT(conn
, fname
, psbuf
) != 0) {
2397 return map_nt_error_from_unix(errno
);
2404 /* If directory exists error. If directory doesn't
2407 status
= mkdir_internal(conn
,
2412 if (!NT_STATUS_IS_OK(status
)) {
2413 DEBUG(2, ("open_directory: unable to create "
2414 "%s. Error was %s\n", fname
,
2415 nt_errstr(status
)));
2419 info
= FILE_WAS_CREATED
;
2424 * If directory exists open. If directory doesn't
2428 status
= mkdir_internal(conn
,
2433 if (NT_STATUS_IS_OK(status
)) {
2434 info
= FILE_WAS_CREATED
;
2437 if (NT_STATUS_EQUAL(status
,
2438 NT_STATUS_OBJECT_NAME_COLLISION
)) {
2439 info
= FILE_WAS_OPENED
;
2440 status
= NT_STATUS_OK
;
2445 case FILE_SUPERSEDE
:
2446 case FILE_OVERWRITE
:
2447 case FILE_OVERWRITE_IF
:
2449 DEBUG(5,("open_directory: invalid create_disposition "
2450 "0x%x for directory %s\n",
2451 (unsigned int)create_disposition
, fname
));
2452 return NT_STATUS_INVALID_PARAMETER
;
2455 if(!S_ISDIR(psbuf
->st_mode
)) {
2456 DEBUG(5,("open_directory: %s is not a directory !\n",
2458 return NT_STATUS_NOT_A_DIRECTORY
;
2461 if (info
== FILE_WAS_OPENED
) {
2462 uint32_t access_granted
= 0;
2463 status
= check_open_rights(conn
,
2468 /* Were we trying to do a directory open
2469 * for delete and didn't get DELETE
2470 * access (only) ? Check if the
2471 * directory allows DELETE_CHILD.
2473 * http://blogs.msdn.com/oldnewthing/archive/2004/06/04/148426.aspx
2476 if ((NT_STATUS_EQUAL(status
, NT_STATUS_ACCESS_DENIED
) &&
2477 (access_mask
& DELETE_ACCESS
) &&
2478 (access_granted
== DELETE_ACCESS
) &&
2479 can_delete_file_in_directory(conn
, fname
))) {
2480 DEBUG(10,("open_directory: overrode ACCESS_DENIED "
2481 "on directory %s\n",
2483 status
= NT_STATUS_OK
;
2486 if (!NT_STATUS_IS_OK(status
)) {
2487 DEBUG(10, ("open_directory: check_open_rights on "
2488 "file %s failed with %s\n",
2490 nt_errstr(status
)));
2495 status
= file_new(req
, conn
, &fsp
);
2496 if(!NT_STATUS_IS_OK(status
)) {
2501 * Setup the files_struct for it.
2504 fsp
->mode
= psbuf
->st_mode
;
2505 fsp
->file_id
= vfs_file_id_from_sbuf(conn
, psbuf
);
2506 fsp
->vuid
= req
? req
->vuid
: UID_FIELD_INVALID
;
2507 fsp
->file_pid
= req
? req
->smbpid
: 0;
2508 fsp
->can_lock
= False
;
2509 fsp
->can_read
= False
;
2510 fsp
->can_write
= False
;
2512 fsp
->share_access
= share_access
;
2513 fsp
->fh
->private_options
= create_options
;
2515 * According to Samba4, SEC_FILE_READ_ATTRIBUTE is always granted,
2517 fsp
->access_mask
= access_mask
| FILE_READ_ATTRIBUTES
;
2518 fsp
->print_file
= False
;
2519 fsp
->modified
= False
;
2520 fsp
->oplock_type
= NO_OPLOCK
;
2521 fsp
->sent_oplock_break
= NO_BREAK_SENT
;
2522 fsp
->is_directory
= True
;
2523 fsp
->posix_open
= (file_attributes
& FILE_FLAG_POSIX_SEMANTICS
) ? True
: False
;
2525 string_set(&fsp
->fsp_name
,fname
);
2527 mtimespec
= get_mtimespec(psbuf
);
2529 lck
= get_share_mode_lock(talloc_tos(), fsp
->file_id
,
2534 DEBUG(0, ("open_directory: Could not get share mode lock for %s\n", fname
));
2535 file_free(req
, fsp
);
2536 return NT_STATUS_SHARING_VIOLATION
;
2539 status
= open_mode_check(conn
, fname
, lck
,
2540 access_mask
, share_access
,
2541 create_options
, &dir_existed
);
2543 if (!NT_STATUS_IS_OK(status
)) {
2545 file_free(req
, fsp
);
2549 set_share_mode(lck
, fsp
, conn
->server_info
->utok
.uid
, 0, NO_OPLOCK
);
2551 /* For directories the delete on close bit at open time seems
2552 always to be honored on close... See test 19 in Samba4 BASE-DELETE. */
2553 if (create_options
& FILE_DELETE_ON_CLOSE
) {
2554 status
= can_set_delete_on_close(fsp
, True
, 0);
2555 if (!NT_STATUS_IS_OK(status
) && !NT_STATUS_EQUAL(status
, NT_STATUS_DIRECTORY_NOT_EMPTY
)) {
2557 file_free(req
, fsp
);
2561 if (NT_STATUS_IS_OK(status
)) {
2562 /* Note that here we set the *inital* delete on close flag,
2563 not the regular one. The magic gets handled in close. */
2564 fsp
->initial_delete_on_close
= True
;
2575 return NT_STATUS_OK
;
2578 NTSTATUS
create_directory(connection_struct
*conn
, struct smb_request
*req
, const char *directory
)
2581 SMB_STRUCT_STAT sbuf
;
2584 SET_STAT_INVALID(sbuf
);
2586 status
= SMB_VFS_CREATE_FILE(
2589 0, /* root_dir_fid */
2590 directory
, /* fname */
2591 0, /* create_file_flags */
2592 FILE_READ_ATTRIBUTES
, /* access_mask */
2593 FILE_SHARE_NONE
, /* share_access */
2594 FILE_CREATE
, /* create_disposition*/
2595 FILE_DIRECTORY_FILE
, /* create_options */
2596 FILE_ATTRIBUTE_DIRECTORY
, /* file_attributes */
2597 0, /* oplock_request */
2598 0, /* allocation_size */
2605 if (NT_STATUS_IS_OK(status
)) {
2606 close_file(req
, fsp
, NORMAL_CLOSE
);
2612 /****************************************************************************
2613 Receive notification that one of our open files has been renamed by another
2615 ****************************************************************************/
2617 void msg_file_was_renamed(struct messaging_context
*msg
,
2620 struct server_id server_id
,
2624 char *frm
= (char *)data
->data
;
2626 const char *sharepath
;
2627 const char *newname
;
2630 if (data
->data
== NULL
2631 || data
->length
< MSG_FILE_RENAMED_MIN_SIZE
+ 2) {
2632 DEBUG(0, ("msg_file_was_renamed: Got invalid msg len %d\n",
2633 (int)data
->length
));
2637 /* Unpack the message. */
2638 pull_file_id_24(frm
, &id
);
2639 sharepath
= &frm
[24];
2640 newname
= sharepath
+ strlen(sharepath
) + 1;
2641 sp_len
= strlen(sharepath
);
2643 DEBUG(10,("msg_file_was_renamed: Got rename message for sharepath %s, new name %s, "
2645 sharepath
, newname
, file_id_string_tos(&id
)));
2647 for(fsp
= file_find_di_first(id
); fsp
; fsp
= file_find_di_next(fsp
)) {
2648 if (memcmp(fsp
->conn
->connectpath
, sharepath
, sp_len
) == 0) {
2649 DEBUG(10,("msg_file_was_renamed: renaming file fnum %d from %s -> %s\n",
2650 fsp
->fnum
, fsp
->fsp_name
, newname
));
2651 string_set(&fsp
->fsp_name
, newname
);
2654 /* Now we have the complete path we can work out if this is
2655 actually within this share and adjust newname accordingly. */
2656 DEBUG(10,("msg_file_was_renamed: share mismatch (sharepath %s "
2657 "not sharepath %s) "
2658 "fnum %d from %s -> %s\n",
2659 fsp
->conn
->connectpath
,
2668 struct case_semantics_state
{
2669 connection_struct
*conn
;
2670 bool case_sensitive
;
2672 bool short_case_preserve
;
2675 /****************************************************************************
2676 Restore case semantics.
2677 ****************************************************************************/
2678 static int restore_case_semantics(struct case_semantics_state
*state
)
2680 state
->conn
->case_sensitive
= state
->case_sensitive
;
2681 state
->conn
->case_preserve
= state
->case_preserve
;
2682 state
->conn
->short_case_preserve
= state
->short_case_preserve
;
2686 /****************************************************************************
2687 Save case semantics.
2688 ****************************************************************************/
2689 struct case_semantics_state
*set_posix_case_semantics(TALLOC_CTX
*mem_ctx
,
2690 connection_struct
*conn
)
2692 struct case_semantics_state
*result
;
2694 if (!(result
= talloc(mem_ctx
, struct case_semantics_state
))) {
2695 DEBUG(0, ("talloc failed\n"));
2699 result
->conn
= conn
;
2700 result
->case_sensitive
= conn
->case_sensitive
;
2701 result
->case_preserve
= conn
->case_preserve
;
2702 result
->short_case_preserve
= conn
->short_case_preserve
;
2705 conn
->case_sensitive
= True
;
2706 conn
->case_preserve
= True
;
2707 conn
->short_case_preserve
= True
;
2709 talloc_set_destructor(result
, restore_case_semantics
);
2715 * If a main file is opened for delete, all streams need to be checked for
2716 * !FILE_SHARE_DELETE. Do this by opening with DELETE_ACCESS.
2717 * If that works, delete them all by setting the delete on close and close.
2720 NTSTATUS
open_streams_for_delete(connection_struct
*conn
,
2723 struct stream_struct
*stream_info
;
2724 files_struct
**streams
;
2726 unsigned int num_streams
;
2727 TALLOC_CTX
*frame
= talloc_stackframe();
2730 status
= SMB_VFS_STREAMINFO(conn
, NULL
, fname
, talloc_tos(),
2731 &num_streams
, &stream_info
);
2733 if (NT_STATUS_EQUAL(status
, NT_STATUS_NOT_IMPLEMENTED
)
2734 || NT_STATUS_EQUAL(status
, NT_STATUS_OBJECT_NAME_NOT_FOUND
)) {
2735 DEBUG(10, ("no streams around\n"));
2737 return NT_STATUS_OK
;
2740 if (!NT_STATUS_IS_OK(status
)) {
2741 DEBUG(10, ("SMB_VFS_STREAMINFO failed: %s\n",
2742 nt_errstr(status
)));
2746 DEBUG(10, ("open_streams_for_delete found %d streams\n",
2749 if (num_streams
== 0) {
2751 return NT_STATUS_OK
;
2754 streams
= TALLOC_ARRAY(talloc_tos(), files_struct
*, num_streams
);
2755 if (streams
== NULL
) {
2756 DEBUG(0, ("talloc failed\n"));
2757 status
= NT_STATUS_NO_MEMORY
;
2761 for (i
=0; i
<num_streams
; i
++) {
2764 if (strequal(stream_info
[i
].name
, "::$DATA")) {
2769 streamname
= talloc_asprintf(talloc_tos(), "%s%s", fname
,
2770 stream_info
[i
].name
);
2772 if (streamname
== NULL
) {
2773 DEBUG(0, ("talloc_aprintf failed\n"));
2774 status
= NT_STATUS_NO_MEMORY
;
2778 status
= SMB_VFS_CREATE_FILE(
2781 0, /* root_dir_fid */
2782 streamname
, /* fname */
2783 0, /* create_file_flags */
2784 DELETE_ACCESS
, /* access_mask */
2785 (FILE_SHARE_READ
| /* share_access */
2786 FILE_SHARE_WRITE
| FILE_SHARE_DELETE
),
2787 FILE_OPEN
, /* create_disposition*/
2788 NTCREATEX_OPTIONS_PRIVATE_STREAM_DELETE
, /* create_options */
2789 FILE_ATTRIBUTE_NORMAL
, /* file_attributes */
2790 0, /* oplock_request */
2791 0, /* allocation_size */
2794 &streams
[i
], /* result */
2798 TALLOC_FREE(streamname
);
2800 if (!NT_STATUS_IS_OK(status
)) {
2801 DEBUG(10, ("Could not open stream %s: %s\n",
2802 streamname
, nt_errstr(status
)));
2808 * don't touch the variable "status" beyond this point :-)
2811 for (i
-= 1 ; i
>= 0; i
--) {
2812 if (streams
[i
] == NULL
) {
2816 DEBUG(10, ("Closing stream # %d, %s\n", i
,
2817 streams
[i
]->fsp_name
));
2818 close_file(NULL
, streams
[i
], NORMAL_CLOSE
);
2827 * Wrapper around open_file_ntcreate and open_directory
2830 static NTSTATUS
create_file_unixpath(connection_struct
*conn
,
2831 struct smb_request
*req
,
2833 uint32_t access_mask
,
2834 uint32_t share_access
,
2835 uint32_t create_disposition
,
2836 uint32_t create_options
,
2837 uint32_t file_attributes
,
2838 uint32_t oplock_request
,
2839 uint64_t allocation_size
,
2840 struct security_descriptor
*sd
,
2841 struct ea_list
*ea_list
,
2843 files_struct
**result
,
2845 SMB_STRUCT_STAT
*psbuf
)
2847 SMB_STRUCT_STAT sbuf
;
2848 int info
= FILE_WAS_OPENED
;
2849 files_struct
*base_fsp
= NULL
;
2850 files_struct
*fsp
= NULL
;
2853 DEBUG(10,("create_file_unixpath: access_mask = 0x%x "
2854 "file_attributes = 0x%x, share_access = 0x%x, "
2855 "create_disposition = 0x%x create_options = 0x%x "
2856 "oplock_request = 0x%x ea_list = 0x%p, sd = 0x%p, "
2858 (unsigned int)access_mask
,
2859 (unsigned int)file_attributes
,
2860 (unsigned int)share_access
,
2861 (unsigned int)create_disposition
,
2862 (unsigned int)create_options
,
2863 (unsigned int)oplock_request
,
2864 ea_list
, sd
, fname
));
2866 if (create_options
& FILE_OPEN_BY_FILE_ID
) {
2867 status
= NT_STATUS_NOT_SUPPORTED
;
2871 if (create_options
& NTCREATEX_OPTIONS_INVALID_PARAM_MASK
) {
2872 status
= NT_STATUS_INVALID_PARAMETER
;
2877 oplock_request
|= INTERNAL_OPEN_ONLY
;
2880 if (psbuf
!= NULL
) {
2884 if (SMB_VFS_STAT(conn
, fname
, &sbuf
) == -1) {
2885 SET_STAT_INVALID(sbuf
);
2889 if ((conn
->fs_capabilities
& FILE_NAMED_STREAMS
)
2890 && (access_mask
& DELETE_ACCESS
)
2891 && !is_ntfs_stream_name(fname
)) {
2893 * We can't open a file with DELETE access if any of the
2894 * streams is open without FILE_SHARE_DELETE
2896 status
= open_streams_for_delete(conn
, fname
);
2898 if (!NT_STATUS_IS_OK(status
)) {
2903 /* This is the correct thing to do (check every time) but can_delete
2904 * is expensive (it may have to read the parent directory
2905 * permissions). So for now we're not doing it unless we have a strong
2906 * hint the client is really going to delete this file. If the client
2907 * is forcing FILE_CREATE let the filesystem take care of the
2910 /* Setting FILE_SHARE_DELETE is the hint. */
2912 if (lp_acl_check_permissions(SNUM(conn
))
2913 && (create_disposition
!= FILE_CREATE
)
2914 && (share_access
& FILE_SHARE_DELETE
)
2915 && (access_mask
& DELETE_ACCESS
)
2916 && (!(can_delete_file_in_directory(conn
, fname
) ||
2917 can_access_file_acl(conn
, fname
, DELETE_ACCESS
)))) {
2918 status
= NT_STATUS_ACCESS_DENIED
;
2919 DEBUG(10,("create_file_unixpath: open file %s "
2920 "for delete ACCESS_DENIED\n", fname
));
2925 /* We need to support SeSecurityPrivilege for this. */
2926 if ((access_mask
& SEC_FLAG_SYSTEM_SECURITY
) &&
2927 !user_has_privileges(current_user
.nt_user_token
,
2929 status
= NT_STATUS_PRIVILEGE_NOT_HELD
;
2933 /* We need to support SeSecurityPrivilege for this. */
2934 if (access_mask
& SEC_FLAG_SYSTEM_SECURITY
) {
2935 status
= NT_STATUS_PRIVILEGE_NOT_HELD
;
2938 /* Don't allow a SACL set from an NTtrans create until we
2939 * support SeSecurityPrivilege. */
2940 if (!VALID_STAT(sbuf
) &&
2941 lp_nt_acl_support(SNUM(conn
)) &&
2942 sd
&& (sd
->sacl
!= NULL
)) {
2943 status
= NT_STATUS_PRIVILEGE_NOT_HELD
;
2948 if ((conn
->fs_capabilities
& FILE_NAMED_STREAMS
)
2949 && is_ntfs_stream_name(fname
)
2950 && (!(create_options
& NTCREATEX_OPTIONS_PRIVATE_STREAM_DELETE
))) {
2952 uint32 base_create_disposition
;
2954 if (create_options
& FILE_DIRECTORY_FILE
) {
2955 status
= NT_STATUS_NOT_A_DIRECTORY
;
2959 status
= split_ntfs_stream_name(talloc_tos(), fname
,
2961 if (!NT_STATUS_IS_OK(status
)) {
2962 DEBUG(10, ("create_file_unixpath: "
2963 "split_ntfs_stream_name failed: %s\n",
2964 nt_errstr(status
)));
2968 SMB_ASSERT(!is_ntfs_stream_name(base
)); /* paranoia.. */
2970 switch (create_disposition
) {
2972 base_create_disposition
= FILE_OPEN
;
2975 base_create_disposition
= FILE_OPEN_IF
;
2979 status
= create_file_unixpath(conn
, NULL
, base
, 0,
2982 | FILE_SHARE_DELETE
,
2983 base_create_disposition
,
2984 0, 0, 0, 0, NULL
, NULL
,
2985 &base_fsp
, NULL
, NULL
);
2986 if (!NT_STATUS_IS_OK(status
)) {
2987 DEBUG(10, ("create_file_unixpath for base %s failed: "
2988 "%s\n", base
, nt_errstr(status
)));
2991 /* we don't need to low level fd */
2996 * If it's a request for a directory open, deal with it separately.
2999 if (create_options
& FILE_DIRECTORY_FILE
) {
3001 if (create_options
& FILE_NON_DIRECTORY_FILE
) {
3002 status
= NT_STATUS_INVALID_PARAMETER
;
3006 /* Can't open a temp directory. IFS kit test. */
3007 if (!(file_attributes
& FILE_FLAG_POSIX_SEMANTICS
) &&
3008 (file_attributes
& FILE_ATTRIBUTE_TEMPORARY
)) {
3009 status
= NT_STATUS_INVALID_PARAMETER
;
3014 * We will get a create directory here if the Win32
3015 * app specified a security descriptor in the
3016 * CreateDirectory() call.
3020 status
= open_directory(
3021 conn
, req
, fname
, &sbuf
, access_mask
, share_access
,
3022 create_disposition
, create_options
, file_attributes
,
3027 * Ordinary file case.
3030 status
= file_new(req
, conn
, &fsp
);
3031 if(!NT_STATUS_IS_OK(status
)) {
3036 * We're opening the stream element of a base_fsp
3037 * we already opened. Set up the base_fsp pointer.
3040 fsp
->base_fsp
= base_fsp
;
3043 status
= open_file_ntcreate(conn
,
3056 if(!NT_STATUS_IS_OK(status
)) {
3057 file_free(req
, fsp
);
3061 if (NT_STATUS_EQUAL(status
, NT_STATUS_FILE_IS_A_DIRECTORY
)) {
3063 /* A stream open never opens a directory */
3066 status
= NT_STATUS_FILE_IS_A_DIRECTORY
;
3071 * Fail the open if it was explicitly a non-directory
3075 if (create_options
& FILE_NON_DIRECTORY_FILE
) {
3076 status
= NT_STATUS_FILE_IS_A_DIRECTORY
;
3081 status
= open_directory(
3082 conn
, req
, fname
, &sbuf
, access_mask
,
3083 share_access
, create_disposition
,
3084 create_options
, file_attributes
,
3089 if (!NT_STATUS_IS_OK(status
)) {
3093 fsp
->base_fsp
= base_fsp
;
3096 * According to the MS documentation, the only time the security
3097 * descriptor is applied to the opened file is iff we *created* the
3098 * file; an existing file stays the same.
3100 * Also, it seems (from observation) that you can open the file with
3101 * any access mask but you can still write the sd. We need to override
3102 * the granted access before we call set_sd
3103 * Patch for bug #2242 from Tom Lackemann <cessnatomny@yahoo.com>.
3106 if ((sd
!= NULL
) && (info
== FILE_WAS_CREATED
)
3107 && lp_nt_acl_support(SNUM(conn
))) {
3109 uint32_t sec_info_sent
;
3110 uint32_t saved_access_mask
= fsp
->access_mask
;
3112 sec_info_sent
= get_sec_info(sd
);
3114 fsp
->access_mask
= FILE_GENERIC_ALL
;
3116 /* Convert all the generic bits. */
3117 security_acl_map_generic(sd
->dacl
, &file_generic_mapping
);
3118 security_acl_map_generic(sd
->sacl
, &file_generic_mapping
);
3120 if (sec_info_sent
& (OWNER_SECURITY_INFORMATION
|
3121 GROUP_SECURITY_INFORMATION
|
3122 DACL_SECURITY_INFORMATION
|
3123 SACL_SECURITY_INFORMATION
)) {
3124 status
= SMB_VFS_FSET_NT_ACL(fsp
, sec_info_sent
, sd
);
3127 fsp
->access_mask
= saved_access_mask
;
3129 if (!NT_STATUS_IS_OK(status
)) {
3134 if ((ea_list
!= NULL
) &&
3135 ((info
== FILE_WAS_CREATED
) || (info
== FILE_WAS_OVERWRITTEN
))) {
3136 status
= set_ea(conn
, fsp
, fname
, ea_list
);
3137 if (!NT_STATUS_IS_OK(status
)) {
3142 if (!fsp
->is_directory
&& S_ISDIR(sbuf
.st_mode
)) {
3143 status
= NT_STATUS_ACCESS_DENIED
;
3147 /* Save the requested allocation size. */
3148 if ((info
== FILE_WAS_CREATED
) || (info
== FILE_WAS_OVERWRITTEN
)) {
3150 && (allocation_size
> sbuf
.st_size
)) {
3151 fsp
->initial_allocation_size
= smb_roundup(
3152 fsp
->conn
, allocation_size
);
3153 if (fsp
->is_directory
) {
3154 /* Can't set allocation size on a directory. */
3155 status
= NT_STATUS_ACCESS_DENIED
;
3158 if (vfs_allocate_file_space(
3159 fsp
, fsp
->initial_allocation_size
) == -1) {
3160 status
= NT_STATUS_DISK_FULL
;
3164 fsp
->initial_allocation_size
= smb_roundup(
3165 fsp
->conn
, (uint64_t)sbuf
.st_size
);
3169 DEBUG(10, ("create_file_unixpath: info=%d\n", info
));
3172 if (pinfo
!= NULL
) {
3175 if (psbuf
!= NULL
) {
3176 if ((fsp
->fh
== NULL
) || (fsp
->fh
->fd
== -1)) {
3180 SMB_VFS_FSTAT(fsp
, psbuf
);
3183 return NT_STATUS_OK
;
3186 DEBUG(10, ("create_file_unixpath: %s\n", nt_errstr(status
)));
3189 if (base_fsp
&& fsp
->base_fsp
== base_fsp
) {
3191 * The close_file below will close
3196 close_file(req
, fsp
, ERROR_CLOSE
);
3199 if (base_fsp
!= NULL
) {
3200 close_file(req
, base_fsp
, ERROR_CLOSE
);
3207 * Calculate the full path name given a relative fid.
3209 NTSTATUS
get_relative_fid_filename(connection_struct
*conn
,
3210 struct smb_request
*req
,
3211 uint16_t root_dir_fid
,
3212 const char *fname
, char **new_fname
)
3214 files_struct
*dir_fsp
;
3215 char *parent_fname
= NULL
;
3217 if (root_dir_fid
== 0 || !fname
|| !new_fname
) {
3218 return NT_STATUS_INTERNAL_ERROR
;
3221 dir_fsp
= file_fsp(req
, root_dir_fid
);
3223 if (dir_fsp
== NULL
) {
3224 return NT_STATUS_INVALID_HANDLE
;
3227 if (!dir_fsp
->is_directory
) {
3230 * Check to see if this is a mac fork of some kind.
3233 if ((conn
->fs_capabilities
& FILE_NAMED_STREAMS
) &&
3234 is_ntfs_stream_name(fname
)) {
3235 return NT_STATUS_OBJECT_PATH_NOT_FOUND
;
3239 we need to handle the case when we get a
3240 relative open relative to a file and the
3241 pathname is blank - this is a reopen!
3242 (hint from demyn plantenberg)
3245 return NT_STATUS_INVALID_HANDLE
;
3248 if (ISDOT(dir_fsp
->fsp_name
)) {
3250 * We're at the toplevel dir, the final file name
3251 * must not contain ./, as this is filtered out
3252 * normally by srvstr_get_path and unix_convert
3253 * explicitly rejects paths containing ./.
3255 parent_fname
= talloc_strdup(talloc_tos(), "");
3256 if (parent_fname
== NULL
) {
3257 return NT_STATUS_NO_MEMORY
;
3260 size_t dir_name_len
= strlen(dir_fsp
->fsp_name
);
3263 * Copy in the base directory name.
3266 parent_fname
= TALLOC_ARRAY(talloc_tos(), char,
3268 if (parent_fname
== NULL
) {
3269 return NT_STATUS_NO_MEMORY
;
3271 memcpy(parent_fname
, dir_fsp
->fsp_name
,
3275 * Ensure it ends in a '/'.
3276 * We used TALLOC_SIZE +2 to add space for the '/'.
3280 && (parent_fname
[dir_name_len
-1] != '\\')
3281 && (parent_fname
[dir_name_len
-1] != '/')) {
3282 parent_fname
[dir_name_len
] = '/';
3283 parent_fname
[dir_name_len
+1] = '\0';
3287 *new_fname
= talloc_asprintf(talloc_tos(), "%s%s", parent_fname
,
3289 if (*new_fname
== NULL
) {
3290 return NT_STATUS_NO_MEMORY
;
3293 return NT_STATUS_OK
;
3296 NTSTATUS
create_file_default(connection_struct
*conn
,
3297 struct smb_request
*req
,
3298 uint16_t root_dir_fid
,
3300 uint32_t create_file_flags
,
3301 uint32_t access_mask
,
3302 uint32_t share_access
,
3303 uint32_t create_disposition
,
3304 uint32_t create_options
,
3305 uint32_t file_attributes
,
3306 uint32_t oplock_request
,
3307 uint64_t allocation_size
,
3308 struct security_descriptor
*sd
,
3309 struct ea_list
*ea_list
,
3311 files_struct
**result
,
3313 SMB_STRUCT_STAT
*psbuf
)
3315 SMB_STRUCT_STAT sbuf
;
3316 int info
= FILE_WAS_OPENED
;
3317 files_struct
*fsp
= NULL
;
3320 DEBUG(10,("create_file: access_mask = 0x%x "
3321 "file_attributes = 0x%x, share_access = 0x%x, "
3322 "create_disposition = 0x%x create_options = 0x%x "
3323 "oplock_request = 0x%x "
3324 "root_dir_fid = 0x%x, ea_list = 0x%p, sd = 0x%p, "
3325 "create_file_flags = 0x%x, fname = %s\n",
3326 (unsigned int)access_mask
,
3327 (unsigned int)file_attributes
,
3328 (unsigned int)share_access
,
3329 (unsigned int)create_disposition
,
3330 (unsigned int)create_options
,
3331 (unsigned int)oplock_request
,
3332 (unsigned int)root_dir_fid
,
3333 ea_list
, sd
, create_file_flags
, fname
));
3335 /* MSDFS pathname processing must be done FIRST.
3336 MSDFS pathnames containing IPv6 addresses can
3337 be confused with NTFS stream names (they contain
3338 ":" characters. JRA. */
3340 if ((req
!= NULL
) && (req
->flags2
& FLAGS2_DFS_PATHNAMES
)) {
3341 char *resolved_fname
;
3343 status
= resolve_dfspath(talloc_tos(), conn
, true, fname
,
3346 if (!NT_STATUS_IS_OK(status
)) {
3348 * For PATH_NOT_COVERED we had
3349 * reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
3350 * ERRSRV, ERRbadpath);
3351 * Need to fix in callers
3355 fname
= resolved_fname
;
3359 * Calculate the filename from the root_dir_if if necessary.
3362 if (root_dir_fid
!= 0) {
3365 status
= get_relative_fid_filename(conn
, req
, root_dir_fid
,
3367 if (!NT_STATUS_IS_OK(status
)) {
3375 * Check to see if this is a mac fork of some kind.
3378 if (is_ntfs_stream_name(fname
)) {
3379 enum FAKE_FILE_TYPE fake_file_type
;
3381 fake_file_type
= is_fake_file(fname
);
3383 if (fake_file_type
!= FAKE_FILE_TYPE_NONE
) {
3386 * Here we go! support for changing the disk quotas
3389 * We need to fake up to open this MAGIC QUOTA file
3390 * and return a valid FID.
3392 * w2k close this file directly after openening xp
3393 * also tries a QUERY_FILE_INFO on the file and then
3396 status
= open_fake_file(req
, conn
, req
->vuid
,
3397 fake_file_type
, fname
,
3399 if (!NT_STATUS_IS_OK(status
)) {
3407 if (!(conn
->fs_capabilities
& FILE_NAMED_STREAMS
)) {
3408 status
= NT_STATUS_OBJECT_PATH_NOT_FOUND
;
3413 if (create_file_flags
& CFF_DOS_PATH
) {
3414 char *converted_fname
;
3416 SET_STAT_INVALID(sbuf
);
3418 status
= unix_convert(talloc_tos(), conn
, fname
, False
,
3419 &converted_fname
, NULL
, &sbuf
);
3420 if (!NT_STATUS_IS_OK(status
)) {
3423 fname
= converted_fname
;
3425 if (psbuf
!= NULL
) {
3428 if (SMB_VFS_STAT(conn
, fname
, &sbuf
) == -1) {
3429 SET_STAT_INVALID(sbuf
);
3435 /* All file access must go through check_name() */
3437 status
= check_name(conn
, fname
);
3438 if (!NT_STATUS_IS_OK(status
)) {
3442 status
= create_file_unixpath(
3443 conn
, req
, fname
, access_mask
, share_access
,
3444 create_disposition
, create_options
, file_attributes
,
3445 oplock_request
, allocation_size
, sd
, ea_list
,
3446 &fsp
, &info
, &sbuf
);
3448 if (!NT_STATUS_IS_OK(status
)) {
3453 DEBUG(10, ("create_file: info=%d\n", info
));
3456 if (pinfo
!= NULL
) {
3459 if (psbuf
!= NULL
) {
3462 return NT_STATUS_OK
;
3465 DEBUG(10, ("create_file: %s\n", nt_errstr(status
)));
3468 close_file(req
, fsp
, ERROR_CLOSE
);