s3: Put an indirection layer into share_mode_lock
[metze/samba/wip.git] / source3 / smbd / open.c
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-2004
6    Copyright (C) Volker Lendecke 2005
7
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.
12
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.
17
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/>.
20 */
21
22 #include "includes.h"
23 #include "system/filesys.h"
24 #include "printing.h"
25 #include "smbd/smbd.h"
26 #include "smbd/globals.h"
27 #include "fake_file.h"
28 #include "../libcli/security/security.h"
29 #include "../librpc/gen_ndr/ndr_security.h"
30 #include "../librpc/gen_ndr/open_files.h"
31 #include "auth.h"
32 #include "messages.h"
33
34 extern const struct generic_mapping file_generic_mapping;
35
36 struct deferred_open_record {
37         bool delayed_for_oplocks;
38         struct file_id id;
39 };
40
41 /****************************************************************************
42  If the requester wanted DELETE_ACCESS and was rejected because
43  the file ACL didn't include DELETE_ACCESS, see if the parent ACL
44  ovverrides this.
45 ****************************************************************************/
46
47 static bool parent_override_delete(connection_struct *conn,
48                                         const struct smb_filename *smb_fname,
49                                         uint32_t access_mask,
50                                         uint32_t rejected_mask)
51 {
52         if ((access_mask & DELETE_ACCESS) &&
53                     (rejected_mask & DELETE_ACCESS) &&
54                     can_delete_file_in_directory(conn, smb_fname)) {
55                 return true;
56         }
57         return false;
58 }
59
60 /****************************************************************************
61  Check if we have open rights.
62 ****************************************************************************/
63
64 NTSTATUS smbd_check_access_rights(struct connection_struct *conn,
65                                 const struct smb_filename *smb_fname,
66                                 uint32_t access_mask)
67 {
68         /* Check if we have rights to open. */
69         NTSTATUS status;
70         struct security_descriptor *sd = NULL;
71         uint32_t rejected_share_access;
72         uint32_t rejected_mask = access_mask;
73
74         rejected_share_access = access_mask & ~(conn->share_access);
75
76         if (rejected_share_access) {
77                 DEBUG(10, ("smbd_check_access_rights: rejected share access 0x%x "
78                         "on %s (0x%x)\n",
79                         (unsigned int)access_mask,
80                         smb_fname_str_dbg(smb_fname),
81                         (unsigned int)rejected_share_access ));
82                 return NT_STATUS_ACCESS_DENIED;
83         }
84
85         if (get_current_uid(conn) == (uid_t)0) {
86                 /* I'm sorry sir, I didn't know you were root... */
87                 DEBUG(10,("smbd_check_access_rights: root override "
88                         "on %s. Granting 0x%x\n",
89                         smb_fname_str_dbg(smb_fname),
90                         (unsigned int)access_mask ));
91                 return NT_STATUS_OK;
92         }
93
94         if ((access_mask & DELETE_ACCESS) && !lp_acl_check_permissions(SNUM(conn))) {
95                 DEBUG(10,("smbd_check_access_rights: not checking ACL "
96                         "on DELETE_ACCESS on file %s. Granting 0x%x\n",
97                         smb_fname_str_dbg(smb_fname),
98                         (unsigned int)access_mask ));
99                 return NT_STATUS_OK;
100         }
101
102         if (access_mask == DELETE_ACCESS &&
103                         VALID_STAT(smb_fname->st) &&
104                         S_ISLNK(smb_fname->st.st_ex_mode)) {
105                 /* We can always delete a symlink. */
106                 DEBUG(10,("smbd_check_access_rights: not checking ACL "
107                         "on DELETE_ACCESS on symlink %s.\n",
108                         smb_fname_str_dbg(smb_fname) ));
109                 return NT_STATUS_OK;
110         }
111
112         status = SMB_VFS_GET_NT_ACL(conn, smb_fname->base_name,
113                         (SECINFO_OWNER |
114                         SECINFO_GROUP |
115                         SECINFO_DACL),&sd);
116
117         if (!NT_STATUS_IS_OK(status)) {
118                 DEBUG(10, ("smbd_check_access_rights: Could not get acl "
119                         "on %s: %s\n",
120                         smb_fname_str_dbg(smb_fname),
121                         nt_errstr(status)));
122
123                 if (NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED)) {
124                         goto access_denied;
125                 }
126
127                 return status;
128         }
129
130         /*
131          * Never test FILE_READ_ATTRIBUTES. se_access_check() also takes care of
132          * owner WRITE_DAC and READ_CONTROL.
133          */
134         status = se_access_check(sd,
135                                 get_current_nttok(conn),
136                                 (access_mask & ~FILE_READ_ATTRIBUTES),
137                                 &rejected_mask);
138
139         DEBUG(10,("smbd_check_access_rights: file %s requesting "
140                 "0x%x returning 0x%x (%s)\n",
141                 smb_fname_str_dbg(smb_fname),
142                 (unsigned int)access_mask,
143                 (unsigned int)rejected_mask,
144                 nt_errstr(status) ));
145
146         if (!NT_STATUS_IS_OK(status)) {
147                 if (DEBUGLEVEL >= 10) {
148                         DEBUG(10,("smbd_check_access_rights: acl for %s is:\n",
149                                 smb_fname_str_dbg(smb_fname) ));
150                         NDR_PRINT_DEBUG(security_descriptor, sd);
151                 }
152         }
153
154         TALLOC_FREE(sd);
155
156         if (NT_STATUS_IS_OK(status) ||
157                         !NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED)) {
158                 return status;
159         }
160
161         /* Here we know status == NT_STATUS_ACCESS_DENIED. */
162
163   access_denied:
164
165         if ((access_mask & FILE_WRITE_ATTRIBUTES) &&
166                         (rejected_mask & FILE_WRITE_ATTRIBUTES) &&
167                         (lp_map_readonly(SNUM(conn)) ||
168                         lp_map_archive(SNUM(conn)) ||
169                         lp_map_hidden(SNUM(conn)) ||
170                         lp_map_system(SNUM(conn)))) {
171                 rejected_mask &= ~FILE_WRITE_ATTRIBUTES;
172
173                 DEBUG(10,("smbd_check_access_rights: "
174                         "overrode "
175                         "FILE_WRITE_ATTRIBUTES "
176                         "on file %s\n",
177                         smb_fname_str_dbg(smb_fname)));
178         }
179
180         if (parent_override_delete(conn,
181                                 smb_fname,
182                                 access_mask,
183                                 rejected_mask)) {
184                 /* Were we trying to do an open
185                  * for delete and didn't get DELETE
186                  * access (only) ? Check if the
187                  * directory allows DELETE_CHILD.
188                  * See here:
189                  * http://blogs.msdn.com/oldnewthing/archive/2004/06/04/148426.aspx
190                  * for details. */
191
192                 rejected_mask &= ~DELETE_ACCESS;
193
194                 DEBUG(10,("smbd_check_access_rights: "
195                         "overrode "
196                         "DELETE_ACCESS on "
197                         "file %s\n",
198                         smb_fname_str_dbg(smb_fname)));
199         }
200
201         if (rejected_mask != 0) {
202                 return NT_STATUS_ACCESS_DENIED;
203         } else {
204                 return NT_STATUS_OK;
205         }
206 }
207
208 static NTSTATUS check_parent_access(struct connection_struct *conn,
209                                 struct smb_filename *smb_fname,
210                                 uint32_t access_mask,
211                                 char **pp_parent_dir)
212 {
213         NTSTATUS status;
214         char *parent_dir = NULL;
215         struct security_descriptor *parent_sd = NULL;
216         uint32_t access_granted = 0;
217
218         if (!parent_dirname(talloc_tos(),
219                                 smb_fname->base_name,
220                                 &parent_dir,
221                                 NULL)) {
222                 return NT_STATUS_NO_MEMORY;
223         }
224
225         if (pp_parent_dir) {
226                 *pp_parent_dir = parent_dir;
227         }
228
229         if (get_current_uid(conn) == (uid_t)0) {
230                 /* I'm sorry sir, I didn't know you were root... */
231                 DEBUG(10,("check_parent_access: root override "
232                         "on %s. Granting 0x%x\n",
233                         smb_fname_str_dbg(smb_fname),
234                         (unsigned int)access_mask ));
235                 return NT_STATUS_OK;
236         }
237
238         status = SMB_VFS_GET_NT_ACL(conn,
239                                 parent_dir,
240                                 SECINFO_DACL,
241                                 &parent_sd);
242
243         if (!NT_STATUS_IS_OK(status)) {
244                 DEBUG(5,("check_parent_access: SMB_VFS_GET_NT_ACL failed for "
245                         "%s with error %s\n",
246                         parent_dir,
247                         nt_errstr(status)));
248                 return status;
249         }
250
251         /*
252          * Never test FILE_READ_ATTRIBUTES. se_access_check() also takes care of
253          * owner WRITE_DAC and READ_CONTROL.
254          */
255         status = se_access_check(parent_sd,
256                                 get_current_nttok(conn),
257                                 (access_mask & ~FILE_READ_ATTRIBUTES),
258                                 &access_granted);
259         if(!NT_STATUS_IS_OK(status)) {
260                 DEBUG(5,("check_parent_access: access check "
261                         "on directory %s for "
262                         "path %s for mask 0x%x returned (0x%x) %s\n",
263                         parent_dir,
264                         smb_fname->base_name,
265                         access_mask,
266                         access_granted,
267                         nt_errstr(status) ));
268                 return status;
269         }
270
271         return NT_STATUS_OK;
272 }
273
274 /****************************************************************************
275  fd support routines - attempt to do a dos_open.
276 ****************************************************************************/
277
278 static NTSTATUS fd_open(struct connection_struct *conn,
279                     files_struct *fsp,
280                     int flags,
281                     mode_t mode)
282 {
283         struct smb_filename *smb_fname = fsp->fsp_name;
284         NTSTATUS status = NT_STATUS_OK;
285
286 #ifdef O_NOFOLLOW
287         /* 
288          * Never follow symlinks on a POSIX client. The
289          * client should be doing this.
290          */
291
292         if (fsp->posix_open || !lp_symlinks(SNUM(conn))) {
293                 flags |= O_NOFOLLOW;
294         }
295 #endif
296
297         fsp->fh->fd = SMB_VFS_OPEN(conn, smb_fname, fsp, flags, mode);
298         if (fsp->fh->fd == -1) {
299                 status = map_nt_error_from_unix(errno);
300                 if (errno == EMFILE) {
301                         static time_t last_warned = 0L;
302
303                         if (time((time_t *) NULL) > last_warned) {
304                                 DEBUG(0,("Too many open files, unable "
305                                         "to open more!  smbd's max "
306                                         "open files = %d\n",
307                                         lp_max_open_files()));
308                                 last_warned = time((time_t *) NULL);
309                         }
310                 }
311
312         }
313
314         DEBUG(10,("fd_open: name %s, flags = 0%o mode = 0%o, fd = %d. %s\n",
315                   smb_fname_str_dbg(smb_fname), flags, (int)mode, fsp->fh->fd,
316                 (fsp->fh->fd == -1) ? strerror(errno) : "" ));
317
318         return status;
319 }
320
321 /****************************************************************************
322  Close the file associated with a fsp.
323 ****************************************************************************/
324
325 NTSTATUS fd_close(files_struct *fsp)
326 {
327         int ret;
328
329         if (fsp->dptr) {
330                 dptr_CloseDir(fsp);
331         }
332         if (fsp->fh->fd == -1) {
333                 return NT_STATUS_OK; /* What we used to call a stat open. */
334         }
335         if (fsp->fh->ref_count > 1) {
336                 return NT_STATUS_OK; /* Shared handle. Only close last reference. */
337         }
338
339         ret = SMB_VFS_CLOSE(fsp);
340         fsp->fh->fd = -1;
341         if (ret == -1) {
342                 return map_nt_error_from_unix(errno);
343         }
344         return NT_STATUS_OK;
345 }
346
347 /****************************************************************************
348  Change the ownership of a file to that of the parent directory.
349  Do this by fd if possible.
350 ****************************************************************************/
351
352 void change_file_owner_to_parent(connection_struct *conn,
353                                         const char *inherit_from_dir,
354                                         files_struct *fsp)
355 {
356         struct smb_filename *smb_fname_parent = NULL;
357         NTSTATUS status;
358         int ret;
359
360         status = create_synthetic_smb_fname(talloc_tos(), inherit_from_dir,
361                                             NULL, NULL, &smb_fname_parent);
362         if (!NT_STATUS_IS_OK(status)) {
363                 return;
364         }
365
366         ret = SMB_VFS_STAT(conn, smb_fname_parent);
367         if (ret == -1) {
368                 DEBUG(0,("change_file_owner_to_parent: failed to stat parent "
369                          "directory %s. Error was %s\n",
370                          smb_fname_str_dbg(smb_fname_parent),
371                          strerror(errno)));
372                 TALLOC_FREE(smb_fname_parent);
373                 return;
374         }
375
376         if (smb_fname_parent->st.st_ex_uid == fsp->fsp_name->st.st_ex_uid) {
377                 /* Already this uid - no need to change. */
378                 DEBUG(10,("change_file_owner_to_parent: file %s "
379                         "is already owned by uid %d\n",
380                         fsp_str_dbg(fsp),
381                         (int)fsp->fsp_name->st.st_ex_uid ));
382                 TALLOC_FREE(smb_fname_parent);
383                 return;
384         }
385
386         become_root();
387         ret = SMB_VFS_FCHOWN(fsp, smb_fname_parent->st.st_ex_uid, (gid_t)-1);
388         unbecome_root();
389         if (ret == -1) {
390                 DEBUG(0,("change_file_owner_to_parent: failed to fchown "
391                          "file %s to parent directory uid %u. Error "
392                          "was %s\n", fsp_str_dbg(fsp),
393                          (unsigned int)smb_fname_parent->st.st_ex_uid,
394                          strerror(errno) ));
395         } else {
396                 DEBUG(10,("change_file_owner_to_parent: changed new file %s to "
397                         "parent directory uid %u.\n", fsp_str_dbg(fsp),
398                         (unsigned int)smb_fname_parent->st.st_ex_uid));
399                 /* Ensure the uid entry is updated. */
400                 fsp->fsp_name->st.st_ex_uid = smb_fname_parent->st.st_ex_uid;
401         }
402
403         TALLOC_FREE(smb_fname_parent);
404 }
405
406 NTSTATUS change_dir_owner_to_parent(connection_struct *conn,
407                                        const char *inherit_from_dir,
408                                        const char *fname,
409                                        SMB_STRUCT_STAT *psbuf)
410 {
411         struct smb_filename *smb_fname_parent = NULL;
412         struct smb_filename *smb_fname_cwd = NULL;
413         char *saved_dir = NULL;
414         TALLOC_CTX *ctx = talloc_tos();
415         NTSTATUS status = NT_STATUS_OK;
416         int ret;
417
418         status = create_synthetic_smb_fname(ctx, inherit_from_dir, NULL, NULL,
419                                             &smb_fname_parent);
420         if (!NT_STATUS_IS_OK(status)) {
421                 return status;
422         }
423
424         ret = SMB_VFS_STAT(conn, smb_fname_parent);
425         if (ret == -1) {
426                 status = map_nt_error_from_unix(errno);
427                 DEBUG(0,("change_dir_owner_to_parent: failed to stat parent "
428                          "directory %s. Error was %s\n",
429                          smb_fname_str_dbg(smb_fname_parent),
430                          strerror(errno)));
431                 goto out;
432         }
433
434         /* We've already done an lstat into psbuf, and we know it's a
435            directory. If we can cd into the directory and the dev/ino
436            are the same then we can safely chown without races as
437            we're locking the directory in place by being in it.  This
438            should work on any UNIX (thanks tridge :-). JRA.
439         */
440
441         saved_dir = vfs_GetWd(ctx,conn);
442         if (!saved_dir) {
443                 status = map_nt_error_from_unix(errno);
444                 DEBUG(0,("change_dir_owner_to_parent: failed to get "
445                          "current working directory. Error was %s\n",
446                          strerror(errno)));
447                 goto out;
448         }
449
450         /* Chdir into the new path. */
451         if (vfs_ChDir(conn, fname) == -1) {
452                 status = map_nt_error_from_unix(errno);
453                 DEBUG(0,("change_dir_owner_to_parent: failed to change "
454                          "current working directory to %s. Error "
455                          "was %s\n", fname, strerror(errno) ));
456                 goto chdir;
457         }
458
459         status = create_synthetic_smb_fname(ctx, ".", NULL, NULL,
460                                             &smb_fname_cwd);
461         if (!NT_STATUS_IS_OK(status)) {
462                 return status;
463         }
464
465         ret = SMB_VFS_STAT(conn, smb_fname_cwd);
466         if (ret == -1) {
467                 status = map_nt_error_from_unix(errno);
468                 DEBUG(0,("change_dir_owner_to_parent: failed to stat "
469                          "directory '.' (%s) Error was %s\n",
470                          fname, strerror(errno)));
471                 goto chdir;
472         }
473
474         /* Ensure we're pointing at the same place. */
475         if (smb_fname_cwd->st.st_ex_dev != psbuf->st_ex_dev ||
476             smb_fname_cwd->st.st_ex_ino != psbuf->st_ex_ino) {
477                 DEBUG(0,("change_dir_owner_to_parent: "
478                          "device/inode on directory %s changed. "
479                          "Refusing to chown !\n", fname ));
480                 status = NT_STATUS_ACCESS_DENIED;
481                 goto chdir;
482         }
483
484         if (smb_fname_parent->st.st_ex_uid == smb_fname_cwd->st.st_ex_uid) {
485                 /* Already this uid - no need to change. */
486                 DEBUG(10,("change_dir_owner_to_parent: directory %s "
487                         "is already owned by uid %d\n",
488                         fname,
489                         (int)smb_fname_cwd->st.st_ex_uid ));
490                 status = NT_STATUS_OK;
491                 goto chdir;
492         }
493
494         become_root();
495         ret = SMB_VFS_LCHOWN(conn, ".", smb_fname_parent->st.st_ex_uid,
496                             (gid_t)-1);
497         unbecome_root();
498         if (ret == -1) {
499                 status = map_nt_error_from_unix(errno);
500                 DEBUG(10,("change_dir_owner_to_parent: failed to chown "
501                           "directory %s to parent directory uid %u. "
502                           "Error was %s\n", fname,
503                           (unsigned int)smb_fname_parent->st.st_ex_uid,
504                           strerror(errno) ));
505         } else {
506                 DEBUG(10,("change_dir_owner_to_parent: changed ownership of new "
507                         "directory %s to parent directory uid %u.\n",
508                         fname, (unsigned int)smb_fname_parent->st.st_ex_uid ));
509                 /* Ensure the uid entry is updated. */
510                 psbuf->st_ex_uid = smb_fname_parent->st.st_ex_uid;
511         }
512
513  chdir:
514         vfs_ChDir(conn,saved_dir);
515  out:
516         TALLOC_FREE(smb_fname_parent);
517         TALLOC_FREE(smb_fname_cwd);
518         return status;
519 }
520
521 /****************************************************************************
522  Open a file.
523 ****************************************************************************/
524
525 static NTSTATUS open_file(files_struct *fsp,
526                           connection_struct *conn,
527                           struct smb_request *req,
528                           const char *parent_dir,
529                           int flags,
530                           mode_t unx_mode,
531                           uint32 access_mask, /* client requested access mask. */
532                           uint32 open_access_mask) /* what we're actually using in the open. */
533 {
534         struct smb_filename *smb_fname = fsp->fsp_name;
535         NTSTATUS status = NT_STATUS_OK;
536         int accmode = (flags & O_ACCMODE);
537         int local_flags = flags;
538         bool file_existed = VALID_STAT(fsp->fsp_name->st);
539         bool file_created = false;
540
541         fsp->fh->fd = -1;
542         errno = EPERM;
543
544         /* Check permissions */
545
546         /*
547          * This code was changed after seeing a client open request 
548          * containing the open mode of (DENY_WRITE/read-only) with
549          * the 'create if not exist' bit set. The previous code
550          * would fail to open the file read only on a read-only share
551          * as it was checking the flags parameter  directly against O_RDONLY,
552          * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
553          * JRA.
554          */
555
556         if (!CAN_WRITE(conn)) {
557                 /* It's a read-only share - fail if we wanted to write. */
558                 if(accmode != O_RDONLY || (flags & O_TRUNC) || (flags & O_APPEND)) {
559                         DEBUG(3,("Permission denied opening %s\n",
560                                  smb_fname_str_dbg(smb_fname)));
561                         return NT_STATUS_ACCESS_DENIED;
562                 } else if(flags & O_CREAT) {
563                         /* We don't want to write - but we must make sure that
564                            O_CREAT doesn't create the file if we have write
565                            access into the directory.
566                         */
567                         flags &= ~(O_CREAT|O_EXCL);
568                         local_flags &= ~(O_CREAT|O_EXCL);
569                 }
570         }
571
572         /*
573          * This little piece of insanity is inspired by the
574          * fact that an NT client can open a file for O_RDONLY,
575          * but set the create disposition to FILE_EXISTS_TRUNCATE.
576          * If the client *can* write to the file, then it expects to
577          * truncate the file, even though it is opening for readonly.
578          * Quicken uses this stupid trick in backup file creation...
579          * Thanks *greatly* to "David W. Chapman Jr." <dwcjr@inethouston.net>
580          * for helping track this one down. It didn't bite us in 2.0.x
581          * as we always opened files read-write in that release. JRA.
582          */
583
584         if ((accmode == O_RDONLY) && ((flags & O_TRUNC) == O_TRUNC)) {
585                 DEBUG(10,("open_file: truncate requested on read-only open "
586                           "for file %s\n", smb_fname_str_dbg(smb_fname)));
587                 local_flags = (flags & ~O_ACCMODE)|O_RDWR;
588         }
589
590         if ((open_access_mask & (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_EXECUTE)) ||
591             (!file_existed && (local_flags & O_CREAT)) ||
592             ((local_flags & O_TRUNC) == O_TRUNC) ) {
593                 const char *wild;
594
595                 /*
596                  * We can't actually truncate here as the file may be locked.
597                  * open_file_ntcreate will take care of the truncate later. JRA.
598                  */
599
600                 local_flags &= ~O_TRUNC;
601
602 #if defined(O_NONBLOCK) && defined(S_ISFIFO)
603                 /*
604                  * We would block on opening a FIFO with no one else on the
605                  * other end. Do what we used to do and add O_NONBLOCK to the
606                  * open flags. JRA.
607                  */
608
609                 if (file_existed && S_ISFIFO(smb_fname->st.st_ex_mode)) {
610                         local_flags |= O_NONBLOCK;
611                 }
612 #endif
613
614                 /* Don't create files with Microsoft wildcard characters. */
615                 if (fsp->base_fsp) {
616                         /*
617                          * wildcard characters are allowed in stream names
618                          * only test the basefilename
619                          */
620                         wild = fsp->base_fsp->fsp_name->base_name;
621                 } else {
622                         wild = smb_fname->base_name;
623                 }
624                 if ((local_flags & O_CREAT) && !file_existed &&
625                     ms_has_wild(wild))  {
626                         return NT_STATUS_OBJECT_NAME_INVALID;
627                 }
628
629                 /* Can we access this file ? */
630                 if (!fsp->base_fsp) {
631                         /* Only do this check on non-stream open. */
632                         if (file_existed) {
633                                 status = smbd_check_access_rights(conn,
634                                                 smb_fname,
635                                                 access_mask);
636                         } else if (local_flags & O_CREAT){
637                                 status = check_parent_access(conn,
638                                                 smb_fname,
639                                                 SEC_DIR_ADD_FILE,
640                                                 NULL);
641                         } else {
642                                 /* File didn't exist and no O_CREAT. */
643                                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
644                         }
645                         if (!NT_STATUS_IS_OK(status)) {
646                                 DEBUG(10,("open_file: "
647                                         "%s on file "
648                                         "%s returned %s\n",
649                                         file_existed ?
650                                                 "smbd_check_access_rights" :
651                                                 "check_parent_access",
652                                         smb_fname_str_dbg(smb_fname),
653                                         nt_errstr(status) ));
654                                 return status;
655                         }
656                 }
657
658                 /* Actually do the open */
659                 status = fd_open(conn, fsp, local_flags, unx_mode);
660                 if (!NT_STATUS_IS_OK(status)) {
661                         DEBUG(3,("Error opening file %s (%s) (local_flags=%d) "
662                                  "(flags=%d)\n", smb_fname_str_dbg(smb_fname),
663                                  nt_errstr(status),local_flags,flags));
664                         return status;
665                 }
666
667                 if ((local_flags & O_CREAT) && !file_existed) {
668                         file_created = true;
669                 }
670
671         } else {
672                 fsp->fh->fd = -1; /* What we used to call a stat open. */
673                 if (!file_existed) {
674                         /* File must exist for a stat open. */
675                         return NT_STATUS_OBJECT_NAME_NOT_FOUND;
676                 }
677
678                 status = smbd_check_access_rights(conn,
679                                 smb_fname,
680                                 access_mask);
681
682                 if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND) &&
683                                 fsp->posix_open &&
684                                 S_ISLNK(smb_fname->st.st_ex_mode)) {
685                         /* This is a POSIX stat open for delete
686                          * or rename on a symlink that points
687                          * nowhere. Allow. */
688                         DEBUG(10,("open_file: allowing POSIX "
689                                   "open on bad symlink %s\n",
690                                   smb_fname_str_dbg(smb_fname)));
691                         status = NT_STATUS_OK;
692                 }
693
694                 if (!NT_STATUS_IS_OK(status)) {
695                         DEBUG(10,("open_file: "
696                                 "smbd_check_access_rights on file "
697                                 "%s returned %s\n",
698                                 smb_fname_str_dbg(smb_fname),
699                                 nt_errstr(status) ));
700                         return status;
701                 }
702         }
703
704         if (!file_existed) {
705                 int ret;
706
707                 if (fsp->fh->fd == -1) {
708                         ret = SMB_VFS_STAT(conn, smb_fname);
709                 } else {
710                         ret = SMB_VFS_FSTAT(fsp, &smb_fname->st);
711                         /* If we have an fd, this stat should succeed. */
712                         if (ret == -1) {
713                                 DEBUG(0,("Error doing fstat on open file %s "
714                                          "(%s)\n",
715                                          smb_fname_str_dbg(smb_fname),
716                                          strerror(errno) ));
717                         }
718                 }
719
720                 /* For a non-io open, this stat failing means file not found. JRA */
721                 if (ret == -1) {
722                         status = map_nt_error_from_unix(errno);
723                         fd_close(fsp);
724                         return status;
725                 }
726
727                 if (file_created) {
728                         bool need_re_stat = false;
729                         /* Do all inheritance work after we've
730                            done a successful stat call and filled
731                            in the stat struct in fsp->fsp_name. */
732
733                         /* Inherit the ACL if required */
734                         if (lp_inherit_perms(SNUM(conn))) {
735                                 inherit_access_posix_acl(conn, parent_dir,
736                                                          smb_fname->base_name,
737                                                          unx_mode);
738                                 need_re_stat = true;
739                         }
740
741                         /* Change the owner if required. */
742                         if (lp_inherit_owner(SNUM(conn))) {
743                                 change_file_owner_to_parent(conn, parent_dir,
744                                                             fsp);
745                                 need_re_stat = true;
746                         }
747
748                         if (need_re_stat) {
749                                 if (fsp->fh->fd == -1) {
750                                         ret = SMB_VFS_STAT(conn, smb_fname);
751                                 } else {
752                                         ret = SMB_VFS_FSTAT(fsp, &smb_fname->st);
753                                         /* If we have an fd, this stat should succeed. */
754                                         if (ret == -1) {
755                                                 DEBUG(0,("Error doing fstat on open file %s "
756                                                          "(%s)\n",
757                                                          smb_fname_str_dbg(smb_fname),
758                                                          strerror(errno) ));
759                                         }
760                                 }
761                         }
762
763                         notify_fname(conn, NOTIFY_ACTION_ADDED,
764                                      FILE_NOTIFY_CHANGE_FILE_NAME,
765                                      smb_fname->base_name);
766                 }
767         }
768
769         /*
770          * POSIX allows read-only opens of directories. We don't
771          * want to do this (we use a different code path for this)
772          * so catch a directory open and return an EISDIR. JRA.
773          */
774
775         if(S_ISDIR(smb_fname->st.st_ex_mode)) {
776                 fd_close(fsp);
777                 errno = EISDIR;
778                 return NT_STATUS_FILE_IS_A_DIRECTORY;
779         }
780
781         fsp->mode = smb_fname->st.st_ex_mode;
782         fsp->file_id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
783         fsp->vuid = req ? req->vuid : UID_FIELD_INVALID;
784         fsp->file_pid = req ? req->smbpid : 0;
785         fsp->can_lock = True;
786         fsp->can_read = (access_mask & (FILE_READ_DATA)) ? True : False;
787         if (!CAN_WRITE(conn)) {
788                 fsp->can_write = False;
789         } else {
790                 fsp->can_write = (access_mask & (FILE_WRITE_DATA | FILE_APPEND_DATA)) ?
791                         True : False;
792         }
793         fsp->print_file = NULL;
794         fsp->modified = False;
795         fsp->sent_oplock_break = NO_BREAK_SENT;
796         fsp->is_directory = False;
797         if (conn->aio_write_behind_list &&
798             is_in_path(smb_fname->base_name, conn->aio_write_behind_list,
799                        conn->case_sensitive)) {
800                 fsp->aio_write_behind = True;
801         }
802
803         fsp->wcp = NULL; /* Write cache pointer. */
804
805         DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
806                  conn->session_info->unix_info->unix_name,
807                  smb_fname_str_dbg(smb_fname),
808                  BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
809                  conn->num_files_open));
810
811         errno = 0;
812         return NT_STATUS_OK;
813 }
814
815 /****************************************************************************
816  Check if we can open a file with a share mode.
817  Returns True if conflict, False if not.
818 ****************************************************************************/
819
820 static bool share_conflict(struct share_mode_entry *entry,
821                            uint32 access_mask,
822                            uint32 share_access)
823 {
824         DEBUG(10,("share_conflict: entry->access_mask = 0x%x, "
825                   "entry->share_access = 0x%x, "
826                   "entry->private_options = 0x%x\n",
827                   (unsigned int)entry->access_mask,
828                   (unsigned int)entry->share_access,
829                   (unsigned int)entry->private_options));
830
831         DEBUG(10,("share_conflict: access_mask = 0x%x, share_access = 0x%x\n",
832                   (unsigned int)access_mask, (unsigned int)share_access));
833
834         if ((entry->access_mask & (FILE_WRITE_DATA|
835                                    FILE_APPEND_DATA|
836                                    FILE_READ_DATA|
837                                    FILE_EXECUTE|
838                                    DELETE_ACCESS)) == 0) {
839                 DEBUG(10,("share_conflict: No conflict due to "
840                           "entry->access_mask = 0x%x\n",
841                           (unsigned int)entry->access_mask ));
842                 return False;
843         }
844
845         if ((access_mask & (FILE_WRITE_DATA|
846                             FILE_APPEND_DATA|
847                             FILE_READ_DATA|
848                             FILE_EXECUTE|
849                             DELETE_ACCESS)) == 0) {
850                 DEBUG(10,("share_conflict: No conflict due to "
851                           "access_mask = 0x%x\n",
852                           (unsigned int)access_mask ));
853                 return False;
854         }
855
856 #if 1 /* JRA TEST - Superdebug. */
857 #define CHECK_MASK(num, am, right, sa, share) \
858         DEBUG(10,("share_conflict: [%d] am (0x%x) & right (0x%x) = 0x%x\n", \
859                 (unsigned int)(num), (unsigned int)(am), \
860                 (unsigned int)(right), (unsigned int)(am)&(right) )); \
861         DEBUG(10,("share_conflict: [%d] sa (0x%x) & share (0x%x) = 0x%x\n", \
862                 (unsigned int)(num), (unsigned int)(sa), \
863                 (unsigned int)(share), (unsigned int)(sa)&(share) )); \
864         if (((am) & (right)) && !((sa) & (share))) { \
865                 DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
866 sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
867                         (unsigned int)(share) )); \
868                 return True; \
869         }
870 #else
871 #define CHECK_MASK(num, am, right, sa, share) \
872         if (((am) & (right)) && !((sa) & (share))) { \
873                 DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
874 sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
875                         (unsigned int)(share) )); \
876                 return True; \
877         }
878 #endif
879
880         CHECK_MASK(1, entry->access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
881                    share_access, FILE_SHARE_WRITE);
882         CHECK_MASK(2, access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
883                    entry->share_access, FILE_SHARE_WRITE);
884
885         CHECK_MASK(3, entry->access_mask, FILE_READ_DATA | FILE_EXECUTE,
886                    share_access, FILE_SHARE_READ);
887         CHECK_MASK(4, access_mask, FILE_READ_DATA | FILE_EXECUTE,
888                    entry->share_access, FILE_SHARE_READ);
889
890         CHECK_MASK(5, entry->access_mask, DELETE_ACCESS,
891                    share_access, FILE_SHARE_DELETE);
892         CHECK_MASK(6, access_mask, DELETE_ACCESS,
893                    entry->share_access, FILE_SHARE_DELETE);
894
895         DEBUG(10,("share_conflict: No conflict.\n"));
896         return False;
897 }
898
899 #if defined(DEVELOPER)
900 static void validate_my_share_entries(struct smbd_server_connection *sconn,
901                                       int num,
902                                       struct share_mode_entry *share_entry)
903 {
904         files_struct *fsp;
905
906         if (!procid_is_me(&share_entry->pid)) {
907                 return;
908         }
909
910         if (is_deferred_open_entry(share_entry) &&
911             !open_was_deferred(sconn, share_entry->op_mid)) {
912                 char *str = talloc_asprintf(talloc_tos(),
913                         "Got a deferred entry without a request: "
914                         "PANIC: %s\n",
915                         share_mode_str(talloc_tos(), num, share_entry));
916                 smb_panic(str);
917         }
918
919         if (!is_valid_share_mode_entry(share_entry)) {
920                 return;
921         }
922
923         fsp = file_find_dif(sconn, share_entry->id,
924                             share_entry->share_file_id);
925         if (!fsp) {
926                 DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
927                          share_mode_str(talloc_tos(), num, share_entry) ));
928                 smb_panic("validate_my_share_entries: Cannot match a "
929                           "share entry with an open file\n");
930         }
931
932         if (is_deferred_open_entry(share_entry)) {
933                 goto panic;
934         }
935
936         if ((share_entry->op_type == NO_OPLOCK) &&
937             (fsp->oplock_type == FAKE_LEVEL_II_OPLOCK)) {
938                 /* Someone has already written to it, but I haven't yet
939                  * noticed */
940                 return;
941         }
942
943         if (((uint16)fsp->oplock_type) != share_entry->op_type) {
944                 goto panic;
945         }
946
947         return;
948
949  panic:
950         {
951                 char *str;
952                 DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
953                          share_mode_str(talloc_tos(), num, share_entry) ));
954                 str = talloc_asprintf(talloc_tos(),
955                         "validate_my_share_entries: "
956                         "file %s, oplock_type = 0x%x, op_type = 0x%x\n",
957                          fsp->fsp_name->base_name,
958                          (unsigned int)fsp->oplock_type,
959                          (unsigned int)share_entry->op_type );
960                 smb_panic(str);
961         }
962 }
963 #endif
964
965 bool is_stat_open(uint32 access_mask)
966 {
967         return (access_mask &&
968                 ((access_mask & ~(SYNCHRONIZE_ACCESS| FILE_READ_ATTRIBUTES|
969                                   FILE_WRITE_ATTRIBUTES))==0) &&
970                 ((access_mask & (SYNCHRONIZE_ACCESS|FILE_READ_ATTRIBUTES|
971                                  FILE_WRITE_ATTRIBUTES)) != 0));
972 }
973
974 /****************************************************************************
975  Deal with share modes
976  Invarient: Share mode must be locked on entry and exit.
977  Returns -1 on error, or number of share modes on success (may be zero).
978 ****************************************************************************/
979
980 static NTSTATUS open_mode_check(connection_struct *conn,
981                                 struct share_mode_lock *lck,
982                                 uint32_t name_hash,
983                                 uint32 access_mask,
984                                 uint32 share_access,
985                                 uint32 create_options,
986                                 bool *file_existed)
987 {
988         int i;
989
990         if(lck->data->num_share_modes == 0) {
991                 return NT_STATUS_OK;
992         }
993
994         *file_existed = True;
995
996         /* A delete on close prohibits everything */
997
998         if (is_delete_on_close_set(lck, name_hash)) {
999                 return NT_STATUS_DELETE_PENDING;
1000         }
1001
1002         if (is_stat_open(access_mask)) {
1003                 /* Stat open that doesn't trigger oplock breaks or share mode
1004                  * checks... ! JRA. */
1005                 return NT_STATUS_OK;
1006         }
1007
1008         /*
1009          * Check if the share modes will give us access.
1010          */
1011
1012 #if defined(DEVELOPER)
1013         for(i = 0; i < lck->data->num_share_modes; i++) {
1014                 validate_my_share_entries(conn->sconn, i,
1015                                           &lck->data->share_modes[i]);
1016         }
1017 #endif
1018
1019         if (!lp_share_modes(SNUM(conn))) {
1020                 return NT_STATUS_OK;
1021         }
1022
1023         /* Now we check the share modes, after any oplock breaks. */
1024         for(i = 0; i < lck->data->num_share_modes; i++) {
1025
1026                 if (!is_valid_share_mode_entry(&lck->data->share_modes[i])) {
1027                         continue;
1028                 }
1029
1030                 /* someone else has a share lock on it, check to see if we can
1031                  * too */
1032                 if (share_conflict(&lck->data->share_modes[i],
1033                                    access_mask, share_access)) {
1034                         return NT_STATUS_SHARING_VIOLATION;
1035                 }
1036         }
1037
1038         return NT_STATUS_OK;
1039 }
1040
1041 static bool is_delete_request(files_struct *fsp) {
1042         return ((fsp->access_mask == DELETE_ACCESS) &&
1043                 (fsp->oplock_type == NO_OPLOCK));
1044 }
1045
1046 /*
1047  * Send a break message to the oplock holder and delay the open for
1048  * our client.
1049  */
1050
1051 static NTSTATUS send_break_message(files_struct *fsp,
1052                                         struct share_mode_entry *exclusive,
1053                                         uint64_t mid,
1054                                         int oplock_request)
1055 {
1056         NTSTATUS status;
1057         char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
1058
1059         DEBUG(10, ("Sending break request to PID %s\n",
1060                    procid_str_static(&exclusive->pid)));
1061         exclusive->op_mid = mid;
1062
1063         /* Create the message. */
1064         share_mode_entry_to_message(msg, exclusive);
1065
1066         /* Add in the FORCE_OPLOCK_BREAK_TO_NONE bit in the message if set. We
1067            don't want this set in the share mode struct pointed to by lck. */
1068
1069         if (oplock_request & FORCE_OPLOCK_BREAK_TO_NONE) {
1070                 SSVAL(msg,OP_BREAK_MSG_OP_TYPE_OFFSET,
1071                         exclusive->op_type | FORCE_OPLOCK_BREAK_TO_NONE);
1072         }
1073
1074         status = messaging_send_buf(fsp->conn->sconn->msg_ctx, exclusive->pid,
1075                                     MSG_SMB_BREAK_REQUEST,
1076                                     (uint8 *)msg,
1077                                     MSG_SMB_SHARE_MODE_ENTRY_SIZE);
1078         if (!NT_STATUS_IS_OK(status)) {
1079                 DEBUG(3, ("Could not send oplock break message: %s\n",
1080                           nt_errstr(status)));
1081         }
1082
1083         return status;
1084 }
1085
1086 /*
1087  * Return share_mode_entry pointers for :
1088  * 1). Batch oplock entry.
1089  * 2). Batch or exclusive oplock entry (may be identical to #1).
1090  * bool have_level2_oplock
1091  * bool have_no_oplock.
1092  * Do internal consistency checks on the share mode for a file.
1093  */
1094
1095 static void find_oplock_types(files_struct *fsp,
1096                                 int oplock_request,
1097                                 const struct share_mode_lock *lck,
1098                                 struct share_mode_entry **pp_batch,
1099                                 struct share_mode_entry **pp_ex_or_batch,
1100                                 bool *got_level2,
1101                                 bool *got_no_oplock)
1102 {
1103         int i;
1104
1105         *pp_batch = NULL;
1106         *pp_ex_or_batch = NULL;
1107         *got_level2 = false;
1108         *got_no_oplock = false;
1109
1110         /* Ignore stat or internal opens, as is done in
1111                 delay_for_batch_oplocks() and
1112                 delay_for_exclusive_oplocks().
1113          */
1114         if ((oplock_request & INTERNAL_OPEN_ONLY) || is_stat_open(fsp->access_mask)) {
1115                 return;
1116         }
1117
1118         for (i=0; i<lck->data->num_share_modes; i++) {
1119                 if (!is_valid_share_mode_entry(&lck->data->share_modes[i])) {
1120                         continue;
1121                 }
1122
1123                 if (lck->data->share_modes[i].op_type == NO_OPLOCK &&
1124                                 is_stat_open(lck->data->share_modes[i].access_mask)) {
1125                         /* We ignore stat opens in the table - they
1126                            always have NO_OPLOCK and never get or
1127                            cause breaks. JRA. */
1128                         continue;
1129                 }
1130
1131                 if (BATCH_OPLOCK_TYPE(lck->data->share_modes[i].op_type)) {
1132                         /* batch - can only be one. */
1133                         if (*pp_ex_or_batch || *pp_batch || *got_level2 || *got_no_oplock) {
1134                                 smb_panic("Bad batch oplock entry.");
1135                         }
1136                         *pp_batch = &lck->data->share_modes[i];
1137                 }
1138
1139                 if (EXCLUSIVE_OPLOCK_TYPE(lck->data->share_modes[i].op_type)) {
1140                         /* Exclusive or batch - can only be one. */
1141                         if (*pp_ex_or_batch || *got_level2 || *got_no_oplock) {
1142                                 smb_panic("Bad exclusive or batch oplock entry.");
1143                         }
1144                         *pp_ex_or_batch = &lck->data->share_modes[i];
1145                 }
1146
1147                 if (LEVEL_II_OPLOCK_TYPE(lck->data->share_modes[i].op_type)) {
1148                         if (*pp_batch || *pp_ex_or_batch) {
1149                                 smb_panic("Bad levelII oplock entry.");
1150                         }
1151                         *got_level2 = true;
1152                 }
1153
1154                 if (lck->data->share_modes[i].op_type == NO_OPLOCK) {
1155                         if (*pp_batch || *pp_ex_or_batch) {
1156                                 smb_panic("Bad no oplock entry.");
1157                         }
1158                         *got_no_oplock = true;
1159                 }
1160         }
1161 }
1162
1163 static bool delay_for_batch_oplocks(files_struct *fsp,
1164                                         uint64_t mid,
1165                                         int oplock_request,
1166                                         struct share_mode_entry *batch_entry)
1167 {
1168         if ((oplock_request & INTERNAL_OPEN_ONLY) || is_stat_open(fsp->access_mask)) {
1169                 return false;
1170         }
1171         if (batch_entry == NULL) {
1172                 return false;
1173         }
1174
1175         /* Found a batch oplock */
1176         send_break_message(fsp, batch_entry, mid, oplock_request);
1177         return true;
1178 }
1179
1180 static bool delay_for_exclusive_oplocks(files_struct *fsp,
1181                                         uint64_t mid,
1182                                         int oplock_request,
1183                                         struct share_mode_entry *ex_entry)
1184 {
1185         bool delay_it;
1186
1187         if ((oplock_request & INTERNAL_OPEN_ONLY) || is_stat_open(fsp->access_mask)) {
1188                 return false;
1189         }
1190         if (ex_entry == NULL) {
1191                 return false;
1192         }
1193
1194         /* Found an exclusive or batch oplock */
1195
1196         delay_it = is_delete_request(fsp) ?
1197                 BATCH_OPLOCK_TYPE(ex_entry->op_type) : true;
1198
1199         if (!delay_it) {
1200                 return false;
1201         }
1202
1203         send_break_message(fsp, ex_entry, mid, oplock_request);
1204         return true;
1205 }
1206
1207 static void grant_fsp_oplock_type(files_struct *fsp,
1208                                 const struct byte_range_lock *br_lck,
1209                                 int oplock_request,
1210                                 bool got_level2_oplock,
1211                                 bool got_a_none_oplock)
1212 {
1213         bool allow_level2 = (global_client_caps & CAP_LEVEL_II_OPLOCKS) &&
1214                             lp_level2_oplocks(SNUM(fsp->conn));
1215
1216         /* Start by granting what the client asked for,
1217            but ensure no SAMBA_PRIVATE bits can be set. */
1218         fsp->oplock_type = (oplock_request & ~SAMBA_PRIVATE_OPLOCK_MASK);
1219
1220         if (oplock_request & INTERNAL_OPEN_ONLY) {
1221                 /* No oplocks on internal open. */
1222                 fsp->oplock_type = NO_OPLOCK;
1223                 DEBUG(10,("grant_fsp_oplock_type: oplock type 0x%x on file %s\n",
1224                         fsp->oplock_type, fsp_str_dbg(fsp)));
1225                 return;
1226         } else if (br_lck && br_lck->num_locks > 0) {
1227                 DEBUG(10,("grant_fsp_oplock_type: file %s has byte range locks\n",
1228                         fsp_str_dbg(fsp)));
1229                 fsp->oplock_type = NO_OPLOCK;
1230         }
1231
1232         if (is_stat_open(fsp->access_mask)) {
1233                 /* Leave the value already set. */
1234                 DEBUG(10,("grant_fsp_oplock_type: oplock type 0x%x on file %s\n",
1235                         fsp->oplock_type, fsp_str_dbg(fsp)));
1236                 return;
1237         }
1238
1239         /*
1240          * Match what was requested (fsp->oplock_type) with
1241          * what was found in the existing share modes.
1242          */
1243
1244         if (got_a_none_oplock) {
1245                 fsp->oplock_type = NO_OPLOCK;
1246         } else if (got_level2_oplock) {
1247                 if (fsp->oplock_type == NO_OPLOCK ||
1248                                 fsp->oplock_type == FAKE_LEVEL_II_OPLOCK) {
1249                         /* Store a level2 oplock, but don't tell the client */
1250                         fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
1251                 } else {
1252                         fsp->oplock_type = LEVEL_II_OPLOCK;
1253                 }
1254         } else {
1255                 /* All share_mode_entries are placeholders or deferred.
1256                  * Silently upgrade to fake levelII if the client didn't
1257                  * ask for an oplock. */
1258                 if (fsp->oplock_type == NO_OPLOCK) {
1259                         /* Store a level2 oplock, but don't tell the client */
1260                         fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
1261                 }
1262         }
1263
1264         /*
1265          * Don't grant level2 to clients that don't want them
1266          * or if we've turned them off.
1267          */
1268         if (fsp->oplock_type == LEVEL_II_OPLOCK && !allow_level2) {
1269                 fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
1270         }
1271
1272         DEBUG(10,("grant_fsp_oplock_type: oplock type 0x%x on file %s\n",
1273                   fsp->oplock_type, fsp_str_dbg(fsp)));
1274 }
1275
1276 bool request_timed_out(struct timeval request_time,
1277                        struct timeval timeout)
1278 {
1279         struct timeval now, end_time;
1280         GetTimeOfDay(&now);
1281         end_time = timeval_sum(&request_time, &timeout);
1282         return (timeval_compare(&end_time, &now) < 0);
1283 }
1284
1285 /****************************************************************************
1286  Handle the 1 second delay in returning a SHARING_VIOLATION error.
1287 ****************************************************************************/
1288
1289 static void defer_open(struct share_mode_lock *lck,
1290                        struct timeval request_time,
1291                        struct timeval timeout,
1292                        struct smb_request *req,
1293                        struct deferred_open_record *state)
1294 {
1295         int i;
1296
1297         /* Paranoia check */
1298
1299         for (i=0; i<lck->data->num_share_modes; i++) {
1300                 struct share_mode_entry *e = &lck->data->share_modes[i];
1301
1302                 if (is_deferred_open_entry(e) &&
1303                     procid_is_me(&e->pid) &&
1304                     (e->op_mid == req->mid)) {
1305                         DEBUG(0, ("Trying to defer an already deferred "
1306                                 "request: mid=%llu, exiting\n",
1307                                 (unsigned long long)req->mid));
1308                         exit_server("attempt to defer a deferred request");
1309                 }
1310         }
1311
1312         /* End paranoia check */
1313
1314         DEBUG(10,("defer_open_sharing_error: time [%u.%06u] adding deferred "
1315                   "open entry for mid %llu\n",
1316                   (unsigned int)request_time.tv_sec,
1317                   (unsigned int)request_time.tv_usec,
1318                   (unsigned long long)req->mid));
1319
1320         if (!push_deferred_open_message_smb(req, request_time, timeout,
1321                                        state->id, (char *)state, sizeof(*state))) {
1322                 exit_server("push_deferred_open_message_smb failed");
1323         }
1324         add_deferred_open(lck, req->mid, request_time,
1325                           messaging_server_id(req->sconn->msg_ctx), state->id);
1326 }
1327
1328
1329 /****************************************************************************
1330  On overwrite open ensure that the attributes match.
1331 ****************************************************************************/
1332
1333 bool open_match_attributes(connection_struct *conn,
1334                            uint32 old_dos_attr,
1335                            uint32 new_dos_attr,
1336                            mode_t existing_unx_mode,
1337                            mode_t new_unx_mode,
1338                            mode_t *returned_unx_mode)
1339 {
1340         uint32 noarch_old_dos_attr, noarch_new_dos_attr;
1341
1342         noarch_old_dos_attr = (old_dos_attr & ~FILE_ATTRIBUTE_ARCHIVE);
1343         noarch_new_dos_attr = (new_dos_attr & ~FILE_ATTRIBUTE_ARCHIVE);
1344
1345         if((noarch_old_dos_attr == 0 && noarch_new_dos_attr != 0) || 
1346            (noarch_old_dos_attr != 0 && ((noarch_old_dos_attr & noarch_new_dos_attr) == noarch_old_dos_attr))) {
1347                 *returned_unx_mode = new_unx_mode;
1348         } else {
1349                 *returned_unx_mode = (mode_t)0;
1350         }
1351
1352         DEBUG(10,("open_match_attributes: old_dos_attr = 0x%x, "
1353                   "existing_unx_mode = 0%o, new_dos_attr = 0x%x "
1354                   "returned_unx_mode = 0%o\n",
1355                   (unsigned int)old_dos_attr,
1356                   (unsigned int)existing_unx_mode,
1357                   (unsigned int)new_dos_attr,
1358                   (unsigned int)*returned_unx_mode ));
1359
1360         /* If we're mapping SYSTEM and HIDDEN ensure they match. */
1361         if (lp_map_system(SNUM(conn)) || lp_store_dos_attributes(SNUM(conn))) {
1362                 if ((old_dos_attr & FILE_ATTRIBUTE_SYSTEM) &&
1363                     !(new_dos_attr & FILE_ATTRIBUTE_SYSTEM)) {
1364                         return False;
1365                 }
1366         }
1367         if (lp_map_hidden(SNUM(conn)) || lp_store_dos_attributes(SNUM(conn))) {
1368                 if ((old_dos_attr & FILE_ATTRIBUTE_HIDDEN) &&
1369                     !(new_dos_attr & FILE_ATTRIBUTE_HIDDEN)) {
1370                         return False;
1371                 }
1372         }
1373         return True;
1374 }
1375
1376 /****************************************************************************
1377  Special FCB or DOS processing in the case of a sharing violation.
1378  Try and find a duplicated file handle.
1379 ****************************************************************************/
1380
1381 NTSTATUS fcb_or_dos_open(struct smb_request *req,
1382                                      connection_struct *conn,
1383                                      files_struct *fsp_to_dup_into,
1384                                      const struct smb_filename *smb_fname,
1385                                      struct file_id id,
1386                                      uint16 file_pid,
1387                                      uint16 vuid,
1388                                      uint32 access_mask,
1389                                      uint32 share_access,
1390                                      uint32 create_options)
1391 {
1392         files_struct *fsp;
1393
1394         DEBUG(5,("fcb_or_dos_open: attempting old open semantics for "
1395                  "file %s.\n", smb_fname_str_dbg(smb_fname)));
1396
1397         for(fsp = file_find_di_first(conn->sconn, id); fsp;
1398             fsp = file_find_di_next(fsp)) {
1399
1400                 DEBUG(10,("fcb_or_dos_open: checking file %s, fd = %d, "
1401                           "vuid = %u, file_pid = %u, private_options = 0x%x "
1402                           "access_mask = 0x%x\n", fsp_str_dbg(fsp),
1403                           fsp->fh->fd, (unsigned int)fsp->vuid,
1404                           (unsigned int)fsp->file_pid,
1405                           (unsigned int)fsp->fh->private_options,
1406                           (unsigned int)fsp->access_mask ));
1407
1408                 if (fsp->fh->fd != -1 &&
1409                     fsp->vuid == vuid &&
1410                     fsp->file_pid == file_pid &&
1411                     (fsp->fh->private_options & (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS |
1412                                                  NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) &&
1413                     (fsp->access_mask & FILE_WRITE_DATA) &&
1414                     strequal(fsp->fsp_name->base_name, smb_fname->base_name) &&
1415                     strequal(fsp->fsp_name->stream_name,
1416                              smb_fname->stream_name)) {
1417                         DEBUG(10,("fcb_or_dos_open: file match\n"));
1418                         break;
1419                 }
1420         }
1421
1422         if (!fsp) {
1423                 return NT_STATUS_NOT_FOUND;
1424         }
1425
1426         /* quite an insane set of semantics ... */
1427         if (is_executable(smb_fname->base_name) &&
1428             (fsp->fh->private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS)) {
1429                 DEBUG(10,("fcb_or_dos_open: file fail due to is_executable.\n"));
1430                 return NT_STATUS_INVALID_PARAMETER;
1431         }
1432
1433         /* We need to duplicate this fsp. */
1434         return dup_file_fsp(req, fsp, access_mask, share_access,
1435                             create_options, fsp_to_dup_into);
1436 }
1437
1438 static void schedule_defer_open(struct share_mode_lock *lck,
1439                                 struct timeval request_time,
1440                                 struct smb_request *req)
1441 {
1442         struct deferred_open_record state;
1443
1444         /* This is a relative time, added to the absolute
1445            request_time value to get the absolute timeout time.
1446            Note that if this is the second or greater time we enter
1447            this codepath for this particular request mid then
1448            request_time is left as the absolute time of the *first*
1449            time this request mid was processed. This is what allows
1450            the request to eventually time out. */
1451
1452         struct timeval timeout;
1453
1454         /* Normally the smbd we asked should respond within
1455          * OPLOCK_BREAK_TIMEOUT seconds regardless of whether
1456          * the client did, give twice the timeout as a safety
1457          * measure here in case the other smbd is stuck
1458          * somewhere else. */
1459
1460         timeout = timeval_set(OPLOCK_BREAK_TIMEOUT*2, 0);
1461
1462         /* Nothing actually uses state.delayed_for_oplocks
1463            but it's handy to differentiate in debug messages
1464            between a 30 second delay due to oplock break, and
1465            a 1 second delay for share mode conflicts. */
1466
1467         state.delayed_for_oplocks = True;
1468         state.id = lck->data->id;
1469
1470         if (!request_timed_out(request_time, timeout)) {
1471                 defer_open(lck, request_time, timeout, req, &state);
1472         }
1473 }
1474
1475 /****************************************************************************
1476  Work out what access_mask to use from what the client sent us.
1477 ****************************************************************************/
1478
1479 static NTSTATUS smbd_calculate_maximum_allowed_access(
1480         connection_struct *conn,
1481         const struct smb_filename *smb_fname,
1482         uint32_t *p_access_mask)
1483 {
1484         struct security_descriptor *sd;
1485         uint32_t access_granted;
1486         NTSTATUS status;
1487
1488         if (get_current_uid(conn) == (uid_t)0) {
1489                 *p_access_mask |= FILE_GENERIC_ALL;
1490                 return NT_STATUS_OK;
1491         }
1492
1493         status = SMB_VFS_GET_NT_ACL(conn, smb_fname->base_name,
1494                                     (SECINFO_OWNER |
1495                                      SECINFO_GROUP |
1496                                      SECINFO_DACL),&sd);
1497
1498         if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
1499                 /*
1500                  * File did not exist
1501                  */
1502                 *p_access_mask = FILE_GENERIC_ALL;
1503                 return NT_STATUS_OK;
1504         }
1505         if (!NT_STATUS_IS_OK(status)) {
1506                 DEBUG(10,("smbd_calculate_access_mask: "
1507                           "Could not get acl on file %s: %s\n",
1508                           smb_fname_str_dbg(smb_fname),
1509                           nt_errstr(status)));
1510                 return NT_STATUS_ACCESS_DENIED;
1511         }
1512
1513         /*
1514          * Never test FILE_READ_ATTRIBUTES. se_access_check()
1515          * also takes care of owner WRITE_DAC and READ_CONTROL.
1516          */
1517         status = se_access_check(sd,
1518                                  get_current_nttok(conn),
1519                                  (*p_access_mask & ~FILE_READ_ATTRIBUTES),
1520                                  &access_granted);
1521
1522         TALLOC_FREE(sd);
1523
1524         if (!NT_STATUS_IS_OK(status)) {
1525                 DEBUG(10, ("smbd_calculate_access_mask: "
1526                            "Access denied on file %s: "
1527                            "when calculating maximum access\n",
1528                            smb_fname_str_dbg(smb_fname)));
1529                 return NT_STATUS_ACCESS_DENIED;
1530         }
1531         *p_access_mask = (access_granted | FILE_READ_ATTRIBUTES);
1532         return NT_STATUS_OK;
1533 }
1534
1535 NTSTATUS smbd_calculate_access_mask(connection_struct *conn,
1536                                     const struct smb_filename *smb_fname,
1537                                     uint32_t access_mask,
1538                                     uint32_t *access_mask_out)
1539 {
1540         NTSTATUS status;
1541         uint32_t orig_access_mask = access_mask;
1542         uint32_t rejected_share_access;
1543
1544         /*
1545          * Convert GENERIC bits to specific bits.
1546          */
1547
1548         se_map_generic(&access_mask, &file_generic_mapping);
1549
1550         /* Calculate MAXIMUM_ALLOWED_ACCESS if requested. */
1551         if (access_mask & MAXIMUM_ALLOWED_ACCESS) {
1552
1553                 status = smbd_calculate_maximum_allowed_access(
1554                         conn, smb_fname, &access_mask);
1555
1556                 if (!NT_STATUS_IS_OK(status)) {
1557                         return status;
1558                 }
1559
1560                 access_mask &= conn->share_access;
1561         }
1562
1563         rejected_share_access = access_mask & ~(conn->share_access);
1564
1565         if (rejected_share_access) {
1566                 DEBUG(10, ("smbd_calculate_access_mask: Access denied on "
1567                         "file %s: rejected by share access mask[0x%08X] "
1568                         "orig[0x%08X] mapped[0x%08X] reject[0x%08X]\n",
1569                         smb_fname_str_dbg(smb_fname),
1570                         conn->share_access,
1571                         orig_access_mask, access_mask,
1572                         rejected_share_access));
1573                 return NT_STATUS_ACCESS_DENIED;
1574         }
1575
1576         *access_mask_out = access_mask;
1577         return NT_STATUS_OK;
1578 }
1579
1580 /****************************************************************************
1581  Remove the deferred open entry under lock.
1582 ****************************************************************************/
1583
1584 void remove_deferred_open_entry(struct file_id id, uint64_t mid,
1585                                 struct server_id pid)
1586 {
1587         struct share_mode_lock *lck = get_share_mode_lock(talloc_tos(), id);
1588         if (lck == NULL) {
1589                 DEBUG(0, ("could not get share mode lock\n"));
1590                 return;
1591         }
1592         del_deferred_open_entry(lck, mid, pid);
1593         TALLOC_FREE(lck);
1594 }
1595
1596 /****************************************************************
1597  Ensure we get the brlock lock followed by the share mode lock
1598  in the correct order to prevent deadlocks if other smbd's are
1599  using the brlock database on this file simultaneously with this open
1600  (that code also gets the locks in brlock -> share mode lock order).
1601 ****************************************************************/
1602
1603 static bool acquire_ordered_locks(TALLOC_CTX *mem_ctx,
1604                                 files_struct *fsp,
1605                                 const struct file_id id,
1606                                 const char *connectpath,
1607                                 const struct smb_filename *smb_fname,
1608                                 const struct timespec *p_old_write_time,
1609                                 struct share_mode_lock **p_lck,
1610                                 struct byte_range_lock **p_br_lck)
1611 {
1612         /* Ordering - we must get the br_lck for this
1613            file before the share mode. */
1614         if (lp_locking(fsp->conn->params)) {
1615                 *p_br_lck = brl_get_locks_readonly(fsp);
1616                 if (*p_br_lck == NULL) {
1617                         DEBUG(0, ("Could not get br_lock\n"));
1618                         return false;
1619                 }
1620                 /* Note - we don't need to free the returned
1621                    br_lck explicitly as it was allocated on talloc_tos()
1622                    and so will be autofreed (and release the lock)
1623                    once the frame context disappears.
1624
1625                    If it was set to fsp->brlock_rec then it was
1626                    talloc_move'd to hang off the fsp pointer and
1627                    in this case is guarenteed to not be holding the
1628                    lock on the brlock database. */
1629         }
1630
1631         *p_lck = get_share_mode_lock_fresh(
1632                 mem_ctx, id, connectpath, smb_fname, p_old_write_time);
1633
1634         if (*p_lck == NULL) {
1635                 DEBUG(0, ("Could not get share mode lock\n"));
1636                 TALLOC_FREE(*p_br_lck);
1637                 return false;
1638         }
1639         return true;
1640 }
1641
1642 /****************************************************************************
1643  Open a file with a share mode. Passed in an already created files_struct *.
1644 ****************************************************************************/
1645
1646 static NTSTATUS open_file_ntcreate(connection_struct *conn,
1647                             struct smb_request *req,
1648                             uint32 access_mask,         /* access bits (FILE_READ_DATA etc.) */
1649                             uint32 share_access,        /* share constants (FILE_SHARE_READ etc) */
1650                             uint32 create_disposition,  /* FILE_OPEN_IF etc. */
1651                             uint32 create_options,      /* options such as delete on close. */
1652                             uint32 new_dos_attributes,  /* attributes used for new file. */
1653                             int oplock_request,         /* internal Samba oplock codes. */
1654                                                         /* Information (FILE_EXISTS etc.) */
1655                             uint32_t private_flags,     /* Samba specific flags. */
1656                             int *pinfo,
1657                             files_struct *fsp)
1658 {
1659         struct smb_filename *smb_fname = fsp->fsp_name;
1660         int flags=0;
1661         int flags2=0;
1662         bool file_existed = VALID_STAT(smb_fname->st);
1663         bool def_acl = False;
1664         bool posix_open = False;
1665         bool new_file_created = False;
1666         bool clear_ads = false;
1667         NTSTATUS fsp_open = NT_STATUS_ACCESS_DENIED;
1668         mode_t new_unx_mode = (mode_t)0;
1669         mode_t unx_mode = (mode_t)0;
1670         int info;
1671         uint32 existing_dos_attributes = 0;
1672         struct timeval request_time = timeval_zero();
1673         struct share_mode_lock *lck = NULL;
1674         uint32 open_access_mask = access_mask;
1675         NTSTATUS status;
1676         char *parent_dir;
1677
1678         if (conn->printer) {
1679                 /*
1680                  * Printers are handled completely differently.
1681                  * Most of the passed parameters are ignored.
1682                  */
1683
1684                 if (pinfo) {
1685                         *pinfo = FILE_WAS_CREATED;
1686                 }
1687
1688                 DEBUG(10, ("open_file_ntcreate: printer open fname=%s\n",
1689                            smb_fname_str_dbg(smb_fname)));
1690
1691                 if (!req) {
1692                         DEBUG(0,("open_file_ntcreate: printer open without "
1693                                 "an SMB request!\n"));
1694                         return NT_STATUS_INTERNAL_ERROR;
1695                 }
1696
1697                 return print_spool_open(fsp, smb_fname->base_name,
1698                                         req->vuid);
1699         }
1700
1701         if (!parent_dirname(talloc_tos(), smb_fname->base_name, &parent_dir,
1702                             NULL)) {
1703                 return NT_STATUS_NO_MEMORY;
1704         }
1705
1706         if (new_dos_attributes & FILE_FLAG_POSIX_SEMANTICS) {
1707                 posix_open = True;
1708                 unx_mode = (mode_t)(new_dos_attributes & ~FILE_FLAG_POSIX_SEMANTICS);
1709                 new_dos_attributes = 0;
1710         } else {
1711                 /* Windows allows a new file to be created and
1712                    silently removes a FILE_ATTRIBUTE_DIRECTORY
1713                    sent by the client. Do the same. */
1714
1715                 new_dos_attributes &= ~FILE_ATTRIBUTE_DIRECTORY;
1716
1717                 /* We add FILE_ATTRIBUTE_ARCHIVE to this as this mode is only used if the file is
1718                  * created new. */
1719                 unx_mode = unix_mode(conn, new_dos_attributes | FILE_ATTRIBUTE_ARCHIVE,
1720                                      smb_fname, parent_dir);
1721         }
1722
1723         DEBUG(10, ("open_file_ntcreate: fname=%s, dos_attrs=0x%x "
1724                    "access_mask=0x%x share_access=0x%x "
1725                    "create_disposition = 0x%x create_options=0x%x "
1726                    "unix mode=0%o oplock_request=%d private_flags = 0x%x\n",
1727                    smb_fname_str_dbg(smb_fname), new_dos_attributes,
1728                    access_mask, share_access, create_disposition,
1729                    create_options, (unsigned int)unx_mode, oplock_request,
1730                    (unsigned int)private_flags));
1731
1732         if ((req == NULL) && ((oplock_request & INTERNAL_OPEN_ONLY) == 0)) {
1733                 DEBUG(0, ("No smb request but not an internal only open!\n"));
1734                 return NT_STATUS_INTERNAL_ERROR;
1735         }
1736
1737         /*
1738          * Only non-internal opens can be deferred at all
1739          */
1740
1741         if (req) {
1742                 void *ptr;
1743                 if (get_deferred_open_message_state(req,
1744                                 &request_time,
1745                                 &ptr)) {
1746
1747                         struct deferred_open_record *state = (struct deferred_open_record *)ptr;
1748                         /* Remember the absolute time of the original
1749                            request with this mid. We'll use it later to
1750                            see if this has timed out. */
1751
1752                         /* Remove the deferred open entry under lock. */
1753                         remove_deferred_open_entry(
1754                                 state->id, req->mid,
1755                                 messaging_server_id(req->sconn->msg_ctx));
1756
1757                         /* Ensure we don't reprocess this message. */
1758                         remove_deferred_open_message_smb(req->sconn, req->mid);
1759                 }
1760         }
1761
1762         if (!posix_open) {
1763                 new_dos_attributes &= SAMBA_ATTRIBUTES_MASK;
1764                 if (file_existed) {
1765                         existing_dos_attributes = dos_mode(conn, smb_fname);
1766                 }
1767         }
1768
1769         /* ignore any oplock requests if oplocks are disabled */
1770         if (!lp_oplocks(SNUM(conn)) ||
1771             IS_VETO_OPLOCK_PATH(conn, smb_fname->base_name)) {
1772                 /* Mask off everything except the private Samba bits. */
1773                 oplock_request &= SAMBA_PRIVATE_OPLOCK_MASK;
1774         }
1775
1776         /* this is for OS/2 long file names - say we don't support them */
1777         if (!lp_posix_pathnames() && strstr(smb_fname->base_name,".+,;=[].")) {
1778                 /* OS/2 Workplace shell fix may be main code stream in a later
1779                  * release. */
1780                 DEBUG(5,("open_file_ntcreate: OS/2 long filenames are not "
1781                          "supported.\n"));
1782                 if (use_nt_status()) {
1783                         return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1784                 }
1785                 return NT_STATUS_DOS(ERRDOS, ERRcannotopen);
1786         }
1787
1788         switch( create_disposition ) {
1789                 /*
1790                  * Currently we're using FILE_SUPERSEDE as the same as
1791                  * FILE_OVERWRITE_IF but they really are
1792                  * different. FILE_SUPERSEDE deletes an existing file
1793                  * (requiring delete access) then recreates it.
1794                  */
1795                 case FILE_SUPERSEDE:
1796                         /* If file exists replace/overwrite. If file doesn't
1797                          * exist create. */
1798                         flags2 |= (O_CREAT | O_TRUNC);
1799                         clear_ads = true;
1800                         break;
1801
1802                 case FILE_OVERWRITE_IF:
1803                         /* If file exists replace/overwrite. If file doesn't
1804                          * exist create. */
1805                         flags2 |= (O_CREAT | O_TRUNC);
1806                         clear_ads = true;
1807                         break;
1808
1809                 case FILE_OPEN:
1810                         /* If file exists open. If file doesn't exist error. */
1811                         if (!file_existed) {
1812                                 DEBUG(5,("open_file_ntcreate: FILE_OPEN "
1813                                          "requested for file %s and file "
1814                                          "doesn't exist.\n",
1815                                          smb_fname_str_dbg(smb_fname)));
1816                                 errno = ENOENT;
1817                                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1818                         }
1819                         break;
1820
1821                 case FILE_OVERWRITE:
1822                         /* If file exists overwrite. If file doesn't exist
1823                          * error. */
1824                         if (!file_existed) {
1825                                 DEBUG(5,("open_file_ntcreate: FILE_OVERWRITE "
1826                                          "requested for file %s and file "
1827                                          "doesn't exist.\n",
1828                                          smb_fname_str_dbg(smb_fname) ));
1829                                 errno = ENOENT;
1830                                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1831                         }
1832                         flags2 |= O_TRUNC;
1833                         clear_ads = true;
1834                         break;
1835
1836                 case FILE_CREATE:
1837                         /* If file exists error. If file doesn't exist
1838                          * create. */
1839                         if (file_existed) {
1840                                 DEBUG(5,("open_file_ntcreate: FILE_CREATE "
1841                                          "requested for file %s and file "
1842                                          "already exists.\n",
1843                                          smb_fname_str_dbg(smb_fname)));
1844                                 if (S_ISDIR(smb_fname->st.st_ex_mode)) {
1845                                         errno = EISDIR;
1846                                 } else {
1847                                         errno = EEXIST;
1848                                 }
1849                                 return map_nt_error_from_unix(errno);
1850                         }
1851                         flags2 |= (O_CREAT|O_EXCL);
1852                         break;
1853
1854                 case FILE_OPEN_IF:
1855                         /* If file exists open. If file doesn't exist
1856                          * create. */
1857                         flags2 |= O_CREAT;
1858                         break;
1859
1860                 default:
1861                         return NT_STATUS_INVALID_PARAMETER;
1862         }
1863
1864         /* We only care about matching attributes on file exists and
1865          * overwrite. */
1866
1867         if (!posix_open && file_existed && ((create_disposition == FILE_OVERWRITE) ||
1868                              (create_disposition == FILE_OVERWRITE_IF))) {
1869                 if (!open_match_attributes(conn, existing_dos_attributes,
1870                                            new_dos_attributes,
1871                                            smb_fname->st.st_ex_mode,
1872                                            unx_mode, &new_unx_mode)) {
1873                         DEBUG(5,("open_file_ntcreate: attributes missmatch "
1874                                  "for file %s (%x %x) (0%o, 0%o)\n",
1875                                  smb_fname_str_dbg(smb_fname),
1876                                  existing_dos_attributes,
1877                                  new_dos_attributes,
1878                                  (unsigned int)smb_fname->st.st_ex_mode,
1879                                  (unsigned int)unx_mode ));
1880                         errno = EACCES;
1881                         return NT_STATUS_ACCESS_DENIED;
1882                 }
1883         }
1884
1885         status = smbd_calculate_access_mask(conn, smb_fname,
1886                                         access_mask,
1887                                         &access_mask); 
1888         if (!NT_STATUS_IS_OK(status)) {
1889                 DEBUG(10, ("open_file_ntcreate: smbd_calculate_access_mask "
1890                         "on file %s returned %s\n",
1891                         smb_fname_str_dbg(smb_fname), nt_errstr(status)));
1892                 return status;
1893         }
1894
1895         open_access_mask = access_mask;
1896
1897         if ((flags2 & O_TRUNC) || (oplock_request & FORCE_OPLOCK_BREAK_TO_NONE)) {
1898                 open_access_mask |= FILE_WRITE_DATA; /* This will cause oplock breaks. */
1899         }
1900
1901         DEBUG(10, ("open_file_ntcreate: fname=%s, after mapping "
1902                    "access_mask=0x%x\n", smb_fname_str_dbg(smb_fname),
1903                     access_mask));
1904
1905         /*
1906          * Note that we ignore the append flag as append does not
1907          * mean the same thing under DOS and Unix.
1908          */
1909
1910         if ((access_mask & (FILE_WRITE_DATA | FILE_APPEND_DATA)) ||
1911                         (oplock_request & FORCE_OPLOCK_BREAK_TO_NONE)) {
1912                 /* DENY_DOS opens are always underlying read-write on the
1913                    file handle, no matter what the requested access mask
1914                     says. */
1915                 if ((private_flags & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) ||
1916                         access_mask & (FILE_READ_ATTRIBUTES|FILE_READ_DATA|FILE_READ_EA|FILE_EXECUTE)) {
1917                         flags = O_RDWR;
1918                 } else {
1919                         flags = O_WRONLY;
1920                 }
1921         } else {
1922                 flags = O_RDONLY;
1923         }
1924
1925         /*
1926          * Currently we only look at FILE_WRITE_THROUGH for create options.
1927          */
1928
1929 #if defined(O_SYNC)
1930         if ((create_options & FILE_WRITE_THROUGH) && lp_strict_sync(SNUM(conn))) {
1931                 flags2 |= O_SYNC;
1932         }
1933 #endif /* O_SYNC */
1934
1935         if (posix_open && (access_mask & FILE_APPEND_DATA)) {
1936                 flags2 |= O_APPEND;
1937         }
1938
1939         if (!posix_open && !CAN_WRITE(conn)) {
1940                 /*
1941                  * We should really return a permission denied error if either
1942                  * O_CREAT or O_TRUNC are set, but for compatibility with
1943                  * older versions of Samba we just AND them out.
1944                  */
1945                 flags2 &= ~(O_CREAT|O_TRUNC);
1946         }
1947
1948         /*
1949          * Ensure we can't write on a read-only share or file.
1950          */
1951
1952         if (flags != O_RDONLY && file_existed &&
1953             (!CAN_WRITE(conn) || IS_DOS_READONLY(existing_dos_attributes))) {
1954                 DEBUG(5,("open_file_ntcreate: write access requested for "
1955                          "file %s on read only %s\n",
1956                          smb_fname_str_dbg(smb_fname),
1957                          !CAN_WRITE(conn) ? "share" : "file" ));
1958                 errno = EACCES;
1959                 return NT_STATUS_ACCESS_DENIED;
1960         }
1961
1962         fsp->file_id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
1963         fsp->share_access = share_access;
1964         fsp->fh->private_options = private_flags;
1965         fsp->access_mask = open_access_mask; /* We change this to the
1966                                               * requested access_mask after
1967                                               * the open is done. */
1968         fsp->posix_open = posix_open;
1969
1970         /* Ensure no SAMBA_PRIVATE bits can be set. */
1971         fsp->oplock_type = (oplock_request & ~SAMBA_PRIVATE_OPLOCK_MASK);
1972
1973         if (timeval_is_zero(&request_time)) {
1974                 request_time = fsp->open_time;
1975         }
1976
1977         if (file_existed) {
1978                 struct byte_range_lock *br_lck = NULL;
1979                 struct share_mode_entry *batch_entry = NULL;
1980                 struct share_mode_entry *exclusive_entry = NULL;
1981                 bool got_level2_oplock = false;
1982                 bool got_a_none_oplock = false;
1983                 struct file_id id;
1984
1985                 struct timespec old_write_time = smb_fname->st.st_ex_mtime;
1986                 id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
1987
1988                 if (!acquire_ordered_locks(talloc_tos(),
1989                                         fsp,
1990                                         id,
1991                                         conn->connectpath,
1992                                         smb_fname,
1993                                         &old_write_time,
1994                                         &lck,
1995                                         &br_lck)) {
1996                         return NT_STATUS_SHARING_VIOLATION;
1997                 }
1998
1999                 /* Get the types we need to examine. */
2000                 find_oplock_types(fsp,
2001                                 oplock_request,
2002                                 lck,
2003                                 &batch_entry,
2004                                 &exclusive_entry,
2005                                 &got_level2_oplock,
2006                                 &got_a_none_oplock);
2007
2008                 /* First pass - send break only on batch oplocks. */
2009                 if ((req != NULL) &&
2010                                 delay_for_batch_oplocks(fsp,
2011                                         req->mid,
2012                                         oplock_request,
2013                                         batch_entry)) {
2014                         schedule_defer_open(lck, request_time, req);
2015                         TALLOC_FREE(lck);
2016                         return NT_STATUS_SHARING_VIOLATION;
2017                 }
2018
2019                 /* Use the client requested access mask here, not the one we
2020                  * open with. */
2021                 status = open_mode_check(conn, lck, fsp->name_hash,
2022                                         access_mask, share_access,
2023                                          create_options, &file_existed);
2024
2025                 if (NT_STATUS_IS_OK(status)) {
2026                         /* We might be going to allow this open. Check oplock
2027                          * status again. */
2028                         /* Second pass - send break for both batch or
2029                          * exclusive oplocks. */
2030                         if ((req != NULL) &&
2031                                         delay_for_exclusive_oplocks(
2032                                                 fsp,
2033                                                 req->mid,
2034                                                 oplock_request,
2035                                                 exclusive_entry)) {
2036                                 schedule_defer_open(lck, request_time, req);
2037                                 TALLOC_FREE(lck);
2038                                 return NT_STATUS_SHARING_VIOLATION;
2039                         }
2040                 }
2041
2042                 if (NT_STATUS_EQUAL(status, NT_STATUS_DELETE_PENDING)) {
2043                         /* DELETE_PENDING is not deferred for a second */
2044                         TALLOC_FREE(lck);
2045                         return status;
2046                 }
2047
2048                 grant_fsp_oplock_type(fsp,
2049                                 br_lck,
2050                                 oplock_request,
2051                                 got_level2_oplock,
2052                                 got_a_none_oplock);
2053
2054                 if (!NT_STATUS_IS_OK(status)) {
2055                         uint32 can_access_mask;
2056                         bool can_access = True;
2057
2058                         SMB_ASSERT(NT_STATUS_EQUAL(status, NT_STATUS_SHARING_VIOLATION));
2059
2060                         /* Check if this can be done with the deny_dos and fcb
2061                          * calls. */
2062                         if (private_flags &
2063                             (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS|
2064                              NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) {
2065                                 if (req == NULL) {
2066                                         DEBUG(0, ("DOS open without an SMB "
2067                                                   "request!\n"));
2068                                         TALLOC_FREE(lck);
2069                                         return NT_STATUS_INTERNAL_ERROR;
2070                                 }
2071
2072                                 /* Use the client requested access mask here,
2073                                  * not the one we open with. */
2074                                 status = fcb_or_dos_open(req,
2075                                                         conn,
2076                                                         fsp,
2077                                                         smb_fname,
2078                                                         id,
2079                                                         req->smbpid,
2080                                                         req->vuid,
2081                                                         access_mask,
2082                                                         share_access,
2083                                                         create_options);
2084
2085                                 if (NT_STATUS_IS_OK(status)) {
2086                                         TALLOC_FREE(lck);
2087                                         if (pinfo) {
2088                                                 *pinfo = FILE_WAS_OPENED;
2089                                         }
2090                                         return NT_STATUS_OK;
2091                                 }
2092                         }
2093
2094                         /*
2095                          * This next line is a subtlety we need for
2096                          * MS-Access. If a file open will fail due to share
2097                          * permissions and also for security (access) reasons,
2098                          * we need to return the access failed error, not the
2099                          * share error. We can't open the file due to kernel
2100                          * oplock deadlock (it's possible we failed above on
2101                          * the open_mode_check()) so use a userspace check.
2102                          */
2103
2104                         if (flags & O_RDWR) {
2105                                 can_access_mask = FILE_READ_DATA|FILE_WRITE_DATA;
2106                         } else if (flags & O_WRONLY) {
2107                                 can_access_mask = FILE_WRITE_DATA;
2108                         } else {
2109                                 can_access_mask = FILE_READ_DATA;
2110                         }
2111
2112                         if (((can_access_mask & FILE_WRITE_DATA) &&
2113                                 !CAN_WRITE(conn)) ||
2114                                 !NT_STATUS_IS_OK(smbd_check_access_rights(conn,
2115                                                 smb_fname, can_access_mask))) {
2116                                 can_access = False;
2117                         }
2118
2119                         /*
2120                          * If we're returning a share violation, ensure we
2121                          * cope with the braindead 1 second delay.
2122                          */
2123
2124                         if (!(oplock_request & INTERNAL_OPEN_ONLY) &&
2125                             lp_defer_sharing_violations()) {
2126                                 struct timeval timeout;
2127                                 struct deferred_open_record state;
2128                                 int timeout_usecs;
2129
2130                                 /* this is a hack to speed up torture tests
2131                                    in 'make test' */
2132                                 timeout_usecs = lp_parm_int(SNUM(conn),
2133                                                             "smbd","sharedelay",
2134                                                             SHARING_VIOLATION_USEC_WAIT);
2135
2136                                 /* This is a relative time, added to the absolute
2137                                    request_time value to get the absolute timeout time.
2138                                    Note that if this is the second or greater time we enter
2139                                    this codepath for this particular request mid then
2140                                    request_time is left as the absolute time of the *first*
2141                                    time this request mid was processed. This is what allows
2142                                    the request to eventually time out. */
2143
2144                                 timeout = timeval_set(0, timeout_usecs);
2145
2146                                 /* Nothing actually uses state.delayed_for_oplocks
2147                                    but it's handy to differentiate in debug messages
2148                                    between a 30 second delay due to oplock break, and
2149                                    a 1 second delay for share mode conflicts. */
2150
2151                                 state.delayed_for_oplocks = False;
2152                                 state.id = id;
2153
2154                                 if ((req != NULL)
2155                                     && !request_timed_out(request_time,
2156                                                           timeout)) {
2157                                         defer_open(lck, request_time, timeout,
2158                                                    req, &state);
2159                                 }
2160                         }
2161
2162                         TALLOC_FREE(lck);
2163                         if (can_access) {
2164                                 /*
2165                                  * We have detected a sharing violation here
2166                                  * so return the correct error code
2167                                  */
2168                                 status = NT_STATUS_SHARING_VIOLATION;
2169                         } else {
2170                                 status = NT_STATUS_ACCESS_DENIED;
2171                         }
2172                         return status;
2173                 }
2174
2175                 /*
2176                  * We exit this block with the share entry *locked*.....
2177                  */
2178         }
2179
2180         SMB_ASSERT(!file_existed || (lck != NULL));
2181
2182         /*
2183          * Ensure we pay attention to default ACLs on directories if required.
2184          */
2185
2186         if ((flags2 & O_CREAT) && lp_inherit_acls(SNUM(conn)) &&
2187             (def_acl = directory_has_default_acl(conn, parent_dir))) {
2188                 unx_mode = (0777 & lp_create_mask(SNUM(conn)));
2189         }
2190
2191         DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o, "
2192                 "access_mask = 0x%x, open_access_mask = 0x%x\n",
2193                  (unsigned int)flags, (unsigned int)flags2,
2194                  (unsigned int)unx_mode, (unsigned int)access_mask,
2195                  (unsigned int)open_access_mask));
2196
2197         /*
2198          * open_file strips any O_TRUNC flags itself.
2199          */
2200
2201         fsp_open = open_file(fsp, conn, req, parent_dir,
2202                              flags|flags2, unx_mode, access_mask,
2203                              open_access_mask);
2204
2205         if (!NT_STATUS_IS_OK(fsp_open)) {
2206                 TALLOC_FREE(lck);
2207                 return fsp_open;
2208         }
2209
2210         if (!file_existed) {
2211                 struct byte_range_lock *br_lck = NULL;
2212                 struct share_mode_entry *batch_entry = NULL;
2213                 struct share_mode_entry *exclusive_entry = NULL;
2214                 bool got_level2_oplock = false;
2215                 bool got_a_none_oplock = false;
2216                 struct timespec old_write_time = smb_fname->st.st_ex_mtime;
2217                 struct file_id id;
2218                 /*
2219                  * Deal with the race condition where two smbd's detect the
2220                  * file doesn't exist and do the create at the same time. One
2221                  * of them will win and set a share mode, the other (ie. this
2222                  * one) should check if the requested share mode for this
2223                  * create is allowed.
2224                  */
2225
2226                 /*
2227                  * Now the file exists and fsp is successfully opened,
2228                  * fsp->dev and fsp->inode are valid and should replace the
2229                  * dev=0,inode=0 from a non existent file. Spotted by
2230                  * Nadav Danieli <nadavd@exanet.com>. JRA.
2231                  */
2232
2233                 id = fsp->file_id;
2234
2235                 if (!acquire_ordered_locks(talloc_tos(),
2236                                         fsp,
2237                                         id,
2238                                         conn->connectpath,
2239                                         smb_fname,
2240                                         &old_write_time,
2241                                         &lck,
2242                                         &br_lck)) {
2243                         return NT_STATUS_SHARING_VIOLATION;
2244                 }
2245
2246                 /* Get the types we need to examine. */
2247                 find_oplock_types(fsp,
2248                                 oplock_request,
2249                                 lck,
2250                                 &batch_entry,
2251                                 &exclusive_entry,
2252                                 &got_level2_oplock,
2253                                 &got_a_none_oplock);
2254
2255                 /* First pass - send break only on batch oplocks. */
2256                 if ((req != NULL) &&
2257                                 delay_for_batch_oplocks(fsp,
2258                                         req->mid,
2259                                         oplock_request,
2260                                         batch_entry)) {
2261                         schedule_defer_open(lck, request_time, req);
2262                         TALLOC_FREE(lck);
2263                         fd_close(fsp);
2264                         return NT_STATUS_SHARING_VIOLATION;
2265                 }
2266
2267                 status = open_mode_check(conn, lck, fsp->name_hash,
2268                                         access_mask, share_access,
2269                                          create_options, &file_existed);
2270
2271                 if (NT_STATUS_IS_OK(status)) {
2272                         /* We might be going to allow this open. Check oplock
2273                          * status again. */
2274                         /* Second pass - send break for both batch or
2275                          * exclusive oplocks. */
2276                         if ((req != NULL) &&
2277                                         delay_for_exclusive_oplocks(
2278                                                 fsp,
2279                                                 req->mid,
2280                                                 oplock_request,
2281                                                 exclusive_entry)) {
2282                                 schedule_defer_open(lck, request_time, req);
2283                                 TALLOC_FREE(lck);
2284                                 fd_close(fsp);
2285                                 return NT_STATUS_SHARING_VIOLATION;
2286                         }
2287                 }
2288
2289                 if (!NT_STATUS_IS_OK(status)) {
2290                         struct deferred_open_record state;
2291
2292                         state.delayed_for_oplocks = False;
2293                         state.id = id;
2294
2295                         /* Do it all over again immediately. In the second
2296                          * round we will find that the file existed and handle
2297                          * the DELETE_PENDING and FCB cases correctly. No need
2298                          * to duplicate the code here. Essentially this is a
2299                          * "goto top of this function", but don't tell
2300                          * anybody... */
2301
2302                         if (req != NULL) {
2303                                 defer_open(lck, request_time, timeval_zero(),
2304                                            req, &state);
2305                         }
2306                         TALLOC_FREE(lck);
2307                         fd_close(fsp);
2308                         return status;
2309                 }
2310
2311                 grant_fsp_oplock_type(fsp,
2312                                 br_lck,
2313                                 oplock_request,
2314                                 got_level2_oplock,
2315                                 got_a_none_oplock);
2316
2317                 /*
2318                  * We exit this block with the share entry *locked*.....
2319                  */
2320
2321         }
2322
2323         SMB_ASSERT(lck != NULL);
2324
2325         /* Delete streams if create_disposition requires it */
2326         if (file_existed && clear_ads &&
2327             !is_ntfs_stream_smb_fname(smb_fname)) {
2328                 status = delete_all_streams(conn, smb_fname->base_name);
2329                 if (!NT_STATUS_IS_OK(status)) {
2330                         TALLOC_FREE(lck);
2331                         fd_close(fsp);
2332                         return status;
2333                 }
2334         }
2335
2336         /* note that we ignore failure for the following. It is
2337            basically a hack for NFS, and NFS will never set one of
2338            these only read them. Nobody but Samba can ever set a deny
2339            mode and we have already checked our more authoritative
2340            locking database for permission to set this deny mode. If
2341            the kernel refuses the operations then the kernel is wrong.
2342            note that GPFS supports it as well - jmcd */
2343
2344         if (fsp->fh->fd != -1) {
2345                 int ret_flock;
2346                 ret_flock = SMB_VFS_KERNEL_FLOCK(fsp, share_access, access_mask);
2347                 if(ret_flock == -1 ){
2348
2349                         TALLOC_FREE(lck);
2350                         fd_close(fsp);
2351
2352                         return NT_STATUS_SHARING_VIOLATION;
2353                 }
2354         }
2355
2356         /*
2357          * At this point onwards, we can guarentee that the share entry
2358          * is locked, whether we created the file or not, and that the
2359          * deny mode is compatible with all current opens.
2360          */
2361
2362         /*
2363          * If requested, truncate the file.
2364          */
2365
2366         if (file_existed && (flags2&O_TRUNC)) {
2367                 /*
2368                  * We are modifing the file after open - update the stat
2369                  * struct..
2370                  */
2371                 if ((SMB_VFS_FTRUNCATE(fsp, 0) == -1) ||
2372                     (SMB_VFS_FSTAT(fsp, &smb_fname->st)==-1)) {
2373                         status = map_nt_error_from_unix(errno);
2374                         TALLOC_FREE(lck);
2375                         fd_close(fsp);
2376                         return status;
2377                 }
2378         }
2379
2380         /*
2381          * According to Samba4, SEC_FILE_READ_ATTRIBUTE is always granted,
2382          * but we don't have to store this - just ignore it on access check.
2383          */
2384         if (conn->sconn->using_smb2) {
2385                 /*
2386                  * SMB2 doesn't return it (according to Microsoft tests).
2387                  * Test Case: TestSuite_ScenarioNo009GrantedAccessTestS0
2388                  * File created with access = 0x7 (Read, Write, Delete)
2389                  * Query Info on file returns 0x87 (Read, Write, Delete, Read Attributes)
2390                  */
2391                 fsp->access_mask = access_mask;
2392         } else {
2393                 /* But SMB1 does. */
2394                 fsp->access_mask = access_mask | FILE_READ_ATTRIBUTES;
2395         }
2396
2397         if (file_existed) {
2398                 /* stat opens on existing files don't get oplocks. */
2399                 if (is_stat_open(open_access_mask)) {
2400                         fsp->oplock_type = NO_OPLOCK;
2401                 }
2402
2403                 if (flags2 & O_TRUNC) {
2404                         info = FILE_WAS_OVERWRITTEN;
2405                 } else {
2406                         info = FILE_WAS_OPENED;
2407                 }
2408         } else {
2409                 info = FILE_WAS_CREATED;
2410         }
2411
2412         if (pinfo) {
2413                 *pinfo = info;
2414         }
2415
2416         /*
2417          * Setup the oplock info in both the shared memory and
2418          * file structs.
2419          */
2420
2421         if (!set_file_oplock(fsp, fsp->oplock_type)) {
2422                 /*
2423                  * Could not get the kernel oplock or there are byte-range
2424                  * locks on the file.
2425                  */
2426                 fsp->oplock_type = NO_OPLOCK;
2427         }
2428
2429         set_share_mode(lck, fsp, get_current_uid(conn),
2430                         req ? req->mid : 0,
2431                        fsp->oplock_type);
2432
2433         /* Handle strange delete on close create semantics. */
2434         if (create_options & FILE_DELETE_ON_CLOSE) {
2435
2436                 status = can_set_delete_on_close(fsp, new_dos_attributes);
2437
2438                 if (!NT_STATUS_IS_OK(status)) {
2439                         /* Remember to delete the mode we just added. */
2440                         del_share_mode(lck, fsp);
2441                         TALLOC_FREE(lck);
2442                         fd_close(fsp);
2443                         return status;
2444                 }
2445                 /* Note that here we set the *inital* delete on close flag,
2446                    not the regular one. The magic gets handled in close. */
2447                 fsp->initial_delete_on_close = True;
2448         }
2449
2450         if (info == FILE_WAS_OVERWRITTEN
2451             || info == FILE_WAS_CREATED
2452             || info == FILE_WAS_SUPERSEDED) {
2453                 new_file_created = True;
2454         }
2455
2456         if (new_file_created) {
2457                 /* Files should be initially set as archive */
2458                 if (lp_map_archive(SNUM(conn)) ||
2459                     lp_store_dos_attributes(SNUM(conn))) {
2460                         if (!posix_open) {
2461                                 if (file_set_dosmode(conn, smb_fname,
2462                                             new_dos_attributes | FILE_ATTRIBUTE_ARCHIVE,
2463                                             parent_dir, true) == 0) {
2464                                         unx_mode = smb_fname->st.st_ex_mode;
2465                                 }
2466                         }
2467                 }
2468         }
2469
2470         /* Determine sparse flag. */
2471         if (posix_open) {
2472                 /* POSIX opens are sparse by default. */
2473                 fsp->is_sparse = true;
2474         } else {
2475                 fsp->is_sparse = (file_existed &&
2476                         (existing_dos_attributes & FILE_ATTRIBUTE_SPARSE));
2477         }
2478
2479         /*
2480          * Take care of inherited ACLs on created files - if default ACL not
2481          * selected.
2482          */
2483
2484         if (!posix_open && !file_existed && !def_acl) {
2485
2486                 int saved_errno = errno; /* We might get ENOSYS in the next
2487                                           * call.. */
2488
2489                 if (SMB_VFS_FCHMOD_ACL(fsp, unx_mode) == -1 &&
2490                     errno == ENOSYS) {
2491                         errno = saved_errno; /* Ignore ENOSYS */
2492                 }
2493
2494         } else if (new_unx_mode) {
2495
2496                 int ret = -1;
2497
2498                 /* Attributes need changing. File already existed. */
2499
2500                 {
2501                         int saved_errno = errno; /* We might get ENOSYS in the
2502                                                   * next call.. */
2503                         ret = SMB_VFS_FCHMOD_ACL(fsp, new_unx_mode);
2504
2505                         if (ret == -1 && errno == ENOSYS) {
2506                                 errno = saved_errno; /* Ignore ENOSYS */
2507                         } else {
2508                                 DEBUG(5, ("open_file_ntcreate: reset "
2509                                           "attributes of file %s to 0%o\n",
2510                                           smb_fname_str_dbg(smb_fname),
2511                                           (unsigned int)new_unx_mode));
2512                                 ret = 0; /* Don't do the fchmod below. */
2513                         }
2514                 }
2515
2516                 if ((ret == -1) &&
2517                     (SMB_VFS_FCHMOD(fsp, new_unx_mode) == -1))
2518                         DEBUG(5, ("open_file_ntcreate: failed to reset "
2519                                   "attributes of file %s to 0%o\n",
2520                                   smb_fname_str_dbg(smb_fname),
2521                                   (unsigned int)new_unx_mode));
2522         }
2523
2524         /* If this is a successful open, we must remove any deferred open
2525          * records. */
2526         if (req != NULL) {
2527                 del_deferred_open_entry(lck, req->mid,
2528                                         messaging_server_id(req->sconn->msg_ctx));
2529         }
2530         TALLOC_FREE(lck);
2531
2532         return NT_STATUS_OK;
2533 }
2534
2535
2536 /****************************************************************************
2537  Open a file for for write to ensure that we can fchmod it.
2538 ****************************************************************************/
2539
2540 NTSTATUS open_file_fchmod(connection_struct *conn,
2541                           struct smb_filename *smb_fname,
2542                           files_struct **result)
2543 {
2544         if (!VALID_STAT(smb_fname->st)) {
2545                 return NT_STATUS_INVALID_PARAMETER;
2546         }
2547
2548         return SMB_VFS_CREATE_FILE(
2549                 conn,                                   /* conn */
2550                 NULL,                                   /* req */
2551                 0,                                      /* root_dir_fid */
2552                 smb_fname,                              /* fname */
2553                 FILE_WRITE_DATA,                        /* access_mask */
2554                 (FILE_SHARE_READ | FILE_SHARE_WRITE |   /* share_access */
2555                     FILE_SHARE_DELETE),
2556                 FILE_OPEN,                              /* create_disposition*/
2557                 0,                                      /* create_options */
2558                 0,                                      /* file_attributes */
2559                 INTERNAL_OPEN_ONLY,                     /* oplock_request */
2560                 0,                                      /* allocation_size */
2561                 0,                                      /* private_flags */
2562                 NULL,                                   /* sd */
2563                 NULL,                                   /* ea_list */
2564                 result,                                 /* result */
2565                 NULL);                                  /* pinfo */
2566 }
2567
2568 static NTSTATUS mkdir_internal(connection_struct *conn,
2569                                struct smb_filename *smb_dname,
2570                                uint32 file_attributes)
2571 {
2572         mode_t mode;
2573         char *parent_dir = NULL;
2574         NTSTATUS status;
2575         bool posix_open = false;
2576         bool need_re_stat = false;
2577         uint32_t access_mask = SEC_DIR_ADD_SUBDIR;
2578
2579         if(access_mask & ~(conn->share_access)) {
2580                 DEBUG(5,("mkdir_internal: failing share access "
2581                          "%s\n", lp_servicename(SNUM(conn))));
2582                 return NT_STATUS_ACCESS_DENIED;
2583         }
2584
2585         if (!parent_dirname(talloc_tos(), smb_dname->base_name, &parent_dir,
2586                             NULL)) {
2587                 return NT_STATUS_NO_MEMORY;
2588         }
2589
2590         if (file_attributes & FILE_FLAG_POSIX_SEMANTICS) {
2591                 posix_open = true;
2592                 mode = (mode_t)(file_attributes & ~FILE_FLAG_POSIX_SEMANTICS);
2593         } else {
2594                 mode = unix_mode(conn, FILE_ATTRIBUTE_DIRECTORY, smb_dname, parent_dir);
2595         }
2596
2597         status = check_parent_access(conn,
2598                                         smb_dname,
2599                                         access_mask,
2600                                         &parent_dir);
2601         if(!NT_STATUS_IS_OK(status)) {
2602                 DEBUG(5,("mkdir_internal: check_parent_access "
2603                         "on directory %s for path %s returned %s\n",
2604                         parent_dir,
2605                         smb_dname->base_name,
2606                         nt_errstr(status) ));
2607                 return status;
2608         }
2609
2610         if (SMB_VFS_MKDIR(conn, smb_dname->base_name, mode) != 0) {
2611                 return map_nt_error_from_unix(errno);
2612         }
2613
2614         /* Ensure we're checking for a symlink here.... */
2615         /* We don't want to get caught by a symlink racer. */
2616
2617         if (SMB_VFS_LSTAT(conn, smb_dname) == -1) {
2618                 DEBUG(2, ("Could not stat directory '%s' just created: %s\n",
2619                           smb_fname_str_dbg(smb_dname), strerror(errno)));
2620                 return map_nt_error_from_unix(errno);
2621         }
2622
2623         if (!S_ISDIR(smb_dname->st.st_ex_mode)) {
2624                 DEBUG(0, ("Directory '%s' just created is not a directory !\n",
2625                           smb_fname_str_dbg(smb_dname)));
2626                 return NT_STATUS_NOT_A_DIRECTORY;
2627         }
2628
2629         if (lp_store_dos_attributes(SNUM(conn))) {
2630                 if (!posix_open) {
2631                         file_set_dosmode(conn, smb_dname,
2632                                          file_attributes | FILE_ATTRIBUTE_DIRECTORY,
2633                                          parent_dir, true);
2634                 }
2635         }
2636
2637         if (lp_inherit_perms(SNUM(conn))) {
2638                 inherit_access_posix_acl(conn, parent_dir,
2639                                          smb_dname->base_name, mode);
2640                 need_re_stat = true;
2641         }
2642
2643         if (!posix_open) {
2644                 /*
2645                  * Check if high bits should have been set,
2646                  * then (if bits are missing): add them.
2647                  * Consider bits automagically set by UNIX, i.e. SGID bit from parent
2648                  * dir.
2649                  */
2650                 if ((mode & ~(S_IRWXU|S_IRWXG|S_IRWXO)) &&
2651                     (mode & ~smb_dname->st.st_ex_mode)) {
2652                         SMB_VFS_CHMOD(conn, smb_dname->base_name,
2653                                       (smb_dname->st.st_ex_mode |
2654                                           (mode & ~smb_dname->st.st_ex_mode)));
2655                         need_re_stat = true;
2656                 }
2657         }
2658
2659         /* Change the owner if required. */
2660         if (lp_inherit_owner(SNUM(conn))) {
2661                 change_dir_owner_to_parent(conn, parent_dir,
2662                                            smb_dname->base_name,
2663                                            &smb_dname->st);
2664                 need_re_stat = true;
2665         }
2666
2667         if (need_re_stat) {
2668                 if (SMB_VFS_LSTAT(conn, smb_dname) == -1) {
2669                         DEBUG(2, ("Could not stat directory '%s' just created: %s\n",
2670                           smb_fname_str_dbg(smb_dname), strerror(errno)));
2671                         return map_nt_error_from_unix(errno);
2672                 }
2673         }
2674
2675         notify_fname(conn, NOTIFY_ACTION_ADDED, FILE_NOTIFY_CHANGE_DIR_NAME,
2676                      smb_dname->base_name);
2677
2678         return NT_STATUS_OK;
2679 }
2680
2681 /****************************************************************************
2682  Ensure we didn't get symlink raced on opening a directory.
2683 ****************************************************************************/
2684
2685 bool check_same_stat(const SMB_STRUCT_STAT *sbuf1,
2686                         const SMB_STRUCT_STAT *sbuf2)
2687 {
2688         if (sbuf1->st_ex_uid != sbuf2->st_ex_uid ||
2689                         sbuf1->st_ex_gid != sbuf2->st_ex_gid ||
2690                         sbuf1->st_ex_dev != sbuf2->st_ex_dev ||
2691                         sbuf1->st_ex_ino != sbuf2->st_ex_ino) {
2692                 return false;
2693         }
2694         return true;
2695 }
2696
2697 /****************************************************************************
2698  Open a directory from an NT SMB call.
2699 ****************************************************************************/
2700
2701 static NTSTATUS open_directory(connection_struct *conn,
2702                                struct smb_request *req,
2703                                struct smb_filename *smb_dname,
2704                                uint32 access_mask,
2705                                uint32 share_access,
2706                                uint32 create_disposition,
2707                                uint32 create_options,
2708                                uint32 file_attributes,
2709                                int *pinfo,
2710                                files_struct **result)
2711 {
2712         files_struct *fsp = NULL;
2713         bool dir_existed = VALID_STAT(smb_dname->st) ? True : False;
2714         struct share_mode_lock *lck = NULL;
2715         NTSTATUS status;
2716         struct timespec mtimespec;
2717         int info = 0;
2718
2719         SMB_ASSERT(!is_ntfs_stream_smb_fname(smb_dname));
2720
2721         /* Ensure we have a directory attribute. */
2722         file_attributes |= FILE_ATTRIBUTE_DIRECTORY;
2723
2724         DEBUG(5,("open_directory: opening directory %s, access_mask = 0x%x, "
2725                  "share_access = 0x%x create_options = 0x%x, "
2726                  "create_disposition = 0x%x, file_attributes = 0x%x\n",
2727                  smb_fname_str_dbg(smb_dname),
2728                  (unsigned int)access_mask,
2729                  (unsigned int)share_access,
2730                  (unsigned int)create_options,
2731                  (unsigned int)create_disposition,
2732                  (unsigned int)file_attributes));
2733
2734         if (!(file_attributes & FILE_FLAG_POSIX_SEMANTICS) &&
2735                         (conn->fs_capabilities & FILE_NAMED_STREAMS) &&
2736                         is_ntfs_stream_smb_fname(smb_dname)) {
2737                 DEBUG(2, ("open_directory: %s is a stream name!\n",
2738                           smb_fname_str_dbg(smb_dname)));
2739                 return NT_STATUS_NOT_A_DIRECTORY;
2740         }
2741
2742         status = smbd_calculate_access_mask(conn, smb_dname,
2743                                             access_mask, &access_mask);
2744         if (!NT_STATUS_IS_OK(status)) {
2745                 DEBUG(10, ("open_directory: smbd_calculate_access_mask "
2746                         "on file %s returned %s\n",
2747                         smb_fname_str_dbg(smb_dname),
2748                         nt_errstr(status)));
2749                 return status;
2750         }
2751
2752         if ((access_mask & SEC_FLAG_SYSTEM_SECURITY) &&
2753                         !security_token_has_privilege(get_current_nttok(conn),
2754                                         SEC_PRIV_SECURITY)) {
2755                 DEBUG(10, ("open_directory: open on %s "
2756                         "failed - SEC_FLAG_SYSTEM_SECURITY denied.\n",
2757                         smb_fname_str_dbg(smb_dname)));
2758                 return NT_STATUS_PRIVILEGE_NOT_HELD;
2759         }
2760
2761         switch( create_disposition ) {
2762                 case FILE_OPEN:
2763
2764                         if (!dir_existed) {
2765                                 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
2766                         }
2767
2768                         info = FILE_WAS_OPENED;
2769                         break;
2770
2771                 case FILE_CREATE:
2772
2773                         /* If directory exists error. If directory doesn't
2774                          * exist create. */
2775
2776                         if (dir_existed) {
2777                                 status = NT_STATUS_OBJECT_NAME_COLLISION;
2778                                 DEBUG(2, ("open_directory: unable to create "
2779                                           "%s. Error was %s\n",
2780                                           smb_fname_str_dbg(smb_dname),
2781                                           nt_errstr(status)));
2782                                 return status;
2783                         }
2784
2785                         status = mkdir_internal(conn, smb_dname,
2786                                                 file_attributes);
2787
2788                         if (!NT_STATUS_IS_OK(status)) {
2789                                 DEBUG(2, ("open_directory: unable to create "
2790                                           "%s. Error was %s\n",
2791                                           smb_fname_str_dbg(smb_dname),
2792                                           nt_errstr(status)));
2793                                 return status;
2794                         }
2795
2796                         info = FILE_WAS_CREATED;
2797                         break;
2798
2799                 case FILE_OPEN_IF:
2800                         /*
2801                          * If directory exists open. If directory doesn't
2802                          * exist create.
2803                          */
2804
2805                         if (dir_existed) {
2806                                 status = NT_STATUS_OK;
2807                                 info = FILE_WAS_OPENED;
2808                         } else {
2809                                 status = mkdir_internal(conn, smb_dname,
2810                                                 file_attributes);
2811
2812                                 if (NT_STATUS_IS_OK(status)) {
2813                                         info = FILE_WAS_CREATED;
2814                                 } else {
2815                                         /* Cope with create race. */
2816                                         if (!NT_STATUS_EQUAL(status,
2817                                                         NT_STATUS_OBJECT_NAME_COLLISION)) {
2818                                                 DEBUG(2, ("open_directory: unable to create "
2819                                                         "%s. Error was %s\n",
2820                                                         smb_fname_str_dbg(smb_dname),
2821                                                         nt_errstr(status)));
2822                                                 return status;
2823                                         }
2824                                         info = FILE_WAS_OPENED;
2825                                 }
2826                         }
2827
2828                         break;
2829
2830                 case FILE_SUPERSEDE:
2831                 case FILE_OVERWRITE:
2832                 case FILE_OVERWRITE_IF:
2833                 default:
2834                         DEBUG(5,("open_directory: invalid create_disposition "
2835                                  "0x%x for directory %s\n",
2836                                  (unsigned int)create_disposition,
2837                                  smb_fname_str_dbg(smb_dname)));
2838                         return NT_STATUS_INVALID_PARAMETER;
2839         }
2840
2841         if(!S_ISDIR(smb_dname->st.st_ex_mode)) {
2842                 DEBUG(5,("open_directory: %s is not a directory !\n",
2843                          smb_fname_str_dbg(smb_dname)));
2844                 return NT_STATUS_NOT_A_DIRECTORY;
2845         }
2846
2847         if (info == FILE_WAS_OPENED) {
2848                 status = smbd_check_access_rights(conn, smb_dname, access_mask);
2849                 if (!NT_STATUS_IS_OK(status)) {
2850                         DEBUG(10, ("open_directory: smbd_check_access_rights on "
2851                                 "file %s failed with %s\n",
2852                                 smb_fname_str_dbg(smb_dname),
2853                                 nt_errstr(status)));
2854                         return status;
2855                 }
2856         }
2857
2858         status = file_new(req, conn, &fsp);
2859         if(!NT_STATUS_IS_OK(status)) {
2860                 return status;
2861         }
2862
2863         /*
2864          * Setup the files_struct for it.
2865          */
2866
2867         fsp->mode = smb_dname->st.st_ex_mode;
2868         fsp->file_id = vfs_file_id_from_sbuf(conn, &smb_dname->st);
2869         fsp->vuid = req ? req->vuid : UID_FIELD_INVALID;
2870         fsp->file_pid = req ? req->smbpid : 0;
2871         fsp->can_lock = False;
2872         fsp->can_read = False;
2873         fsp->can_write = False;
2874
2875         fsp->share_access = share_access;
2876         fsp->fh->private_options = 0;
2877         /*
2878          * According to Samba4, SEC_FILE_READ_ATTRIBUTE is always granted,
2879          */
2880         fsp->access_mask = access_mask | FILE_READ_ATTRIBUTES;
2881         fsp->print_file = NULL;
2882         fsp->modified = False;
2883         fsp->oplock_type = NO_OPLOCK;
2884         fsp->sent_oplock_break = NO_BREAK_SENT;
2885         fsp->is_directory = True;
2886         fsp->posix_open = (file_attributes & FILE_FLAG_POSIX_SEMANTICS) ? True : False;
2887         status = fsp_set_smb_fname(fsp, smb_dname);
2888         if (!NT_STATUS_IS_OK(status)) {
2889                 file_free(req, fsp);
2890                 return status;
2891         }
2892
2893         mtimespec = smb_dname->st.st_ex_mtime;
2894
2895 #ifdef O_DIRECTORY
2896         status = fd_open(conn, fsp, O_RDONLY|O_DIRECTORY, 0);
2897 #else
2898         /* POSIX allows us to open a directory with O_RDONLY. */
2899         status = fd_open(conn, fsp, O_RDONLY, 0);
2900 #endif
2901         if (!NT_STATUS_IS_OK(status)) {
2902                 DEBUG(5, ("open_directory: Could not open fd for "
2903                         "%s (%s)\n",
2904                         smb_fname_str_dbg(smb_dname),
2905                         nt_errstr(status)));
2906                 file_free(req, fsp);
2907                 return status;
2908         }
2909
2910         status = vfs_stat_fsp(fsp);
2911         if (!NT_STATUS_IS_OK(status)) {
2912                 fd_close(fsp);
2913                 file_free(req, fsp);
2914                 return status;
2915         }
2916
2917         /* Ensure there was no race condition. */
2918         if (!check_same_stat(&smb_dname->st, &fsp->fsp_name->st)) {
2919                 DEBUG(5,("open_directory: stat struct differs for "
2920                         "directory %s.\n",
2921                         smb_fname_str_dbg(smb_dname)));
2922                 fd_close(fsp);
2923                 file_free(req, fsp);
2924                 return NT_STATUS_ACCESS_DENIED;
2925         }
2926
2927         lck = get_share_mode_lock_fresh(talloc_tos(), fsp->file_id,
2928                                         conn->connectpath, smb_dname,
2929                                         &mtimespec);
2930
2931         if (lck == NULL) {
2932                 DEBUG(0, ("open_directory: Could not get share mode lock for "
2933                           "%s\n", smb_fname_str_dbg(smb_dname)));
2934                 fd_close(fsp);
2935                 file_free(req, fsp);
2936                 return NT_STATUS_SHARING_VIOLATION;
2937         }
2938
2939         status = open_mode_check(conn, lck, fsp->name_hash,
2940                                 access_mask, share_access,
2941                                  create_options, &dir_existed);
2942
2943         if (!NT_STATUS_IS_OK(status)) {
2944                 TALLOC_FREE(lck);
2945                 fd_close(fsp);
2946                 file_free(req, fsp);
2947                 return status;
2948         }
2949
2950         set_share_mode(lck, fsp, get_current_uid(conn),
2951                         req ? req->mid : 0, NO_OPLOCK);
2952
2953         /* For directories the delete on close bit at open time seems
2954            always to be honored on close... See test 19 in Samba4 BASE-DELETE. */
2955         if (create_options & FILE_DELETE_ON_CLOSE) {
2956                 status = can_set_delete_on_close(fsp, 0);
2957                 if (!NT_STATUS_IS_OK(status) && !NT_STATUS_EQUAL(status, NT_STATUS_DIRECTORY_NOT_EMPTY)) {
2958                         TALLOC_FREE(lck);
2959                         fd_close(fsp);
2960                         file_free(req, fsp);
2961                         return status;
2962                 }
2963
2964                 if (NT_STATUS_IS_OK(status)) {
2965                         /* Note that here we set the *inital* delete on close flag,
2966                            not the regular one. The magic gets handled in close. */
2967                         fsp->initial_delete_on_close = True;
2968                 }
2969         }
2970
2971         TALLOC_FREE(lck);
2972
2973         if (pinfo) {
2974                 *pinfo = info;
2975         }
2976
2977         *result = fsp;
2978         return NT_STATUS_OK;
2979 }
2980
2981 NTSTATUS create_directory(connection_struct *conn, struct smb_request *req,
2982                           struct smb_filename *smb_dname)
2983 {
2984         NTSTATUS status;
2985         files_struct *fsp;
2986
2987         status = SMB_VFS_CREATE_FILE(
2988                 conn,                                   /* conn */
2989                 req,                                    /* req */
2990                 0,                                      /* root_dir_fid */
2991                 smb_dname,                              /* fname */
2992                 FILE_READ_ATTRIBUTES,                   /* access_mask */
2993                 FILE_SHARE_NONE,                        /* share_access */
2994                 FILE_CREATE,                            /* create_disposition*/
2995                 FILE_DIRECTORY_FILE,                    /* create_options */
2996                 FILE_ATTRIBUTE_DIRECTORY,               /* file_attributes */
2997                 0,                                      /* oplock_request */
2998                 0,                                      /* allocation_size */
2999                 0,                                      /* private_flags */
3000                 NULL,                                   /* sd */
3001                 NULL,                                   /* ea_list */
3002                 &fsp,                                   /* result */
3003                 NULL);                                  /* pinfo */
3004
3005         if (NT_STATUS_IS_OK(status)) {
3006                 close_file(req, fsp, NORMAL_CLOSE);
3007         }
3008
3009         return status;
3010 }
3011
3012 /****************************************************************************
3013  Receive notification that one of our open files has been renamed by another
3014  smbd process.
3015 ****************************************************************************/
3016
3017 void msg_file_was_renamed(struct messaging_context *msg,
3018                           void *private_data,
3019                           uint32_t msg_type,
3020                           struct server_id server_id,
3021                           DATA_BLOB *data)
3022 {
3023         files_struct *fsp;
3024         char *frm = (char *)data->data;
3025         struct file_id id;
3026         const char *sharepath;
3027         const char *base_name;
3028         const char *stream_name;
3029         struct smb_filename *smb_fname = NULL;
3030         size_t sp_len, bn_len;
3031         NTSTATUS status;
3032         struct smbd_server_connection *sconn =
3033                 talloc_get_type_abort(private_data,
3034                 struct smbd_server_connection);
3035
3036         if (data->data == NULL
3037             || data->length < MSG_FILE_RENAMED_MIN_SIZE + 2) {
3038                 DEBUG(0, ("msg_file_was_renamed: Got invalid msg len %d\n",
3039                           (int)data->length));
3040                 return;
3041         }
3042
3043         /* Unpack the message. */
3044         pull_file_id_24(frm, &id);
3045         sharepath = &frm[24];
3046         sp_len = strlen(sharepath);
3047         base_name = sharepath + sp_len + 1;
3048         bn_len = strlen(base_name);
3049         stream_name = sharepath + sp_len + 1 + bn_len + 1;
3050
3051         /* stream_name must always be NULL if there is no stream. */
3052         if (stream_name[0] == '\0') {
3053                 stream_name = NULL;
3054         }
3055
3056         status = create_synthetic_smb_fname(talloc_tos(), base_name,
3057                                             stream_name, NULL, &smb_fname);
3058         if (!NT_STATUS_IS_OK(status)) {
3059                 return;
3060         }
3061
3062         DEBUG(10,("msg_file_was_renamed: Got rename message for sharepath %s, new name %s, "
3063                 "file_id %s\n",
3064                 sharepath, smb_fname_str_dbg(smb_fname),
3065                 file_id_string_tos(&id)));
3066
3067         for(fsp = file_find_di_first(sconn, id); fsp;
3068             fsp = file_find_di_next(fsp)) {
3069                 if (memcmp(fsp->conn->connectpath, sharepath, sp_len) == 0) {
3070
3071                         DEBUG(10,("msg_file_was_renamed: renaming file fnum %d from %s -> %s\n",
3072                                 fsp->fnum, fsp_str_dbg(fsp),
3073                                 smb_fname_str_dbg(smb_fname)));
3074                         status = fsp_set_smb_fname(fsp, smb_fname);
3075                         if (!NT_STATUS_IS_OK(status)) {
3076                                 goto out;
3077                         }
3078                 } else {
3079                         /* TODO. JRA. */
3080                         /* Now we have the complete path we can work out if this is
3081                            actually within this share and adjust newname accordingly. */
3082                         DEBUG(10,("msg_file_was_renamed: share mismatch (sharepath %s "
3083                                 "not sharepath %s) "
3084                                 "fnum %d from %s -> %s\n",
3085                                 fsp->conn->connectpath,
3086                                 sharepath,
3087                                 fsp->fnum,
3088                                 fsp_str_dbg(fsp),
3089                                 smb_fname_str_dbg(smb_fname)));
3090                 }
3091         }
3092  out:
3093         TALLOC_FREE(smb_fname);
3094         return;
3095 }
3096
3097 /*
3098  * If a main file is opened for delete, all streams need to be checked for
3099  * !FILE_SHARE_DELETE. Do this by opening with DELETE_ACCESS.
3100  * If that works, delete them all by setting the delete on close and close.
3101  */
3102
3103 NTSTATUS open_streams_for_delete(connection_struct *conn,
3104                                         const char *fname)
3105 {
3106         struct stream_struct *stream_info = NULL;
3107         files_struct **streams = NULL;
3108         int i;
3109         unsigned int num_streams = 0;
3110         TALLOC_CTX *frame = talloc_stackframe();
3111         NTSTATUS status;
3112
3113         status = vfs_streaminfo(conn, NULL, fname, talloc_tos(),
3114                                 &num_streams, &stream_info);
3115
3116         if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED)
3117             || NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
3118                 DEBUG(10, ("no streams around\n"));
3119                 TALLOC_FREE(frame);
3120                 return NT_STATUS_OK;
3121         }
3122
3123         if (!NT_STATUS_IS_OK(status)) {
3124                 DEBUG(10, ("vfs_streaminfo failed: %s\n",
3125                            nt_errstr(status)));
3126                 goto fail;
3127         }
3128
3129         DEBUG(10, ("open_streams_for_delete found %d streams\n",
3130                    num_streams));
3131
3132         if (num_streams == 0) {
3133                 TALLOC_FREE(frame);
3134                 return NT_STATUS_OK;
3135         }
3136
3137         streams = talloc_array(talloc_tos(), files_struct *, num_streams);
3138         if (streams == NULL) {
3139                 DEBUG(0, ("talloc failed\n"));
3140                 status = NT_STATUS_NO_MEMORY;
3141                 goto fail;
3142         }
3143
3144         for (i=0; i<num_streams; i++) {
3145                 struct smb_filename *smb_fname = NULL;
3146
3147                 if (strequal(stream_info[i].name, "::$DATA")) {
3148                         streams[i] = NULL;
3149                         continue;
3150                 }
3151
3152                 status = create_synthetic_smb_fname(talloc_tos(), fname,
3153                                                     stream_info[i].name,
3154                                                     NULL, &smb_fname);
3155                 if (!NT_STATUS_IS_OK(status)) {
3156                         goto fail;
3157                 }
3158
3159                 if (SMB_VFS_STAT(conn, smb_fname) == -1) {
3160                         DEBUG(10, ("Unable to stat stream: %s\n",
3161                                    smb_fname_str_dbg(smb_fname)));
3162                 }
3163
3164                 status = SMB_VFS_CREATE_FILE(
3165                          conn,                  /* conn */
3166                          NULL,                  /* req */
3167                          0,                     /* root_dir_fid */
3168                          smb_fname,             /* fname */
3169                          DELETE_ACCESS,         /* access_mask */
3170                          (FILE_SHARE_READ |     /* share_access */
3171                              FILE_SHARE_WRITE | FILE_SHARE_DELETE),
3172                          FILE_OPEN,             /* create_disposition*/
3173                          0,                     /* create_options */
3174                          FILE_ATTRIBUTE_NORMAL, /* file_attributes */
3175                          0,                     /* oplock_request */
3176                          0,                     /* allocation_size */
3177                          NTCREATEX_OPTIONS_PRIVATE_STREAM_DELETE, /* private_flags */
3178                          NULL,                  /* sd */
3179                          NULL,                  /* ea_list */
3180                          &streams[i],           /* result */
3181                          NULL);                 /* pinfo */
3182
3183                 if (!NT_STATUS_IS_OK(status)) {
3184                         DEBUG(10, ("Could not open stream %s: %s\n",
3185                                    smb_fname_str_dbg(smb_fname),
3186                                    nt_errstr(status)));
3187
3188                         TALLOC_FREE(smb_fname);
3189                         break;
3190                 }
3191                 TALLOC_FREE(smb_fname);
3192         }
3193
3194         /*
3195          * don't touch the variable "status" beyond this point :-)
3196          */
3197
3198         for (i -= 1 ; i >= 0; i--) {
3199                 if (streams[i] == NULL) {
3200                         continue;
3201                 }
3202
3203                 DEBUG(10, ("Closing stream # %d, %s\n", i,
3204                            fsp_str_dbg(streams[i])));
3205                 close_file(NULL, streams[i], NORMAL_CLOSE);
3206         }
3207
3208  fail:
3209         TALLOC_FREE(frame);
3210         return status;
3211 }
3212
3213 /*********************************************************************
3214  Create a default ACL by inheriting from the parent. If no inheritance
3215  from the parent available, don't set anything. This will leave the actual
3216  permissions the new file or directory already got from the filesystem
3217  as the NT ACL when read.
3218 *********************************************************************/
3219
3220 static NTSTATUS inherit_new_acl(files_struct *fsp)
3221 {
3222         TALLOC_CTX *ctx = talloc_tos();
3223         char *parent_name = NULL;
3224         struct security_descriptor *parent_desc = NULL;
3225         NTSTATUS status = NT_STATUS_OK;
3226         struct security_descriptor *psd = NULL;
3227         struct dom_sid *owner_sid = NULL;
3228         struct dom_sid *group_sid = NULL;
3229         uint32_t security_info_sent = (SECINFO_OWNER | SECINFO_GROUP | SECINFO_DACL);
3230         bool inherit_owner = lp_inherit_owner(SNUM(fsp->conn));
3231         bool inheritable_components = false;
3232         size_t size = 0;
3233
3234         if (!parent_dirname(ctx, fsp->fsp_name->base_name, &parent_name, NULL)) {
3235                 return NT_STATUS_NO_MEMORY;
3236         }
3237
3238         status = SMB_VFS_GET_NT_ACL(fsp->conn,
3239                                 parent_name,
3240                                 (SECINFO_OWNER | SECINFO_GROUP | SECINFO_DACL),
3241                                 &parent_desc);
3242         if (!NT_STATUS_IS_OK(status)) {
3243                 return status;
3244         }
3245
3246         inheritable_components = sd_has_inheritable_components(parent_desc,
3247                                         fsp->is_directory);
3248
3249         if (!inheritable_components && !inherit_owner) {
3250                 /* Nothing to inherit and not setting owner. */
3251                 return NT_STATUS_OK;
3252         }
3253
3254         /* Create an inherited descriptor from the parent. */
3255
3256         if (DEBUGLEVEL >= 10) {
3257                 DEBUG(10,("inherit_new_acl: parent acl for %s is:\n",
3258                         fsp_str_dbg(fsp) ));
3259                 NDR_PRINT_DEBUG(security_descriptor, parent_desc);
3260         }
3261
3262         /* Inherit from parent descriptor if "inherit owner" set. */
3263         if (inherit_owner) {
3264                 owner_sid = parent_desc->owner_sid;
3265                 group_sid = parent_desc->group_sid;
3266         }
3267
3268         if (owner_sid == NULL) {
3269                 owner_sid = &fsp->conn->session_info->security_token->sids[PRIMARY_USER_SID_INDEX];
3270         }
3271         if (group_sid == NULL) {
3272                 group_sid = &fsp->conn->session_info->security_token->sids[PRIMARY_GROUP_SID_INDEX];
3273         }
3274
3275         status = se_create_child_secdesc(ctx,
3276                         &psd,
3277                         &size,
3278                         parent_desc,
3279                         owner_sid,
3280                         group_sid,
3281                         fsp->is_directory);
3282         if (!NT_STATUS_IS_OK(status)) {
3283                 return status;
3284         }
3285
3286         /* If inheritable_components == false,
3287            se_create_child_secdesc()
3288            creates a security desriptor with a NULL dacl
3289            entry, but with SEC_DESC_DACL_PRESENT. We need
3290            to remove that flag. */
3291
3292         if (!inheritable_components) {
3293                 security_info_sent &= ~SECINFO_DACL;
3294                 psd->type &= ~SEC_DESC_DACL_PRESENT;
3295         }
3296
3297         if (DEBUGLEVEL >= 10) {
3298                 DEBUG(10,("inherit_new_acl: child acl for %s is:\n",
3299                         fsp_str_dbg(fsp) ));
3300                 NDR_PRINT_DEBUG(security_descriptor, psd);
3301         }
3302
3303         if (inherit_owner) {
3304                 /* We need to be root to force this. */
3305                 become_root();
3306         }
3307         status = SMB_VFS_FSET_NT_ACL(fsp,
3308                         security_info_sent,
3309                         psd);
3310         if (inherit_owner) {
3311                 unbecome_root();
3312         }
3313         return status;
3314 }
3315
3316 /*
3317  * Wrapper around open_file_ntcreate and open_directory
3318  */
3319
3320 static NTSTATUS create_file_unixpath(connection_struct *conn,
3321                                      struct smb_request *req,
3322                                      struct smb_filename *smb_fname,
3323                                      uint32_t access_mask,
3324                                      uint32_t share_access,
3325                                      uint32_t create_disposition,
3326                                      uint32_t create_options,
3327                                      uint32_t file_attributes,
3328                                      uint32_t oplock_request,
3329                                      uint64_t allocation_size,
3330                                      uint32_t private_flags,
3331                                      struct security_descriptor *sd,
3332                                      struct ea_list *ea_list,
3333
3334                                      files_struct **result,
3335                                      int *pinfo)
3336 {
3337         int info = FILE_WAS_OPENED;
3338         files_struct *base_fsp = NULL;
3339         files_struct *fsp = NULL;
3340         NTSTATUS status;
3341
3342         DEBUG(10,("create_file_unixpath: access_mask = 0x%x "
3343                   "file_attributes = 0x%x, share_access = 0x%x, "
3344                   "create_disposition = 0x%x create_options = 0x%x "
3345                   "oplock_request = 0x%x private_flags = 0x%x "
3346                   "ea_list = 0x%p, sd = 0x%p, "
3347                   "fname = %s\n",
3348                   (unsigned int)access_mask,
3349                   (unsigned int)file_attributes,
3350                   (unsigned int)share_access,
3351                   (unsigned int)create_disposition,
3352                   (unsigned int)create_options,
3353                   (unsigned int)oplock_request,
3354                   (unsigned int)private_flags,
3355                   ea_list, sd, smb_fname_str_dbg(smb_fname)));
3356
3357         if (create_options & FILE_OPEN_BY_FILE_ID) {
3358                 status = NT_STATUS_NOT_SUPPORTED;
3359                 goto fail;
3360         }
3361
3362         if (create_options & NTCREATEX_OPTIONS_INVALID_PARAM_MASK) {
3363                 status = NT_STATUS_INVALID_PARAMETER;
3364                 goto fail;
3365         }
3366
3367         if (req == NULL) {
3368                 oplock_request |= INTERNAL_OPEN_ONLY;
3369         }
3370
3371         if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
3372             && (access_mask & DELETE_ACCESS)
3373             && !is_ntfs_stream_smb_fname(smb_fname)) {
3374                 /*
3375                  * We can't open a file with DELETE access if any of the
3376                  * streams is open without FILE_SHARE_DELETE
3377                  */
3378                 status = open_streams_for_delete(conn, smb_fname->base_name);
3379
3380                 if (!NT_STATUS_IS_OK(status)) {
3381                         goto fail;
3382                 }
3383         }
3384
3385         if ((access_mask & SEC_FLAG_SYSTEM_SECURITY) &&
3386                         !security_token_has_privilege(get_current_nttok(conn),
3387                                         SEC_PRIV_SECURITY)) {
3388                 DEBUG(10, ("create_file_unixpath: open on %s "
3389                         "failed - SEC_FLAG_SYSTEM_SECURITY denied.\n",
3390                         smb_fname_str_dbg(smb_fname)));
3391                 status = NT_STATUS_PRIVILEGE_NOT_HELD;
3392                 goto fail;
3393         }
3394
3395         if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
3396             && is_ntfs_stream_smb_fname(smb_fname)
3397             && (!(private_flags & NTCREATEX_OPTIONS_PRIVATE_STREAM_DELETE))) {
3398                 uint32 base_create_disposition;
3399                 struct smb_filename *smb_fname_base = NULL;
3400
3401                 if (create_options & FILE_DIRECTORY_FILE) {
3402                         status = NT_STATUS_NOT_A_DIRECTORY;
3403                         goto fail;
3404                 }
3405
3406                 switch (create_disposition) {
3407                 case FILE_OPEN:
3408                         base_create_disposition = FILE_OPEN;
3409                         break;
3410                 default:
3411                         base_create_disposition = FILE_OPEN_IF;
3412                         break;
3413                 }
3414
3415                 /* Create an smb_filename with stream_name == NULL. */
3416                 status = create_synthetic_smb_fname(talloc_tos(),
3417                                                     smb_fname->base_name,
3418                                                     NULL, NULL,
3419                                                     &smb_fname_base);
3420                 if (!NT_STATUS_IS_OK(status)) {
3421                         goto fail;
3422                 }
3423
3424                 if (SMB_VFS_STAT(conn, smb_fname_base) == -1) {
3425                         DEBUG(10, ("Unable to stat stream: %s\n",
3426                                    smb_fname_str_dbg(smb_fname_base)));
3427                 }
3428
3429                 /* Open the base file. */
3430                 status = create_file_unixpath(conn, NULL, smb_fname_base, 0,
3431                                               FILE_SHARE_READ
3432                                               | FILE_SHARE_WRITE
3433                                               | FILE_SHARE_DELETE,
3434                                               base_create_disposition,
3435                                               0, 0, 0, 0, 0, NULL, NULL,
3436                                               &base_fsp, NULL);
3437                 TALLOC_FREE(smb_fname_base);
3438
3439                 if (!NT_STATUS_IS_OK(status)) {
3440                         DEBUG(10, ("create_file_unixpath for base %s failed: "
3441                                    "%s\n", smb_fname->base_name,
3442                                    nt_errstr(status)));
3443                         goto fail;
3444                 }
3445                 /* we don't need to low level fd */
3446                 fd_close(base_fsp);
3447         }
3448
3449         /*
3450          * If it's a request for a directory open, deal with it separately.
3451          */
3452
3453         if (create_options & FILE_DIRECTORY_FILE) {
3454
3455                 if (create_options & FILE_NON_DIRECTORY_FILE) {
3456                         status = NT_STATUS_INVALID_PARAMETER;
3457                         goto fail;
3458                 }
3459
3460                 /* Can't open a temp directory. IFS kit test. */
3461                 if (!(file_attributes & FILE_FLAG_POSIX_SEMANTICS) &&
3462                      (file_attributes & FILE_ATTRIBUTE_TEMPORARY)) {
3463                         status = NT_STATUS_INVALID_PARAMETER;
3464                         goto fail;
3465                 }
3466
3467                 /*
3468                  * We will get a create directory here if the Win32
3469                  * app specified a security descriptor in the
3470                  * CreateDirectory() call.
3471                  */
3472
3473                 oplock_request = 0;
3474                 status = open_directory(
3475                         conn, req, smb_fname, access_mask, share_access,
3476                         create_disposition, create_options, file_attributes,
3477                         &info, &fsp);
3478         } else {
3479
3480                 /*
3481                  * Ordinary file case.
3482                  */
3483
3484                 status = file_new(req, conn, &fsp);
3485                 if(!NT_STATUS_IS_OK(status)) {
3486                         goto fail;
3487                 }
3488
3489                 status = fsp_set_smb_fname(fsp, smb_fname);
3490                 if (!NT_STATUS_IS_OK(status)) {
3491                         goto fail;
3492                 }
3493
3494                 /*
3495                  * We're opening the stream element of a base_fsp
3496                  * we already opened. Set up the base_fsp pointer.
3497                  */
3498                 if (base_fsp) {
3499                         fsp->base_fsp = base_fsp;
3500                 }
3501
3502                 status = open_file_ntcreate(conn,
3503                                             req,
3504                                             access_mask,
3505                                             share_access,
3506                                             create_disposition,
3507                                             create_options,
3508                                             file_attributes,
3509                                             oplock_request,
3510                                             private_flags,
3511                                             &info,
3512                                             fsp);
3513
3514                 if(!NT_STATUS_IS_OK(status)) {
3515                         file_free(req, fsp);
3516                         fsp = NULL;
3517                 }
3518
3519                 if (NT_STATUS_EQUAL(status, NT_STATUS_FILE_IS_A_DIRECTORY)) {
3520
3521                         /* A stream open never opens a directory */
3522
3523                         if (base_fsp) {
3524                                 status = NT_STATUS_FILE_IS_A_DIRECTORY;
3525                                 goto fail;
3526                         }
3527
3528                         /*
3529                          * Fail the open if it was explicitly a non-directory
3530                          * file.
3531                          */
3532
3533                         if (create_options & FILE_NON_DIRECTORY_FILE) {
3534                                 status = NT_STATUS_FILE_IS_A_DIRECTORY;
3535                                 goto fail;
3536                         }
3537
3538                         oplock_request = 0;
3539                         status = open_directory(
3540                                 conn, req, smb_fname, access_mask,
3541                                 share_access, create_disposition,
3542                                 create_options, file_attributes,
3543                                 &info, &fsp);
3544                 }
3545         }
3546
3547         if (!NT_STATUS_IS_OK(status)) {
3548                 goto fail;
3549         }
3550
3551         fsp->base_fsp = base_fsp;
3552
3553         if ((ea_list != NULL) &&
3554             ((info == FILE_WAS_CREATED) || (info == FILE_WAS_OVERWRITTEN))) {
3555                 status = set_ea(conn, fsp, fsp->fsp_name, ea_list);
3556                 if (!NT_STATUS_IS_OK(status)) {
3557                         goto fail;
3558                 }
3559         }
3560
3561         if (!fsp->is_directory && S_ISDIR(fsp->fsp_name->st.st_ex_mode)) {
3562                 status = NT_STATUS_ACCESS_DENIED;
3563                 goto fail;
3564         }
3565
3566         /* Save the requested allocation size. */
3567         if ((info == FILE_WAS_CREATED) || (info == FILE_WAS_OVERWRITTEN)) {
3568                 if (allocation_size
3569                     && (allocation_size > fsp->fsp_name->st.st_ex_size)) {
3570                         fsp->initial_allocation_size = smb_roundup(
3571                                 fsp->conn, allocation_size);
3572                         if (fsp->is_directory) {
3573                                 /* Can't set allocation size on a directory. */
3574                                 status = NT_STATUS_ACCESS_DENIED;
3575                                 goto fail;
3576                         }
3577                         if (vfs_allocate_file_space(
3578                                     fsp, fsp->initial_allocation_size) == -1) {
3579                                 status = NT_STATUS_DISK_FULL;
3580                                 goto fail;
3581                         }
3582                 } else {
3583                         fsp->initial_allocation_size = smb_roundup(
3584                                 fsp->conn, (uint64_t)fsp->fsp_name->st.st_ex_size);
3585                 }
3586         }
3587
3588         if ((info == FILE_WAS_CREATED) && lp_nt_acl_support(SNUM(conn)) &&
3589                                 fsp->base_fsp == NULL) {
3590                 if (sd != NULL) {
3591                         /*
3592                          * According to the MS documentation, the only time the security
3593                          * descriptor is applied to the opened file is iff we *created* the
3594                          * file; an existing file stays the same.
3595                          *
3596                          * Also, it seems (from observation) that you can open the file with
3597                          * any access mask but you can still write the sd. We need to override
3598                          * the granted access before we call set_sd
3599                          * Patch for bug #2242 from Tom Lackemann <cessnatomny@yahoo.com>.
3600                          */
3601
3602                         uint32_t sec_info_sent;
3603                         uint32_t saved_access_mask = fsp->access_mask;
3604
3605                         sec_info_sent = get_sec_info(sd);
3606
3607                         fsp->access_mask = FILE_GENERIC_ALL;
3608
3609                         /* Convert all the generic bits. */
3610                         security_acl_map_generic(sd->dacl, &file_generic_mapping);
3611                         security_acl_map_generic(sd->sacl, &file_generic_mapping);
3612
3613                         if (sec_info_sent & (SECINFO_OWNER|
3614                                                 SECINFO_GROUP|
3615                                                 SECINFO_DACL|
3616                                                 SECINFO_SACL)) {
3617                                 status = SMB_VFS_FSET_NT_ACL(fsp, sec_info_sent, sd);
3618                         }
3619
3620                         fsp->access_mask = saved_access_mask;
3621
3622                         if (!NT_STATUS_IS_OK(status)) {
3623                                 goto fail;
3624                         }
3625                 } else if (lp_inherit_acls(SNUM(conn))) {
3626                         /* Inherit from parent. Errors here are not fatal. */
3627                         status = inherit_new_acl(fsp);
3628                         if (!NT_STATUS_IS_OK(status)) {
3629                                 DEBUG(10,("inherit_new_acl: failed for %s with %s\n",
3630                                         fsp_str_dbg(fsp),
3631                                         nt_errstr(status) ));
3632                         }
3633                 }
3634         }
3635
3636         DEBUG(10, ("create_file_unixpath: info=%d\n", info));
3637
3638         *result = fsp;
3639         if (pinfo != NULL) {
3640                 *pinfo = info;
3641         }
3642
3643         smb_fname->st = fsp->fsp_name->st;
3644
3645         return NT_STATUS_OK;
3646
3647  fail:
3648         DEBUG(10, ("create_file_unixpath: %s\n", nt_errstr(status)));
3649
3650         if (fsp != NULL) {
3651                 if (base_fsp && fsp->base_fsp == base_fsp) {
3652                         /*
3653                          * The close_file below will close
3654                          * fsp->base_fsp.
3655                          */
3656                         base_fsp = NULL;
3657                 }
3658                 close_file(req, fsp, ERROR_CLOSE);
3659                 fsp = NULL;
3660         }
3661         if (base_fsp != NULL) {
3662                 close_file(req, base_fsp, ERROR_CLOSE);
3663                 base_fsp = NULL;
3664         }
3665         return status;
3666 }
3667
3668 /*
3669  * Calculate the full path name given a relative fid.
3670  */
3671 NTSTATUS get_relative_fid_filename(connection_struct *conn,
3672                                    struct smb_request *req,
3673                                    uint16_t root_dir_fid,
3674                                    const struct smb_filename *smb_fname,
3675                                    struct smb_filename **smb_fname_out)
3676 {
3677         files_struct *dir_fsp;
3678         char *parent_fname = NULL;
3679         char *new_base_name = NULL;
3680         NTSTATUS status;
3681
3682         if (root_dir_fid == 0 || !smb_fname) {
3683                 status = NT_STATUS_INTERNAL_ERROR;
3684                 goto out;
3685         }
3686
3687         dir_fsp = file_fsp(req, root_dir_fid);
3688
3689         if (dir_fsp == NULL) {
3690                 status = NT_STATUS_INVALID_HANDLE;
3691                 goto out;
3692         }
3693
3694         if (is_ntfs_stream_smb_fname(dir_fsp->fsp_name)) {
3695                 status = NT_STATUS_INVALID_HANDLE;
3696                 goto out;
3697         }
3698
3699         if (!dir_fsp->is_directory) {
3700
3701                 /*
3702                  * Check to see if this is a mac fork of some kind.
3703                  */
3704
3705                 if ((conn->fs_capabilities & FILE_NAMED_STREAMS) &&
3706                     is_ntfs_stream_smb_fname(smb_fname)) {
3707                         status = NT_STATUS_OBJECT_PATH_NOT_FOUND;
3708                         goto out;
3709                 }
3710
3711                 /*
3712                   we need to handle the case when we get a
3713                   relative open relative to a file and the
3714                   pathname is blank - this is a reopen!
3715                   (hint from demyn plantenberg)
3716                 */
3717
3718                 status = NT_STATUS_INVALID_HANDLE;
3719                 goto out;
3720         }
3721
3722         if (ISDOT(dir_fsp->fsp_name->base_name)) {
3723                 /*
3724                  * We're at the toplevel dir, the final file name
3725                  * must not contain ./, as this is filtered out
3726                  * normally by srvstr_get_path and unix_convert
3727                  * explicitly rejects paths containing ./.
3728                  */
3729                 parent_fname = talloc_strdup(talloc_tos(), "");
3730                 if (parent_fname == NULL) {
3731                         status = NT_STATUS_NO_MEMORY;
3732                         goto out;
3733                 }
3734         } else {
3735                 size_t dir_name_len = strlen(dir_fsp->fsp_name->base_name);
3736
3737                 /*
3738                  * Copy in the base directory name.
3739                  */
3740
3741                 parent_fname = talloc_array(talloc_tos(), char,
3742                     dir_name_len+2);
3743                 if (parent_fname == NULL) {
3744                         status = NT_STATUS_NO_MEMORY;
3745                         goto out;
3746                 }
3747                 memcpy(parent_fname, dir_fsp->fsp_name->base_name,
3748                     dir_name_len+1);
3749
3750                 /*
3751                  * Ensure it ends in a '/'.
3752                  * We used TALLOC_SIZE +2 to add space for the '/'.
3753                  */
3754
3755                 if(dir_name_len
3756                     && (parent_fname[dir_name_len-1] != '\\')
3757                     && (parent_fname[dir_name_len-1] != '/')) {
3758                         parent_fname[dir_name_len] = '/';
3759                         parent_fname[dir_name_len+1] = '\0';
3760                 }
3761         }
3762
3763         new_base_name = talloc_asprintf(talloc_tos(), "%s%s", parent_fname,
3764                                         smb_fname->base_name);
3765         if (new_base_name == NULL) {
3766                 status = NT_STATUS_NO_MEMORY;
3767                 goto out;
3768         }
3769
3770         status = filename_convert(req,
3771                                 conn,
3772                                 req->flags2 & FLAGS2_DFS_PATHNAMES,
3773                                 new_base_name,
3774                                 0,
3775                                 NULL,
3776                                 smb_fname_out);
3777         if (!NT_STATUS_IS_OK(status)) {
3778                 goto out;
3779         }
3780
3781  out:
3782         TALLOC_FREE(parent_fname);
3783         TALLOC_FREE(new_base_name);
3784         return status;
3785 }
3786
3787 NTSTATUS create_file_default(connection_struct *conn,
3788                              struct smb_request *req,
3789                              uint16_t root_dir_fid,
3790                              struct smb_filename *smb_fname,
3791                              uint32_t access_mask,
3792                              uint32_t share_access,
3793                              uint32_t create_disposition,
3794                              uint32_t create_options,
3795                              uint32_t file_attributes,
3796                              uint32_t oplock_request,
3797                              uint64_t allocation_size,
3798                              uint32_t private_flags,
3799                              struct security_descriptor *sd,
3800                              struct ea_list *ea_list,
3801                              files_struct **result,
3802                              int *pinfo)
3803 {
3804         int info = FILE_WAS_OPENED;
3805         files_struct *fsp = NULL;
3806         NTSTATUS status;
3807         bool stream_name = false;
3808
3809         DEBUG(10,("create_file: access_mask = 0x%x "
3810                   "file_attributes = 0x%x, share_access = 0x%x, "
3811                   "create_disposition = 0x%x create_options = 0x%x "
3812                   "oplock_request = 0x%x "
3813                   "private_flags = 0x%x "
3814                   "root_dir_fid = 0x%x, ea_list = 0x%p, sd = 0x%p, "
3815                   "fname = %s\n",
3816                   (unsigned int)access_mask,
3817                   (unsigned int)file_attributes,
3818                   (unsigned int)share_access,
3819                   (unsigned int)create_disposition,
3820                   (unsigned int)create_options,
3821                   (unsigned int)oplock_request,
3822                   (unsigned int)private_flags,
3823                   (unsigned int)root_dir_fid,
3824                   ea_list, sd, smb_fname_str_dbg(smb_fname)));
3825
3826         /*
3827          * Calculate the filename from the root_dir_if if necessary.
3828          */
3829
3830         if (root_dir_fid != 0) {
3831                 struct smb_filename *smb_fname_out = NULL;
3832                 status = get_relative_fid_filename(conn, req, root_dir_fid,
3833                                                    smb_fname, &smb_fname_out);
3834                 if (!NT_STATUS_IS_OK(status)) {
3835                         goto fail;
3836                 }
3837                 smb_fname = smb_fname_out;
3838         }
3839
3840         /*
3841          * Check to see if this is a mac fork of some kind.
3842          */
3843
3844         stream_name = is_ntfs_stream_smb_fname(smb_fname);
3845         if (stream_name) {
3846                 enum FAKE_FILE_TYPE fake_file_type;
3847
3848                 fake_file_type = is_fake_file(smb_fname);
3849
3850                 if (fake_file_type != FAKE_FILE_TYPE_NONE) {
3851
3852                         /*
3853                          * Here we go! support for changing the disk quotas
3854                          * --metze
3855                          *
3856                          * We need to fake up to open this MAGIC QUOTA file
3857                          * and return a valid FID.
3858                          *
3859                          * w2k close this file directly after openening xp
3860                          * also tries a QUERY_FILE_INFO on the file and then
3861                          * close it
3862                          */
3863                         status = open_fake_file(req, conn, req->vuid,
3864                                                 fake_file_type, smb_fname,
3865                                                 access_mask, &fsp);
3866                         if (!NT_STATUS_IS_OK(status)) {
3867                                 goto fail;
3868                         }
3869
3870                         ZERO_STRUCT(smb_fname->st);
3871                         goto done;
3872                 }
3873
3874                 if (!(conn->fs_capabilities & FILE_NAMED_STREAMS)) {
3875                         status = NT_STATUS_OBJECT_NAME_NOT_FOUND;
3876                         goto fail;
3877                 }
3878         }
3879
3880         if (stream_name && is_ntfs_default_stream_smb_fname(smb_fname)) {
3881                 int ret;
3882                 smb_fname->stream_name = NULL;
3883                 /* We have to handle this error here. */
3884                 if (create_options & FILE_DIRECTORY_FILE) {
3885                         status = NT_STATUS_NOT_A_DIRECTORY;
3886                         goto fail;
3887                 }
3888                 if (lp_posix_pathnames()) {
3889                         ret = SMB_VFS_LSTAT(conn, smb_fname);
3890                 } else {
3891                         ret = SMB_VFS_STAT(conn, smb_fname);
3892                 }
3893
3894                 if (ret == 0 && VALID_STAT_OF_DIR(smb_fname->st)) {
3895                         status = NT_STATUS_FILE_IS_A_DIRECTORY;
3896                         goto fail;
3897                 }
3898         }
3899
3900         status = create_file_unixpath(
3901                 conn, req, smb_fname, access_mask, share_access,
3902                 create_disposition, create_options, file_attributes,
3903                 oplock_request, allocation_size, private_flags,
3904                 sd, ea_list,
3905                 &fsp, &info);
3906
3907         if (!NT_STATUS_IS_OK(status)) {
3908                 goto fail;
3909         }
3910
3911  done:
3912         DEBUG(10, ("create_file: info=%d\n", info));
3913
3914         *result = fsp;
3915         if (pinfo != NULL) {
3916                 *pinfo = info;
3917         }
3918         return NT_STATUS_OK;
3919
3920  fail:
3921         DEBUG(10, ("create_file: %s\n", nt_errstr(status)));
3922
3923         if (fsp != NULL) {
3924                 close_file(req, fsp, ERROR_CLOSE);
3925                 fsp = NULL;
3926         }
3927         return status;
3928 }