fix for bad check spotted by Ray Simard <ray@sylvan-glade.com>
[Samba.git] / source3 / smbd / open.c
blobcee2b37184917ab1d43e2f3a8ea724f68ee279d5
1 /*
2 Unix SMB/CIFS implementation.
3 file opening and share modes
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Jeremy Allison 2001
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "includes.h"
24 extern userdom_struct current_user_info;
25 extern uint16 global_oplock_port;
26 extern BOOL global_client_failed_oplock_break;
28 /****************************************************************************
29 fd support routines - attempt to do a dos_open.
30 ****************************************************************************/
32 static int fd_open(struct connection_struct *conn, char *fname,
33 int flags, mode_t mode)
35 int fd;
36 #ifdef O_NOFOLLOW
37 if (!lp_symlinks(SNUM(conn)))
38 flags |= O_NOFOLLOW;
39 #endif
41 fd = conn->vfs_ops.open(conn,fname,flags,mode);
43 /* Fix for files ending in '.' */
44 if((fd == -1) && (errno == ENOENT) &&
45 (strchr_m(fname,'.')==NULL)) {
46 pstrcat(fname,".");
47 fd = conn->vfs_ops.open(conn,fname,flags,mode);
50 DEBUG(10,("fd_open: name %s, flags = 0%o mode = 0%o, fd = %d. %s\n", fname,
51 flags, (int)mode, fd, (fd == -1) ? strerror(errno) : "" ));
53 return fd;
56 /****************************************************************************
57 Close the file associated with a fsp.
58 ****************************************************************************/
60 int fd_close(struct connection_struct *conn, files_struct *fsp)
62 if (fsp->fd == -1)
63 return 0; /* what we used to call a stat open. */
64 return fd_close_posix(conn, fsp);
68 /****************************************************************************
69 Check a filename for the pipe string.
70 ****************************************************************************/
72 static void check_for_pipe(char *fname)
74 /* special case of pipe opens */
75 char s[10];
76 StrnCpy(s,fname,sizeof(s)-1);
77 strlower(s);
78 if (strstr(s,"pipe/")) {
79 DEBUG(3,("Rejecting named pipe open for %s\n",fname));
80 unix_ERR_class = ERRSRV;
81 unix_ERR_code = ERRaccess;
85 /****************************************************************************
86 Open a file.
87 ****************************************************************************/
89 static BOOL open_file(files_struct *fsp,connection_struct *conn,
90 const char *fname1,SMB_STRUCT_STAT *psbuf,int flags,mode_t mode, uint32 desired_access)
92 extern struct current_user current_user;
93 pstring fname;
94 int accmode = (flags & O_ACCMODE);
95 int local_flags = flags;
97 fsp->fd = -1;
98 fsp->oplock_type = NO_OPLOCK;
99 errno = EPERM;
101 pstrcpy(fname,fname1);
103 /* Check permissions */
106 * This code was changed after seeing a client open request
107 * containing the open mode of (DENY_WRITE/read-only) with
108 * the 'create if not exist' bit set. The previous code
109 * would fail to open the file read only on a read-only share
110 * as it was checking the flags parameter directly against O_RDONLY,
111 * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
112 * JRA.
115 if (!CAN_WRITE(conn)) {
116 /* It's a read-only share - fail if we wanted to write. */
117 if(accmode != O_RDONLY) {
118 DEBUG(3,("Permission denied opening %s\n",fname));
119 check_for_pipe(fname);
120 return False;
121 } else if(flags & O_CREAT) {
122 /* We don't want to write - but we must make sure that O_CREAT
123 doesn't create the file if we have write access into the
124 directory.
126 flags &= ~O_CREAT;
131 * This little piece of insanity is inspired by the
132 * fact that an NT client can open a file for O_RDONLY,
133 * but set the create disposition to FILE_EXISTS_TRUNCATE.
134 * If the client *can* write to the file, then it expects to
135 * truncate the file, even though it is opening for readonly.
136 * Quicken uses this stupid trick in backup file creation...
137 * Thanks *greatly* to "David W. Chapman Jr." <dwcjr@inethouston.net>
138 * for helping track this one down. It didn't bite us in 2.0.x
139 * as we always opened files read-write in that release. JRA.
142 if ((accmode == O_RDONLY) && ((flags & O_TRUNC) == O_TRUNC)) {
143 DEBUG(10,("open_file: truncate requested on read-only open for file %s\n",fname ));
144 local_flags = (flags & ~O_ACCMODE)|O_RDWR;
147 if ((desired_access & (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_EXECUTE)) ||
148 (local_flags & O_CREAT) || ((local_flags & O_TRUNC) == O_TRUNC) ) {
151 * We can't actually truncate here as the file may be locked.
152 * open_file_shared will take care of the truncate later. JRA.
155 local_flags &= ~O_TRUNC;
157 #if defined(O_NONBLOCK) && defined(S_ISFIFO)
159 * We would block on opening a FIFO with no one else on the
160 * other end. Do what we used to do and add O_NONBLOCK to the
161 * open flags. JRA.
164 if (VALID_STAT(*psbuf) && S_ISFIFO(psbuf->st_mode))
165 local_flags |= O_NONBLOCK;
166 #endif
168 /* Actually do the open */
169 fsp->fd = fd_open(conn, fname, local_flags, mode);
171 /* Inherit the ACL if the file was created. */
172 if ((local_flags & O_CREAT) && !VALID_STAT(*psbuf))
173 inherit_access_acl(conn, fname, mode);
175 if (fsp->fd == -1) {
176 DEBUG(3,("Error opening file %s (%s) (local_flags=%d) (flags=%d)\n",
177 fname,strerror(errno),local_flags,flags));
178 check_for_pipe(fname);
179 return False;
181 } else
182 fsp->fd = -1; /* What we used to call a stat open. */
184 if (!VALID_STAT(*psbuf)) {
185 int ret;
187 if (fsp->fd == -1)
188 ret = vfs_stat(conn, fname, psbuf);
189 else {
190 ret = vfs_fstat(fsp,fsp->fd,psbuf);
191 /* If we have an fd, this stat should succeed. */
192 if (ret == -1)
193 DEBUG(0,("Error doing fstat on open file %s (%s)\n", fname,strerror(errno) ));
196 /* For a non-io open, this stat failing means file not found. JRA */
197 if (ret == -1) {
198 fd_close(conn, fsp);
199 return False;
204 * POSIX allows read-only opens of directories. We don't
205 * want to do this (we use a different code path for this)
206 * so catch a directory open and return an EISDIR. JRA.
209 if(S_ISDIR(psbuf->st_mode)) {
210 fd_close(conn, fsp);
211 errno = EISDIR;
212 return False;
215 fsp->mode = psbuf->st_mode;
216 fsp->inode = psbuf->st_ino;
217 fsp->dev = psbuf->st_dev;
218 fsp->vuid = current_user.vuid;
219 fsp->size = psbuf->st_size;
220 fsp->pos = -1;
221 fsp->can_lock = True;
222 fsp->can_read = ((flags & O_WRONLY)==0);
223 fsp->can_write = ((flags & (O_WRONLY|O_RDWR))!=0);
224 fsp->share_mode = 0;
225 fsp->desired_access = desired_access;
226 fsp->print_file = False;
227 fsp->modified = False;
228 fsp->oplock_type = NO_OPLOCK;
229 fsp->sent_oplock_break = NO_BREAK_SENT;
230 fsp->is_directory = False;
231 fsp->directory_delete_on_close = False;
232 fsp->conn = conn;
233 string_set(&fsp->fsp_name,fname);
234 fsp->wcp = NULL; /* Write cache pointer. */
236 DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
237 *current_user_info.smb_name ? current_user_info.smb_name : conn->user,fsp->fsp_name,
238 BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
239 conn->num_files_open + 1));
241 return True;
244 /****************************************************************************
245 C. Hoch 11/22/95
246 Helper for open_file_shared.
247 Truncate a file after checking locking; close file if locked.
248 **************************************************************************/
250 static int truncate_unless_locked(struct connection_struct *conn, files_struct *fsp)
252 SMB_BIG_UINT mask = (SMB_BIG_UINT)-1;
254 if (is_locked(fsp,fsp->conn,mask,0,WRITE_LOCK,True)){
255 errno = EACCES;
256 unix_ERR_class = ERRDOS;
257 unix_ERR_code = ERRlock;
258 return -1;
259 } else {
260 return conn->vfs_ops.ftruncate(fsp,fsp->fd,0);
264 /*******************************************************************
265 return True if the filename is one of the special executable types
266 ********************************************************************/
267 static BOOL is_executable(const char *fname)
269 if ((fname = strrchr_m(fname,'.'))) {
270 if (strequal(fname,".com") ||
271 strequal(fname,".dll") ||
272 strequal(fname,".exe") ||
273 strequal(fname,".sym")) {
274 return True;
277 return False;
280 enum {AFAIL,AREAD,AWRITE,AALL};
282 /*******************************************************************
283 reproduce the share mode access table
284 this is horrendoously complex, and really can't be justified on any
285 rational grounds except that this is _exactly_ what NT does. See
286 the DENY1 and DENY2 tests in smbtorture for a comprehensive set of
287 test routines.
288 ********************************************************************/
289 static int access_table(int new_deny,int old_deny,int old_mode,
290 BOOL same_pid, BOOL isexe)
292 if (new_deny == DENY_ALL || old_deny == DENY_ALL) return(AFAIL);
294 if (same_pid) {
295 if (isexe && old_mode == DOS_OPEN_RDONLY &&
296 old_deny == DENY_DOS && new_deny == DENY_READ) {
297 return AFAIL;
299 if (!isexe && old_mode == DOS_OPEN_RDONLY &&
300 old_deny == DENY_DOS && new_deny == DENY_DOS) {
301 return AREAD;
303 if (new_deny == DENY_FCB && old_deny == DENY_DOS) {
304 if (isexe) return AFAIL;
305 if (old_mode == DOS_OPEN_RDONLY) return AFAIL;
306 return AALL;
308 if (old_mode == DOS_OPEN_RDONLY && old_deny == DENY_DOS) {
309 if (new_deny == DENY_FCB || new_deny == DENY_READ) {
310 if (isexe) return AREAD;
311 return AFAIL;
314 if (old_deny == DENY_FCB) {
315 if (new_deny == DENY_DOS || new_deny == DENY_FCB) return AALL;
316 return AFAIL;
320 if (old_deny == DENY_DOS || new_deny == DENY_DOS ||
321 old_deny == DENY_FCB || new_deny == DENY_FCB) {
322 if (isexe) {
323 if (old_deny == DENY_FCB || new_deny == DENY_FCB) {
324 return AFAIL;
326 if (old_deny == DENY_DOS) {
327 if (new_deny == DENY_READ &&
328 (old_mode == DOS_OPEN_RDONLY ||
329 old_mode == DOS_OPEN_RDWR)) {
330 return AFAIL;
332 if (new_deny == DENY_WRITE &&
333 (old_mode == DOS_OPEN_WRONLY ||
334 old_mode == DOS_OPEN_RDWR)) {
335 return AFAIL;
337 return AALL;
339 if (old_deny == DENY_NONE) return AALL;
340 if (old_deny == DENY_READ) return AWRITE;
341 if (old_deny == DENY_WRITE) return AREAD;
343 /* it isn't a exe, dll, sym or com file */
344 if (old_deny == new_deny && same_pid)
345 return(AALL);
347 if (old_deny == DENY_READ || new_deny == DENY_READ) return AFAIL;
348 if (old_mode == DOS_OPEN_RDONLY) return(AREAD);
350 return(AFAIL);
353 switch (new_deny)
355 case DENY_WRITE:
356 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_RDONLY) return(AREAD);
357 if (old_deny==DENY_READ && old_mode==DOS_OPEN_RDONLY) return(AWRITE);
358 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_RDONLY) return(AALL);
359 return(AFAIL);
360 case DENY_READ:
361 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_WRONLY) return(AREAD);
362 if (old_deny==DENY_READ && old_mode==DOS_OPEN_WRONLY) return(AWRITE);
363 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_WRONLY) return(AALL);
364 return(AFAIL);
365 case DENY_NONE:
366 if (old_deny==DENY_WRITE) return(AREAD);
367 if (old_deny==DENY_READ) return(AWRITE);
368 if (old_deny==DENY_NONE) return(AALL);
369 return(AFAIL);
371 return(AFAIL);
375 /****************************************************************************
376 check if we can open a file with a share mode
377 ****************************************************************************/
379 static BOOL check_share_mode(connection_struct *conn, share_mode_entry *share, int share_mode, uint32 desired_access,
380 const char *fname, BOOL fcbopen, int *flags)
382 int deny_mode = GET_DENY_MODE(share_mode);
383 int old_open_mode = GET_OPEN_MODE(share->share_mode);
384 int old_deny_mode = GET_DENY_MODE(share->share_mode);
387 * share modes = false means don't bother to check for
388 * DENY mode conflict. This is a *really* bad idea :-). JRA.
391 if(!lp_share_modes(SNUM(conn)))
392 return True;
395 * Don't allow any opens once the delete on close flag has been
396 * set.
399 if (GET_DELETE_ON_CLOSE_FLAG(share->share_mode)) {
400 DEBUG(5,("check_share_mode: Failing open on file %s as delete on close flag is set.\n",
401 fname ));
402 unix_ERR_class = ERRDOS;
403 unix_ERR_code = ERRnoaccess;
404 unix_ERR_ntstatus = NT_STATUS_DELETE_PENDING;
405 return False;
408 /* this is a nasty hack, but necessary until we rewrite our open
409 handling to use a NTCreateX call as the basic call.
410 NT may open a file with neither read nor write access, and in
411 this case it expects the open not to conflict with any
412 existing deny modes. This happens (for example) during a
413 "xcopy /o" where the second file descriptor is used for
414 ACL sets
415 (tridge)
419 * This is a bit wierd - the test for desired access not having the
420 * critical bits seems seems odd. Firstly, if both opens have no
421 * critical bits then always ignore. Then check the "allow delete"
422 * then check for either. This probably isn't quite right yet but
423 * gets us much closer. JRA.
427 * If desired_access doesn't contain READ_DATA,WRITE_DATA,APPEND_DATA or EXECUTE
428 * and the existing desired_acces then share modes don't conflict.
431 if ( !(desired_access & (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_EXECUTE)) &&
432 !(share->desired_access & (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_EXECUTE)) ) {
435 * Wrinkle discovered by smbtorture....
436 * If both are non-io open and requester is asking for delete and current open has delete access
437 * but neither open has allowed file share delete then deny.... this is very strange and
438 * seems to be the only case in which non-io opens conflict. JRA.
441 if ((desired_access & DELETE_ACCESS) && (share->desired_access & DELETE_ACCESS) &&
442 (!GET_ALLOW_SHARE_DELETE(share->share_mode) || !GET_ALLOW_SHARE_DELETE(share_mode))) {
443 DEBUG(5,("check_share_mode: Failing open on file %s as delete access requests conflict.\n",
444 fname ));
445 unix_ERR_class = ERRDOS;
446 unix_ERR_code = ERRbadshare;
448 return False;
451 DEBUG(5,("check_share_mode: Allowing open on file %s as both desired access (0x%x) \
452 and existing desired access (0x%x) are non-data opens\n",
453 fname, (unsigned int)desired_access, (unsigned int)share->desired_access ));
454 return True;
458 * If delete access was requested and the existing share mode doesn't have
459 * ALLOW_SHARE_DELETE then deny.
462 if ((desired_access & DELETE_ACCESS) && !GET_ALLOW_SHARE_DELETE(share->share_mode)) {
463 DEBUG(5,("check_share_mode: Failing open on file %s as delete access requested and allow share delete not set.\n",
464 fname ));
465 unix_ERR_class = ERRDOS;
466 unix_ERR_code = ERRbadshare;
468 return False;
472 * The inverse of the above.
473 * If delete access was granted and the new share mode doesn't have
474 * ALLOW_SHARE_DELETE then deny.
477 if ((share->desired_access & DELETE_ACCESS) && !GET_ALLOW_SHARE_DELETE(share_mode)) {
478 DEBUG(5,("check_share_mode: Failing open on file %s as delete access granted and allow share delete not requested.\n",
479 fname ));
480 unix_ERR_class = ERRDOS;
481 unix_ERR_code = ERRbadshare;
483 return False;
487 * If desired_access doesn't contain READ_DATA,WRITE_DATA,APPEND_DATA or EXECUTE
488 * then share modes don't conflict. Likewise with existing desired access.
491 if ( !(desired_access & (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_EXECUTE)) ||
492 !(share->desired_access & (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_EXECUTE)) ) {
493 DEBUG(5,("check_share_mode: Allowing open on file %s as desired access (0x%x) doesn't conflict with\
494 existing desired access (0x%x).\n", fname, (unsigned int)desired_access, (unsigned int)share->desired_access ));
495 return True;
499 int access_allowed = access_table(deny_mode,old_deny_mode,old_open_mode,
500 (share->pid == sys_getpid()),is_executable(fname));
502 if ((access_allowed == AFAIL) ||
503 (!fcbopen && (access_allowed == AREAD && *flags == O_RDWR)) ||
504 (access_allowed == AREAD && *flags != O_RDONLY) ||
505 (access_allowed == AWRITE && *flags != O_WRONLY)) {
507 DEBUG(2,("Share violation on file (%d,%d,%d,%d,%s,fcbopen = %d, flags = %d) = %d\n",
508 deny_mode,old_deny_mode,old_open_mode,
509 (int)share->pid,fname, fcbopen, *flags, access_allowed));
511 unix_ERR_class = ERRDOS;
512 unix_ERR_code = ERRbadshare;
514 return False;
517 if (access_allowed == AREAD)
518 *flags = O_RDONLY;
520 if (access_allowed == AWRITE)
521 *flags = O_WRONLY;
525 return True;
528 /****************************************************************************
529 Deal with open deny mode and oplock break processing.
530 Invarient: Share mode must be locked on entry and exit.
531 Returns -1 on error, or number of share modes on success (may be zero).
532 ****************************************************************************/
534 static int open_mode_check(connection_struct *conn, const char *fname, SMB_DEV_T dev,
535 SMB_INO_T inode,
536 uint32 desired_access,
537 int share_mode, int *p_flags, int *p_oplock_request,
538 BOOL *p_all_current_opens_are_level_II)
540 int i;
541 int num_share_modes;
542 int oplock_contention_count = 0;
543 share_mode_entry *old_shares = 0;
544 BOOL fcbopen = False;
545 BOOL broke_oplock;
547 if(GET_OPEN_MODE(share_mode) == DOS_OPEN_FCB)
548 fcbopen = True;
550 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
552 if(num_share_modes == 0)
553 return 0;
556 * Check if the share modes will give us access.
559 do {
560 share_mode_entry broken_entry;
562 broke_oplock = False;
563 *p_all_current_opens_are_level_II = True;
565 for(i = 0; i < num_share_modes; i++) {
566 share_mode_entry *share_entry = &old_shares[i];
569 * By observation of NetBench, oplocks are broken *before* share
570 * modes are checked. This allows a file to be closed by the client
571 * if the share mode would deny access and the client has an oplock.
572 * Check if someone has an oplock on this file. If so we must break
573 * it before continuing.
576 if((*p_oplock_request && EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type)) ||
577 (!*p_oplock_request && (share_entry->op_type != NO_OPLOCK))) {
579 BOOL opb_ret;
581 DEBUG(5,("open_mode_check: oplock_request = %d, breaking oplock (%x) on file %s, \
582 dev = %x, inode = %.0f\n", *p_oplock_request, share_entry->op_type, fname, (unsigned int)dev, (double)inode));
584 /* Oplock break - unlock to request it. */
585 unlock_share_entry(conn, dev, inode);
587 opb_ret = request_oplock_break(share_entry);
589 /* Now relock. */
590 lock_share_entry(conn, dev, inode);
592 if(opb_ret == False) {
593 DEBUG(0,("open_mode_check: FAILED when breaking oplock (%x) on file %s, \
594 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
595 SAFE_FREE(old_shares);
596 errno = EACCES;
597 unix_ERR_class = ERRDOS;
598 unix_ERR_code = ERRbadshare;
599 return -1;
602 broke_oplock = True;
603 broken_entry = *share_entry;
604 break;
606 } else if (!LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
607 *p_all_current_opens_are_level_II = False;
610 /* someone else has a share lock on it, check to see if we can too */
611 if (!check_share_mode(conn, share_entry, share_mode, desired_access,
612 fname, fcbopen, p_flags)) {
613 SAFE_FREE(old_shares);
614 errno = EACCES;
615 return -1;
618 } /* end for */
620 if(broke_oplock) {
621 SAFE_FREE(old_shares);
622 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
623 oplock_contention_count++;
625 /* Paranoia check that this is no longer an exlusive entry. */
626 for(i = 0; i < num_share_modes; i++) {
627 share_mode_entry *share_entry = &old_shares[i];
629 if (share_modes_identical(&broken_entry, share_entry) &&
630 EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type) ) {
633 * This should not happen. The target left this oplock
634 * as exlusive.... The process *must* be dead....
637 DEBUG(0,("open_mode_check: exlusive oplock left by process %d after break ! For file %s, \
638 dev = %x, inode = %.0f. Deleting it to continue...\n", (int)broken_entry.pid, fname, (unsigned int)dev, (double)inode));
640 if (process_exists(broken_entry.pid)) {
641 DEBUG(0,("open_mode_check: Existent process %d left active oplock.\n",
642 broken_entry.pid ));
645 if (del_share_entry(dev, inode, &broken_entry, NULL) == -1) {
646 errno = EACCES;
647 unix_ERR_class = ERRDOS;
648 unix_ERR_code = ERRbadshare;
649 return -1;
653 * We must reload the share modes after deleting the
654 * other process's entry.
657 SAFE_FREE(old_shares);
658 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
659 break;
661 } /* end for paranoia... */
662 } /* end if broke_oplock */
664 } while(broke_oplock);
666 if(old_shares != 0)
667 SAFE_FREE(old_shares);
670 * Refuse to grant an oplock in case the contention limit is
671 * reached when going through the lock list multiple times.
674 if(oplock_contention_count >= lp_oplock_contention_limit(SNUM(conn))) {
675 *p_oplock_request = 0;
676 DEBUG(4,("open_mode_check: oplock contention = %d. Not granting oplock.\n",
677 oplock_contention_count ));
680 return num_share_modes;
683 /****************************************************************************
684 set a kernel flock on a file for NFS interoperability
685 this requires a patch to Linux
686 ****************************************************************************/
687 static void kernel_flock(files_struct *fsp, int deny_mode)
689 #if HAVE_KERNEL_SHARE_MODES
690 int kernel_mode = 0;
691 if (deny_mode == DENY_READ) kernel_mode = LOCK_MAND|LOCK_WRITE;
692 else if (deny_mode == DENY_WRITE) kernel_mode = LOCK_MAND|LOCK_READ;
693 else if (deny_mode == DENY_ALL) kernel_mode = LOCK_MAND;
694 if (kernel_mode) flock(fsp->fd, kernel_mode);
695 #endif
700 static BOOL open_match_attributes(connection_struct *conn, char *path, mode_t existing_mode, mode_t new_mode)
702 uint32 old_dos_mode, new_dos_mode;
703 SMB_STRUCT_STAT sbuf;
705 ZERO_STRUCT(sbuf);
707 sbuf.st_mode = existing_mode;
708 old_dos_mode = dos_mode(conn, path, &sbuf);
710 sbuf.st_mode = new_mode;
711 new_dos_mode = dos_mode(conn, path, &sbuf);
713 /* If we're mapping SYSTEM and HIDDEN ensure they match. */
714 if (lp_map_system(SNUM(conn))) {
715 if ((old_dos_mode & FILE_ATTRIBUTE_SYSTEM) && !(new_dos_mode & FILE_ATTRIBUTE_SYSTEM))
716 return False;
718 if (lp_map_hidden(SNUM(conn))) {
719 if ((old_dos_mode & FILE_ATTRIBUTE_HIDDEN) && !(new_dos_mode & FILE_ATTRIBUTE_HIDDEN))
720 return False;
722 return True;
725 /****************************************************************************
726 Open a file with a share mode. On output from this open we are guarenteeing
727 that
728 ****************************************************************************/
729 files_struct *open_file_shared(connection_struct *conn,char *fname, SMB_STRUCT_STAT *psbuf,
730 int share_mode,int ofun, mode_t mode,int oplock_request,
731 int *Access,int *action)
733 return open_file_shared1(conn, fname, psbuf, 0, share_mode, ofun, mode,
734 oplock_request, Access, action);
737 /****************************************************************************
738 Open a file with a share mode. On output from this open we are guarenteeing
739 that
740 ****************************************************************************/
741 files_struct *open_file_shared1(connection_struct *conn,char *fname, SMB_STRUCT_STAT *psbuf,
742 uint32 desired_access,
743 int share_mode,int ofun, mode_t mode,int oplock_request,
744 int *Access,int *action)
746 int flags=0;
747 int flags2=0;
748 int deny_mode = GET_DENY_MODE(share_mode);
749 BOOL allow_share_delete = GET_ALLOW_SHARE_DELETE(share_mode);
750 BOOL delete_on_close = GET_DELETE_ON_CLOSE_FLAG(share_mode);
751 BOOL file_existed = VALID_STAT(*psbuf);
752 BOOL fcbopen = False;
753 BOOL def_acl = False;
754 SMB_DEV_T dev = 0;
755 SMB_INO_T inode = 0;
756 int num_share_modes = 0;
757 BOOL all_current_opens_are_level_II = False;
758 BOOL fsp_open = False;
759 files_struct *fsp = NULL;
760 int open_mode=0;
761 uint16 port = 0;
763 if (conn->printer) {
764 /* printers are handled completely differently. Most of the passed parameters are
765 ignored */
766 if (Access)
767 *Access = DOS_OPEN_WRONLY;
768 if (action)
769 *action = FILE_WAS_CREATED;
770 return print_fsp_open(conn, fname);
773 fsp = file_new(conn);
774 if(!fsp)
775 return NULL;
777 DEBUG(10,("open_file_shared: fname = %s, share_mode = %x, ofun = %x, mode = %o, oplock request = %d\n",
778 fname, share_mode, ofun, (int)mode, oplock_request ));
780 if (!check_name(fname,conn)) {
781 file_free(fsp);
782 return NULL;
785 /* ignore any oplock requests if oplocks are disabled */
786 if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break) {
787 oplock_request = 0;
790 /* this is for OS/2 EAs - try and say we don't support them */
791 if (strstr(fname,".+,;=[].")) {
792 unix_ERR_class = ERRDOS;
793 /* OS/2 Workplace shell fix may be main code stream in a later release. */
794 #if 1 /* OS2_WPS_FIX - Recent versions of OS/2 need this. */
795 unix_ERR_code = ERRcannotopen;
796 #else /* OS2_WPS_FIX */
797 unix_ERR_code = ERROR_EAS_NOT_SUPPORTED;
798 #endif /* OS2_WPS_FIX */
800 DEBUG(5,("open_file_shared: OS/2 EA's are not supported.\n"));
801 file_free(fsp);
802 return NULL;
805 if ((GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL) && file_existed) {
806 DEBUG(5,("open_file_shared: create new requested for file %s and file already exists.\n",
807 fname ));
808 file_free(fsp);
809 errno = EEXIST;
810 return NULL;
813 if (CAN_WRITE(conn) && (GET_FILE_CREATE_DISPOSITION(ofun) == FILE_CREATE_IF_NOT_EXIST))
814 flags2 |= O_CREAT;
816 if (CAN_WRITE(conn) && (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE))
817 flags2 |= O_TRUNC;
819 /* We only care about matching attributes on file exists and truncate. */
820 if (file_existed && (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE)) {
821 if (!open_match_attributes(conn, fname, psbuf->st_mode, mode)) {
822 DEBUG(5,("open_file_shared: attributes missmatch for file %s (0%o, 0%o)\n",
823 fname, psbuf->st_mode, mode ));
824 file_free(fsp);
825 errno = EACCES;
826 return NULL;
830 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL)
831 flags2 |= O_EXCL;
833 /* note that we ignore the append flag as
834 append does not mean the same thing under dos and unix */
836 switch (GET_OPEN_MODE(share_mode)) {
837 case DOS_OPEN_WRONLY:
838 flags = O_WRONLY;
839 if (desired_access == 0)
840 desired_access = FILE_WRITE_DATA;
841 break;
842 case DOS_OPEN_FCB:
843 fcbopen = True;
844 flags = O_RDWR;
845 if (desired_access == 0)
846 desired_access = FILE_READ_DATA|FILE_WRITE_DATA;
847 break;
848 case DOS_OPEN_RDWR:
849 flags = O_RDWR;
850 if (desired_access == 0)
851 desired_access = FILE_READ_DATA|FILE_WRITE_DATA;
852 break;
853 default:
854 flags = O_RDONLY;
855 if (desired_access == 0)
856 desired_access = FILE_READ_DATA;
857 break;
860 #if defined(O_SYNC)
861 if (GET_FILE_SYNC_OPENMODE(share_mode)) {
862 flags2 |= O_SYNC;
864 #endif /* O_SYNC */
866 if (flags != O_RDONLY && file_existed &&
867 (!CAN_WRITE(conn) || IS_DOS_READONLY(dos_mode(conn,fname,psbuf)))) {
868 if (!fcbopen) {
869 DEBUG(5,("open_file_shared: read/write access requested for file %s on read only %s\n",
870 fname, !CAN_WRITE(conn) ? "share" : "file" ));
871 file_free(fsp);
872 errno = EACCES;
873 return NULL;
875 flags = O_RDONLY;
878 if (deny_mode > DENY_NONE && deny_mode!=DENY_FCB) {
879 DEBUG(2,("Invalid deny mode %d on file %s\n",deny_mode,fname));
880 file_free(fsp);
881 errno = EINVAL;
882 return NULL;
885 if (file_existed) {
887 dev = psbuf->st_dev;
888 inode = psbuf->st_ino;
890 lock_share_entry(conn, dev, inode);
892 num_share_modes = open_mode_check(conn, fname, dev, inode,
893 desired_access,
894 share_mode,
895 &flags, &oplock_request, &all_current_opens_are_level_II);
896 if(num_share_modes == -1) {
899 * This next line is a subtlety we need for MS-Access. If a file open will
900 * fail due to share permissions and also for security (access)
901 * reasons, we need to return the access failed error, not the
902 * share error. This means we must attempt to open the file anyway
903 * in order to get the UNIX access error - even if we're going to
904 * fail the open for share reasons. This is bad, as we're burning
905 * another fd if there are existing locks but there's nothing else
906 * we can do. We also ensure we're not going to create or tuncate
907 * the file as we only want an access decision at this stage. JRA.
909 fsp_open = open_file(fsp,conn,fname,psbuf,
910 flags|(flags2&~(O_TRUNC|O_CREAT)),mode,desired_access);
912 DEBUG(4,("open_file_shared : share_mode deny - calling open_file with \
913 flags=0x%X flags2=0x%X mode=0%o returned %d\n",
914 flags,(flags2&~(O_TRUNC|O_CREAT)),(int)mode,(int)fsp_open ));
916 unlock_share_entry(conn, dev, inode);
917 if (fsp_open)
918 fd_close(conn, fsp);
919 file_free(fsp);
920 return NULL;
924 * We exit this block with the share entry *locked*.....
929 * Ensure we pay attention to default ACLs on directories if required.
932 if ((flags2 & O_CREAT) && lp_inherit_acls(SNUM(conn)) &&
933 (def_acl = directory_has_default_acl(conn, parent_dirname(fname))))
934 mode = 0777;
936 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
937 flags,flags2,(int)mode));
940 * open_file strips any O_TRUNC flags itself.
943 fsp_open = open_file(fsp,conn,fname,psbuf,flags|flags2,mode,desired_access);
945 if (!fsp_open && (flags == O_RDWR) && (errno != ENOENT) && fcbopen) {
946 if((fsp_open = open_file(fsp,conn,fname,psbuf,O_RDONLY,mode,desired_access)) == True)
947 flags = O_RDONLY;
950 if (!fsp_open) {
951 if(file_existed)
952 unlock_share_entry(conn, dev, inode);
953 file_free(fsp);
954 return NULL;
958 * Deal with the race condition where two smbd's detect the file doesn't
959 * exist and do the create at the same time. One of them will win and
960 * set a share mode, the other (ie. this one) should check if the
961 * requested share mode for this create is allowed.
964 if (!file_existed) {
966 lock_share_entry_fsp(fsp);
968 num_share_modes = open_mode_check(conn, fname, dev, inode,
969 desired_access,
970 share_mode,
971 &flags, &oplock_request, &all_current_opens_are_level_II);
973 if(num_share_modes == -1) {
974 unlock_share_entry_fsp(fsp);
975 fd_close(conn,fsp);
976 file_free(fsp);
977 return NULL;
981 * If there are any share modes set then the file *did*
982 * exist. Ensure we return the correct value for action.
985 if (num_share_modes > 0)
986 file_existed = True;
989 * We exit this block with the share entry *locked*.....
993 /* note that we ignore failure for the following. It is
994 basically a hack for NFS, and NFS will never set one of
995 these only read them. Nobody but Samba can ever set a deny
996 mode and we have already checked our more authoritative
997 locking database for permission to set this deny mode. If
998 the kernel refuses the operations then the kernel is wrong */
999 kernel_flock(fsp, deny_mode);
1002 * At this point onwards, we can guarentee that the share entry
1003 * is locked, whether we created the file or not, and that the
1004 * deny mode is compatible with all current opens.
1008 * If requested, truncate the file.
1011 if (flags2&O_TRUNC) {
1013 * We are modifing the file after open - update the stat struct..
1015 if ((truncate_unless_locked(conn,fsp) == -1) || (vfs_fstat(fsp,fsp->fd,psbuf)==-1)) {
1016 unlock_share_entry_fsp(fsp);
1017 fd_close(conn,fsp);
1018 file_free(fsp);
1019 return NULL;
1023 switch (flags) {
1024 case O_RDONLY:
1025 open_mode = DOS_OPEN_RDONLY;
1026 break;
1027 case O_RDWR:
1028 open_mode = DOS_OPEN_RDWR;
1029 break;
1030 case O_WRONLY:
1031 open_mode = DOS_OPEN_WRONLY;
1032 break;
1035 fsp->share_mode = SET_DENY_MODE(deny_mode) |
1036 SET_OPEN_MODE(open_mode) |
1037 SET_ALLOW_SHARE_DELETE(allow_share_delete);
1039 DEBUG(10,("open_file_shared : share_mode = %x\n", fsp->share_mode ));
1041 if (Access)
1042 (*Access) = open_mode;
1044 if (action) {
1045 if (file_existed && !(flags2 & O_TRUNC))
1046 *action = FILE_WAS_OPENED;
1047 if (!file_existed)
1048 *action = FILE_WAS_CREATED;
1049 if (file_existed && (flags2 & O_TRUNC))
1050 *action = FILE_WAS_OVERWRITTEN;
1054 * Setup the oplock info in both the shared memory and
1055 * file structs.
1058 if(oplock_request && (num_share_modes == 0) &&
1059 !IS_VETO_OPLOCK_PATH(conn,fname) && set_file_oplock(fsp, oplock_request) ) {
1060 port = global_oplock_port;
1061 } else if (oplock_request && all_current_opens_are_level_II) {
1062 port = global_oplock_port;
1063 oplock_request = LEVEL_II_OPLOCK;
1064 set_file_oplock(fsp, oplock_request);
1065 } else {
1066 port = 0;
1067 oplock_request = 0;
1070 set_share_mode(fsp, port, oplock_request);
1072 if (delete_on_close) {
1073 NTSTATUS result = set_delete_on_close_internal(fsp, delete_on_close);
1075 if (NT_STATUS_V(result) != NT_STATUS_V(NT_STATUS_OK)) {
1076 /* Remember to delete the mode we just added. */
1077 del_share_mode(fsp, NULL);
1078 unlock_share_entry_fsp(fsp);
1079 fd_close(conn,fsp);
1080 file_free(fsp);
1081 return NULL;
1086 * Take care of inherited ACLs on created files - if default ACL not
1087 * selected.
1090 if (!file_existed && !def_acl && (conn->vfs_ops.fchmod_acl != NULL)) {
1091 int saved_errno = errno; /* We might get ENOSYS in the next call.. */
1092 if (conn->vfs_ops.fchmod_acl(fsp, fsp->fd, mode) == -1 && errno == ENOSYS)
1093 errno = saved_errno; /* Ignore ENOSYS */
1096 unlock_share_entry_fsp(fsp);
1098 conn->num_files_open++;
1100 return fsp;
1103 /****************************************************************************
1104 Open a file for for write to ensure that we can fchmod it.
1105 ****************************************************************************/
1107 files_struct *open_file_fchmod(connection_struct *conn, const char *fname, SMB_STRUCT_STAT *psbuf)
1109 files_struct *fsp = NULL;
1110 BOOL fsp_open;
1112 if (!VALID_STAT(*psbuf))
1113 return NULL;
1115 fsp = file_new(conn);
1116 if(!fsp)
1117 return NULL;
1119 /* note! we must use a non-zero desired access or we don't get
1120 a real file descriptor. Oh what a twisted web we weave. */
1121 fsp_open = open_file(fsp,conn,fname,psbuf,O_WRONLY,0,FILE_WRITE_DATA);
1124 * This is not a user visible file open.
1125 * Don't set a share mode and don't increment
1126 * the conn->num_files_open.
1129 if (!fsp_open) {
1130 file_free(fsp);
1131 return NULL;
1134 return fsp;
1137 /****************************************************************************
1138 Close the fchmod file fd - ensure no locks are lost.
1139 ****************************************************************************/
1141 int close_file_fchmod(files_struct *fsp)
1143 int ret = fd_close(fsp->conn, fsp);
1144 file_free(fsp);
1145 return ret;
1148 /****************************************************************************
1149 Open a directory from an NT SMB call.
1150 ****************************************************************************/
1152 files_struct *open_directory(connection_struct *conn, char *fname, SMB_STRUCT_STAT *psbuf,
1153 uint32 desired_access, int share_mode, int smb_ofun, mode_t unixmode, int *action)
1155 extern struct current_user current_user;
1156 BOOL got_stat = False;
1157 files_struct *fsp = file_new(conn);
1158 BOOL delete_on_close = GET_DELETE_ON_CLOSE_FLAG(share_mode);
1160 if(!fsp)
1161 return NULL;
1163 fsp->conn = conn; /* The vfs_fXXX() macros need this. */
1165 if (VALID_STAT(*psbuf))
1166 got_stat = True;
1168 if (got_stat && (GET_FILE_OPEN_DISPOSITION(smb_ofun) == FILE_EXISTS_FAIL)) {
1169 file_free(fsp);
1170 errno = EEXIST; /* Setup so correct error is returned to client. */
1171 return NULL;
1174 if (GET_FILE_CREATE_DISPOSITION(smb_ofun) == FILE_CREATE_IF_NOT_EXIST) {
1176 if (got_stat) {
1178 if(!S_ISDIR(psbuf->st_mode)) {
1179 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
1180 file_free(fsp);
1181 errno = EACCES;
1182 return NULL;
1184 *action = FILE_WAS_OPENED;
1186 } else {
1189 * Try and create the directory.
1192 if(!CAN_WRITE(conn)) {
1193 DEBUG(2,("open_directory: failing create on read-only share\n"));
1194 file_free(fsp);
1195 errno = EACCES;
1196 return NULL;
1199 if(vfs_mkdir(conn,fname, unix_mode(conn,aDIR, fname)) < 0) {
1200 DEBUG(2,("open_directory: unable to create %s. Error was %s\n",
1201 fname, strerror(errno) ));
1202 file_free(fsp);
1203 return NULL;
1206 if(vfs_stat(conn,fname, psbuf) != 0) {
1207 file_free(fsp);
1208 return NULL;
1211 *action = FILE_WAS_CREATED;
1214 } else {
1217 * Don't create - just check that it *was* a directory.
1220 if(!got_stat) {
1221 DEBUG(3,("open_directory: unable to stat name = %s. Error was %s\n",
1222 fname, strerror(errno) ));
1223 file_free(fsp);
1224 return NULL;
1227 if(!S_ISDIR(psbuf->st_mode)) {
1228 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
1229 file_free(fsp);
1230 return NULL;
1233 *action = FILE_WAS_OPENED;
1236 DEBUG(5,("open_directory: opening directory %s\n", fname));
1239 * Setup the files_struct for it.
1242 fsp->mode = psbuf->st_mode;
1243 fsp->inode = psbuf->st_ino;
1244 fsp->dev = psbuf->st_dev;
1245 fsp->size = psbuf->st_size;
1246 fsp->vuid = current_user.vuid;
1247 fsp->pos = -1;
1248 fsp->can_lock = True;
1249 fsp->can_read = False;
1250 fsp->can_write = False;
1251 fsp->share_mode = share_mode;
1252 fsp->desired_access = desired_access;
1253 fsp->print_file = False;
1254 fsp->modified = False;
1255 fsp->oplock_type = NO_OPLOCK;
1256 fsp->sent_oplock_break = NO_BREAK_SENT;
1257 fsp->is_directory = True;
1258 fsp->directory_delete_on_close = False;
1259 fsp->conn = conn;
1260 string_set(&fsp->fsp_name,fname);
1262 if (delete_on_close) {
1263 NTSTATUS result = set_delete_on_close_internal(fsp, delete_on_close);
1265 if (NT_STATUS_V(result) != NT_STATUS_V(NT_STATUS_OK)) {
1266 file_free(fsp);
1267 return NULL;
1270 conn->num_files_open++;
1272 return fsp;
1274 #if 0
1276 Old code - I have replaced with correct desired_access checking. JRA.
1278 /*******************************************************************
1279 Check if the share mode on a file allows it to be deleted or unlinked.
1280 Return True if sharing doesn't prevent the operation.
1281 ********************************************************************/
1283 BOOL check_file_sharing(connection_struct *conn,char *fname, BOOL rename_op)
1285 int i;
1286 int ret = False;
1287 share_mode_entry *old_shares = 0;
1288 int num_share_modes;
1289 SMB_STRUCT_STAT sbuf;
1290 pid_t pid = sys_getpid();
1291 SMB_DEV_T dev;
1292 SMB_INO_T inode;
1294 if (vfs_stat(conn,fname,&sbuf) == -1)
1295 return(True);
1297 dev = sbuf.st_dev;
1298 inode = sbuf.st_ino;
1300 lock_share_entry(conn, dev, inode);
1301 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1304 * Check if the share modes will give us access.
1307 if(num_share_modes != 0) {
1308 BOOL broke_oplock;
1310 do {
1312 broke_oplock = False;
1313 for(i = 0; i < num_share_modes; i++) {
1314 share_mode_entry *share_entry = &old_shares[i];
1317 * Break oplocks before checking share modes. See comment in
1318 * open_file_shared for details.
1319 * Check if someone has an oplock on this file. If so we must
1320 * break it before continuing.
1322 if(BATCH_OPLOCK_TYPE(share_entry->op_type)) {
1324 DEBUG(5,("check_file_sharing: breaking oplock (%x) on file %s, \
1325 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
1327 /* Oplock break.... */
1328 unlock_share_entry(conn, dev, inode);
1330 if(request_oplock_break(share_entry) == False) {
1331 DEBUG(0,("check_file_sharing: FAILED when breaking oplock (%x) on file %s, \
1332 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
1334 SAFE_FREE(old_shares);
1335 return False;
1337 lock_share_entry(conn, dev, inode);
1338 broke_oplock = True;
1339 break;
1343 * If this is a delete request and ALLOW_SHARE_DELETE is set then allow
1344 * this to proceed. This takes precedence over share modes.
1347 if(!rename_op && GET_ALLOW_SHARE_DELETE(share_entry->share_mode))
1348 continue;
1351 * Someone else has a share lock on it, check to see
1352 * if we can too.
1354 if ((GET_DENY_MODE(share_entry->share_mode) != DENY_DOS) ||
1355 (share_entry->pid != pid))
1356 goto free_and_exit;
1358 } /* end for */
1360 if(broke_oplock) {
1361 SAFE_FREE(old_shares);
1362 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1364 } while(broke_oplock);
1368 * XXXX exactly what share mode combinations should be allowed for
1369 * deleting/renaming?
1373 * If we got here then either there were no share modes or
1374 * all share modes were DENY_DOS and the pid == getpid() or
1375 * delete access was requested and all share modes had the
1376 * ALLOW_SHARE_DELETE bit set (takes precedence over other
1377 * share modes).
1380 ret = True;
1382 free_and_exit:
1384 unlock_share_entry(conn, dev, inode);
1385 SAFE_FREE(old_shares);
1386 return(ret);
1388 #endif