~vcs-imports/samba/main

« back to all changes in this revision

Viewing changes to source/smbd/open.c

  • Committer: jerry
  • Date: 2006-07-14 21:48:39 UTC
  • Revision ID: vcs-imports@canonical.com-20060714214839-586d8c489a8fcead
gutting trunk to move to svn:externals

Show diffs side-by-side

added added

removed removed

Lines of Context:
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 2 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, write to the Free Software
20
 
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
 
*/
22
 
 
23
 
#include "includes.h"
24
 
 
25
 
extern struct generic_mapping file_generic_mapping;
26
 
extern struct current_user current_user;
27
 
extern userdom_struct current_user_info;
28
 
extern uint16 global_smbpid;
29
 
extern BOOL global_client_failed_oplock_break;
30
 
 
31
 
struct deferred_open_record {
32
 
        BOOL delayed_for_oplocks;
33
 
        SMB_DEV_T dev;
34
 
        SMB_INO_T inode;
35
 
};
36
 
 
37
 
/****************************************************************************
38
 
 fd support routines - attempt to do a dos_open.
39
 
****************************************************************************/
40
 
 
41
 
static BOOL fd_open(struct connection_struct *conn,
42
 
                        const char *fname, 
43
 
                        files_struct *fsp,
44
 
                        int flags,
45
 
                        mode_t mode)
46
 
{
47
 
        int sav;
48
 
 
49
 
#ifdef O_NOFOLLOW
50
 
        if (!lp_symlinks(SNUM(conn))) {
51
 
                flags |= O_NOFOLLOW;
52
 
        }
53
 
#endif
54
 
 
55
 
        fsp->fh->fd = SMB_VFS_OPEN(conn,fname,fsp,flags,mode);
56
 
        sav = errno;
57
 
 
58
 
        DEBUG(10,("fd_open: name %s, flags = 0%o mode = 0%o, fd = %d. %s\n",
59
 
                    fname, flags, (int)mode, fsp->fh->fd,
60
 
                (fsp->fh->fd == -1) ? strerror(errno) : "" ));
61
 
 
62
 
        errno = sav;
63
 
        return fsp->fh->fd != -1;
64
 
}
65
 
 
66
 
/****************************************************************************
67
 
 Close the file associated with a fsp.
68
 
****************************************************************************/
69
 
 
70
 
int fd_close(struct connection_struct *conn,
71
 
                files_struct *fsp)
72
 
{
73
 
        if (fsp->fh->fd == -1) {
74
 
                return 0; /* What we used to call a stat open. */
75
 
        }
76
 
        if (fsp->fh->ref_count > 1) {
77
 
                return 0; /* Shared handle. Only close last reference. */
78
 
        }
79
 
        return fd_close_posix(conn, fsp);
80
 
}
81
 
 
82
 
/****************************************************************************
83
 
 Change the ownership of a file to that of the parent directory.
84
 
 Do this by fd if possible.
85
 
****************************************************************************/
86
 
 
87
 
void change_owner_to_parent(connection_struct *conn,
88
 
                                files_struct *fsp,
89
 
                                const char *fname,
90
 
                                SMB_STRUCT_STAT *psbuf)
91
 
{
92
 
        const char *parent_path = parent_dirname(fname);
93
 
        SMB_STRUCT_STAT parent_st;
94
 
        int ret;
95
 
 
96
 
        ret = SMB_VFS_STAT(conn, parent_path, &parent_st);
97
 
        if (ret == -1) {
98
 
                DEBUG(0,("change_owner_to_parent: failed to stat parent "
99
 
                         "directory %s. Error was %s\n",
100
 
                         parent_path, strerror(errno) ));
101
 
                return;
102
 
        }
103
 
 
104
 
        if (fsp && fsp->fh->fd != -1) {
105
 
                become_root();
106
 
                ret = SMB_VFS_FCHOWN(fsp, fsp->fh->fd, parent_st.st_uid, (gid_t)-1);
107
 
                unbecome_root();
108
 
                if (ret == -1) {
109
 
                        DEBUG(0,("change_owner_to_parent: failed to fchown "
110
 
                                 "file %s to parent directory uid %u. Error "
111
 
                                 "was %s\n", fname,
112
 
                                 (unsigned int)parent_st.st_uid,
113
 
                                 strerror(errno) ));
114
 
                }
115
 
 
116
 
                DEBUG(10,("change_owner_to_parent: changed new file %s to "
117
 
                          "parent directory uid %u.\n", fname,
118
 
                          (unsigned int)parent_st.st_uid ));
119
 
 
120
 
        } else {
121
 
                /* We've already done an lstat into psbuf, and we know it's a
122
 
                   directory. If we can cd into the directory and the dev/ino
123
 
                   are the same then we can safely chown without races as
124
 
                   we're locking the directory in place by being in it.  This
125
 
                   should work on any UNIX (thanks tridge :-). JRA.
126
 
                */
127
 
 
128
 
                pstring saved_dir;
129
 
                SMB_STRUCT_STAT sbuf;
130
 
 
131
 
                if (!vfs_GetWd(conn,saved_dir)) {
132
 
                        DEBUG(0,("change_owner_to_parent: failed to get "
133
 
                                 "current working directory\n"));
134
 
                        return;
135
 
                }
136
 
 
137
 
                /* Chdir into the new path. */
138
 
                if (vfs_ChDir(conn, fname) == -1) {
139
 
                        DEBUG(0,("change_owner_to_parent: failed to change "
140
 
                                 "current working directory to %s. Error "
141
 
                                 "was %s\n", fname, strerror(errno) ));
142
 
                        goto out;
143
 
                }
144
 
 
145
 
                if (SMB_VFS_STAT(conn,".",&sbuf) == -1) {
146
 
                        DEBUG(0,("change_owner_to_parent: failed to stat "
147
 
                                 "directory '.' (%s) Error was %s\n",
148
 
                                 fname, strerror(errno)));
149
 
                        goto out;
150
 
                }
151
 
 
152
 
                /* Ensure we're pointing at the same place. */
153
 
                if (sbuf.st_dev != psbuf->st_dev ||
154
 
                    sbuf.st_ino != psbuf->st_ino ||
155
 
                    sbuf.st_mode != psbuf->st_mode ) {
156
 
                        DEBUG(0,("change_owner_to_parent: "
157
 
                                 "device/inode/mode on directory %s changed. "
158
 
                                 "Refusing to chown !\n", fname ));
159
 
                        goto out;
160
 
                }
161
 
 
162
 
                become_root();
163
 
                ret = SMB_VFS_CHOWN(conn, ".", parent_st.st_uid, (gid_t)-1);
164
 
                unbecome_root();
165
 
                if (ret == -1) {
166
 
                        DEBUG(10,("change_owner_to_parent: failed to chown "
167
 
                                  "directory %s to parent directory uid %u. "
168
 
                                  "Error was %s\n", fname,
169
 
                                  (unsigned int)parent_st.st_uid, strerror(errno) ));
170
 
                        goto out;
171
 
                }
172
 
 
173
 
                DEBUG(10,("change_owner_to_parent: changed ownership of new "
174
 
                          "directory %s to parent directory uid %u.\n",
175
 
                          fname, (unsigned int)parent_st.st_uid ));
176
 
 
177
 
  out:
178
 
 
179
 
                vfs_ChDir(conn,saved_dir);
180
 
        }
181
 
}
182
 
 
183
 
/****************************************************************************
184
 
 Open a file.
185
 
****************************************************************************/
186
 
 
187
 
static NTSTATUS open_file(files_struct *fsp,
188
 
                        connection_struct *conn,
189
 
                        const char *fname,
190
 
                        SMB_STRUCT_STAT *psbuf,
191
 
                        int flags,
192
 
                        mode_t unx_mode,
193
 
                        uint32 access_mask)
194
 
{
195
 
        int accmode = (flags & O_ACCMODE);
196
 
        int local_flags = flags;
197
 
        BOOL file_existed = VALID_STAT(*psbuf);
198
 
 
199
 
        fsp->fh->fd = -1;
200
 
        errno = EPERM;
201
 
 
202
 
        /* Check permissions */
203
 
 
204
 
        /*
205
 
         * This code was changed after seeing a client open request 
206
 
         * containing the open mode of (DENY_WRITE/read-only) with
207
 
         * the 'create if not exist' bit set. The previous code
208
 
         * would fail to open the file read only on a read-only share
209
 
         * as it was checking the flags parameter  directly against O_RDONLY,
210
 
         * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
211
 
         * JRA.
212
 
         */
213
 
 
214
 
        if (!CAN_WRITE(conn)) {
215
 
                /* It's a read-only share - fail if we wanted to write. */
216
 
                if(accmode != O_RDONLY) {
217
 
                        DEBUG(3,("Permission denied opening %s\n",fname));
218
 
                        return NT_STATUS_ACCESS_DENIED;
219
 
                } else if(flags & O_CREAT) {
220
 
                        /* We don't want to write - but we must make sure that
221
 
                           O_CREAT doesn't create the file if we have write
222
 
                           access into the directory.
223
 
                        */
224
 
                        flags &= ~O_CREAT;
225
 
                        local_flags &= ~O_CREAT;
226
 
                }
227
 
        }
228
 
 
229
 
        /*
230
 
         * This little piece of insanity is inspired by the
231
 
         * fact that an NT client can open a file for O_RDONLY,
232
 
         * but set the create disposition to FILE_EXISTS_TRUNCATE.
233
 
         * If the client *can* write to the file, then it expects to
234
 
         * truncate the file, even though it is opening for readonly.
235
 
         * Quicken uses this stupid trick in backup file creation...
236
 
         * Thanks *greatly* to "David W. Chapman Jr." <dwcjr@inethouston.net>
237
 
         * for helping track this one down. It didn't bite us in 2.0.x
238
 
         * as we always opened files read-write in that release. JRA.
239
 
         */
240
 
 
241
 
        if ((accmode == O_RDONLY) && ((flags & O_TRUNC) == O_TRUNC)) {
242
 
                DEBUG(10,("open_file: truncate requested on read-only open "
243
 
                          "for file %s\n",fname ));
244
 
                local_flags = (flags & ~O_ACCMODE)|O_RDWR;
245
 
        }
246
 
 
247
 
        if ((access_mask & (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_EXECUTE)) ||
248
 
            (local_flags & O_CREAT) ||
249
 
            ((local_flags & O_TRUNC) == O_TRUNC) ) {
250
 
 
251
 
                /*
252
 
                 * We can't actually truncate here as the file may be locked.
253
 
                 * open_file_ntcreate will take care of the truncate later. JRA.
254
 
                 */
255
 
 
256
 
                local_flags &= ~O_TRUNC;
257
 
 
258
 
#if defined(O_NONBLOCK) && defined(S_ISFIFO)
259
 
                /*
260
 
                 * We would block on opening a FIFO with no one else on the
261
 
                 * other end. Do what we used to do and add O_NONBLOCK to the
262
 
                 * open flags. JRA.
263
 
                 */
264
 
 
265
 
                if (file_existed && S_ISFIFO(psbuf->st_mode)) {
266
 
                        local_flags |= O_NONBLOCK;
267
 
                }
268
 
#endif
269
 
 
270
 
                /* Don't create files with Microsoft wildcard characters. */
271
 
                if ((local_flags & O_CREAT) && !file_existed &&
272
 
                    ms_has_wild(fname))  {
273
 
                        return NT_STATUS_OBJECT_NAME_INVALID;
274
 
                }
275
 
 
276
 
                /* Actually do the open */
277
 
                if (!fd_open(conn, fname, fsp, local_flags, unx_mode)) {
278
 
                        DEBUG(3,("Error opening file %s (%s) (local_flags=%d) "
279
 
                                 "(flags=%d)\n",
280
 
                                 fname,strerror(errno),local_flags,flags));
281
 
                        return map_nt_error_from_unix(errno);
282
 
                }
283
 
 
284
 
                /* Inherit the ACL if the file was created. */
285
 
                if ((local_flags & O_CREAT) && !file_existed) {
286
 
                        inherit_access_acl(conn, fname, unx_mode);
287
 
                }
288
 
 
289
 
        } else {
290
 
                fsp->fh->fd = -1; /* What we used to call a stat open. */
291
 
        }
292
 
 
293
 
        if (!file_existed) {
294
 
                int ret;
295
 
 
296
 
                if (fsp->fh->fd == -1) {
297
 
                        ret = SMB_VFS_STAT(conn, fname, psbuf);
298
 
                } else {
299
 
                        ret = SMB_VFS_FSTAT(fsp,fsp->fh->fd,psbuf);
300
 
                        /* If we have an fd, this stat should succeed. */
301
 
                        if (ret == -1) {
302
 
                                DEBUG(0,("Error doing fstat on open file %s "
303
 
                                         "(%s)\n", fname,strerror(errno) ));
304
 
                        }
305
 
                }
306
 
 
307
 
                /* For a non-io open, this stat failing means file not found. JRA */
308
 
                if (ret == -1) {
309
 
                        NTSTATUS status = map_nt_error_from_unix(errno);
310
 
                        fd_close(conn, fsp);
311
 
                        return status;
312
 
                }
313
 
        }
314
 
 
315
 
        /*
316
 
         * POSIX allows read-only opens of directories. We don't
317
 
         * want to do this (we use a different code path for this)
318
 
         * so catch a directory open and return an EISDIR. JRA.
319
 
         */
320
 
 
321
 
        if(S_ISDIR(psbuf->st_mode)) {
322
 
                fd_close(conn, fsp);
323
 
                errno = EISDIR;
324
 
                return NT_STATUS_FILE_IS_A_DIRECTORY;
325
 
        }
326
 
 
327
 
        fsp->mode = psbuf->st_mode;
328
 
        fsp->inode = psbuf->st_ino;
329
 
        fsp->dev = psbuf->st_dev;
330
 
        fsp->vuid = current_user.vuid;
331
 
        fsp->file_pid = global_smbpid;
332
 
        fsp->can_lock = True;
333
 
        fsp->can_read = (access_mask & (FILE_READ_DATA)) ? True : False;
334
 
        if (!CAN_WRITE(conn)) {
335
 
                fsp->can_write = False;
336
 
        } else {
337
 
                fsp->can_write = (access_mask & (FILE_WRITE_DATA | FILE_APPEND_DATA)) ? True : False;
338
 
        }
339
 
        fsp->print_file = False;
340
 
        fsp->modified = False;
341
 
        fsp->sent_oplock_break = NO_BREAK_SENT;
342
 
        fsp->is_directory = False;
343
 
        fsp->is_stat = False;
344
 
        if (conn->aio_write_behind_list &&
345
 
            is_in_path(fname, conn->aio_write_behind_list, conn->case_sensitive)) {
346
 
                fsp->aio_write_behind = True;
347
 
        }
348
 
 
349
 
        string_set(&fsp->fsp_name,fname);
350
 
        fsp->wcp = NULL; /* Write cache pointer. */
351
 
 
352
 
        DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
353
 
                 *current_user_info.smb_name ? current_user_info.smb_name : conn->user,fsp->fsp_name,
354
 
                 BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
355
 
                 conn->num_files_open + 1));
356
 
 
357
 
        errno = 0;
358
 
        return NT_STATUS_OK;
359
 
}
360
 
 
361
 
/*******************************************************************
362
 
 Return True if the filename is one of the special executable types.
363
 
********************************************************************/
364
 
 
365
 
static BOOL is_executable(const char *fname)
366
 
{
367
 
        if ((fname = strrchr_m(fname,'.'))) {
368
 
                if (strequal(fname,".com") ||
369
 
                    strequal(fname,".dll") ||
370
 
                    strequal(fname,".exe") ||
371
 
                    strequal(fname,".sym")) {
372
 
                        return True;
373
 
                }
374
 
        }
375
 
        return False;
376
 
}
377
 
 
378
 
/****************************************************************************
379
 
 Check if we can open a file with a share mode.
380
 
 Returns True if conflict, False if not.
381
 
****************************************************************************/
382
 
 
383
 
static BOOL share_conflict(struct share_mode_entry *entry,
384
 
                           uint32 access_mask,
385
 
                           uint32 share_access)
386
 
{
387
 
        DEBUG(10,("share_conflict: entry->access_mask = 0x%x, "
388
 
                  "entry->share_access = 0x%x, "
389
 
                  "entry->private_options = 0x%x\n",
390
 
                  (unsigned int)entry->access_mask,
391
 
                  (unsigned int)entry->share_access,
392
 
                  (unsigned int)entry->private_options));
393
 
 
394
 
        DEBUG(10,("share_conflict: access_mask = 0x%x, share_access = 0x%x\n",
395
 
                  (unsigned int)access_mask, (unsigned int)share_access));
396
 
 
397
 
        if ((entry->access_mask & (FILE_WRITE_DATA|
398
 
                                   FILE_APPEND_DATA|
399
 
                                   FILE_READ_DATA|
400
 
                                   FILE_EXECUTE|
401
 
                                   DELETE_ACCESS)) == 0) {
402
 
                DEBUG(10,("share_conflict: No conflict due to "
403
 
                          "entry->access_mask = 0x%x\n",
404
 
                          (unsigned int)entry->access_mask ));
405
 
                return False;
406
 
        }
407
 
 
408
 
        if ((access_mask & (FILE_WRITE_DATA|
409
 
                            FILE_APPEND_DATA|
410
 
                            FILE_READ_DATA|
411
 
                            FILE_EXECUTE|
412
 
                            DELETE_ACCESS)) == 0) {
413
 
                DEBUG(10,("share_conflict: No conflict due to "
414
 
                          "access_mask = 0x%x\n",
415
 
                          (unsigned int)access_mask ));
416
 
                return False;
417
 
        }
418
 
 
419
 
#if 1 /* JRA TEST - Superdebug. */
420
 
#define CHECK_MASK(num, am, right, sa, share) \
421
 
        DEBUG(10,("share_conflict: [%d] am (0x%x) & right (0x%x) = 0x%x\n", \
422
 
                (unsigned int)(num), (unsigned int)(am), \
423
 
                (unsigned int)(right), (unsigned int)(am)&(right) )); \
424
 
        DEBUG(10,("share_conflict: [%d] sa (0x%x) & share (0x%x) = 0x%x\n", \
425
 
                (unsigned int)(num), (unsigned int)(sa), \
426
 
                (unsigned int)(share), (unsigned int)(sa)&(share) )); \
427
 
        if (((am) & (right)) && !((sa) & (share))) { \
428
 
                DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
429
 
sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
430
 
                        (unsigned int)(share) )); \
431
 
                return True; \
432
 
        }
433
 
#else
434
 
#define CHECK_MASK(num, am, right, sa, share) \
435
 
        if (((am) & (right)) && !((sa) & (share))) { \
436
 
                DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
437
 
sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
438
 
                        (unsigned int)(share) )); \
439
 
                return True; \
440
 
        }
441
 
#endif
442
 
 
443
 
        CHECK_MASK(1, entry->access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
444
 
                   share_access, FILE_SHARE_WRITE);
445
 
        CHECK_MASK(2, access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
446
 
                   entry->share_access, FILE_SHARE_WRITE);
447
 
        
448
 
        CHECK_MASK(3, entry->access_mask, FILE_READ_DATA | FILE_EXECUTE,
449
 
                   share_access, FILE_SHARE_READ);
450
 
        CHECK_MASK(4, access_mask, FILE_READ_DATA | FILE_EXECUTE,
451
 
                   entry->share_access, FILE_SHARE_READ);
452
 
 
453
 
        CHECK_MASK(5, entry->access_mask, DELETE_ACCESS,
454
 
                   share_access, FILE_SHARE_DELETE);
455
 
        CHECK_MASK(6, access_mask, DELETE_ACCESS,
456
 
                   entry->share_access, FILE_SHARE_DELETE);
457
 
 
458
 
        DEBUG(10,("share_conflict: No conflict.\n"));
459
 
        return False;
460
 
}
461
 
 
462
 
#if defined(DEVELOPER)
463
 
static void validate_my_share_entries(int num,
464
 
                                      struct share_mode_entry *share_entry)
465
 
{
466
 
        files_struct *fsp;
467
 
 
468
 
        if (!procid_is_me(&share_entry->pid)) {
469
 
                return;
470
 
        }
471
 
 
472
 
        if (is_deferred_open_entry(share_entry) &&
473
 
            !open_was_deferred(share_entry->op_mid)) {
474
 
                pstring str;
475
 
                DEBUG(0, ("Got a deferred entry without a request: "
476
 
                          "PANIC: %s\n", share_mode_str(num, share_entry)));
477
 
                smb_panic(str);
478
 
        }
479
 
 
480
 
        if (!is_valid_share_mode_entry(share_entry)) {
481
 
                return;
482
 
        }
483
 
 
484
 
        fsp = file_find_dif(share_entry->dev, share_entry->inode,
485
 
                            share_entry->share_file_id);
486
 
        if (!fsp) {
487
 
                DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
488
 
                         share_mode_str(num, share_entry) ));
489
 
                smb_panic("validate_my_share_entries: Cannot match a "
490
 
                          "share entry with an open file\n");
491
 
        }
492
 
 
493
 
        if (is_deferred_open_entry(share_entry) ||
494
 
            is_unused_share_mode_entry(share_entry)) {
495
 
                goto panic;
496
 
        }
497
 
 
498
 
        if ((share_entry->op_type == NO_OPLOCK) &&
499
 
            (fsp->oplock_type == FAKE_LEVEL_II_OPLOCK)) {
500
 
                /* Someone has already written to it, but I haven't yet
501
 
                 * noticed */
502
 
                return;
503
 
        }
504
 
 
505
 
        if (((uint16)fsp->oplock_type) != share_entry->op_type) {
506
 
                goto panic;
507
 
        }
508
 
 
509
 
        return;
510
 
 
511
 
 panic:
512
 
        {
513
 
                pstring str;
514
 
                DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
515
 
                         share_mode_str(num, share_entry) ));
516
 
                slprintf(str, sizeof(str)-1, "validate_my_share_entries: "
517
 
                         "file %s, oplock_type = 0x%x, op_type = 0x%x\n",
518
 
                         fsp->fsp_name, (unsigned int)fsp->oplock_type,
519
 
                         (unsigned int)share_entry->op_type );
520
 
                smb_panic(str);
521
 
        }
522
 
}
523
 
#endif
524
 
 
525
 
static BOOL is_stat_open(uint32 access_mask)
526
 
{
527
 
        return (access_mask &&
528
 
                ((access_mask & ~(SYNCHRONIZE_ACCESS| FILE_READ_ATTRIBUTES|
529
 
                                  FILE_WRITE_ATTRIBUTES))==0) &&
530
 
                ((access_mask & (SYNCHRONIZE_ACCESS|FILE_READ_ATTRIBUTES|
531
 
                                 FILE_WRITE_ATTRIBUTES)) != 0));
532
 
}
533
 
 
534
 
/****************************************************************************
535
 
 Deal with share modes
536
 
 Invarient: Share mode must be locked on entry and exit.
537
 
 Returns -1 on error, or number of share modes on success (may be zero).
538
 
****************************************************************************/
539
 
 
540
 
static NTSTATUS open_mode_check(connection_struct *conn,
541
 
                                const char *fname,
542
 
                                struct share_mode_lock *lck,
543
 
                                uint32 access_mask,
544
 
                                uint32 share_access,
545
 
                                uint32 create_options,
546
 
                                BOOL *file_existed)
547
 
{
548
 
        int i;
549
 
 
550
 
        if(lck->num_share_modes == 0) {
551
 
                return NT_STATUS_OK;
552
 
        }
553
 
 
554
 
        *file_existed = True;
555
 
        
556
 
        if (is_stat_open(access_mask)) {
557
 
                /* Stat open that doesn't trigger oplock breaks or share mode
558
 
                 * checks... ! JRA. */
559
 
                return NT_STATUS_OK;
560
 
        }
561
 
 
562
 
        /* A delete on close prohibits everything */
563
 
 
564
 
        if (lck->delete_on_close) {
565
 
                return NT_STATUS_DELETE_PENDING;
566
 
        }
567
 
 
568
 
        /*
569
 
         * Check if the share modes will give us access.
570
 
         */
571
 
        
572
 
#if defined(DEVELOPER)
573
 
        for(i = 0; i < lck->num_share_modes; i++) {
574
 
                validate_my_share_entries(i, &lck->share_modes[i]);
575
 
        }
576
 
#endif
577
 
 
578
 
        if (!lp_share_modes(SNUM(conn))) {
579
 
                return NT_STATUS_OK;
580
 
        }
581
 
 
582
 
        /* Now we check the share modes, after any oplock breaks. */
583
 
        for(i = 0; i < lck->num_share_modes; i++) {
584
 
 
585
 
                if (!is_valid_share_mode_entry(&lck->share_modes[i])) {
586
 
                        continue;
587
 
                }
588
 
 
589
 
                /* someone else has a share lock on it, check to see if we can
590
 
                 * too */
591
 
                if (share_conflict(&lck->share_modes[i],
592
 
                                   access_mask, share_access)) {
593
 
                        return NT_STATUS_SHARING_VIOLATION;
594
 
                }
595
 
        }
596
 
        
597
 
        return NT_STATUS_OK;
598
 
}
599
 
 
600
 
static BOOL is_delete_request(files_struct *fsp) {
601
 
        return ((fsp->access_mask == DELETE_ACCESS) &&
602
 
                (fsp->oplock_type == NO_OPLOCK));
603
 
}
604
 
 
605
 
/*
606
 
 * 1) No files open at all or internal open: Grant whatever the client wants.
607
 
 *
608
 
 * 2) Exclusive (or batch) oplock around: If the requested access is a delete
609
 
 *    request, break if the oplock around is a batch oplock. If it's another
610
 
 *    requested access type, break.
611
 
 * 
612
 
 * 3) Only level2 around: Grant level2 and do nothing else.
613
 
 */
614
 
 
615
 
static BOOL delay_for_oplocks(struct share_mode_lock *lck,
616
 
                                files_struct *fsp,
617
 
                                int pass_number,
618
 
                                int oplock_request)
619
 
{
620
 
        int i;
621
 
        struct share_mode_entry *exclusive = NULL;
622
 
        BOOL valid_entry = False;
623
 
        BOOL delay_it = False;
624
 
        BOOL have_level2 = False;
625
 
 
626
 
        if ((oplock_request & INTERNAL_OPEN_ONLY) || is_stat_open(fsp->access_mask)) {
627
 
                fsp->oplock_type = NO_OPLOCK;
628
 
                return False;
629
 
        }
630
 
 
631
 
        for (i=0; i<lck->num_share_modes; i++) {
632
 
 
633
 
                if (!is_valid_share_mode_entry(&lck->share_modes[i])) {
634
 
                        continue;
635
 
                }
636
 
 
637
 
                /* At least one entry is not an invalid or deferred entry. */
638
 
                valid_entry = True;
639
 
 
640
 
                if (pass_number == 1) {
641
 
                        if (BATCH_OPLOCK_TYPE(lck->share_modes[i].op_type)) {
642
 
                                SMB_ASSERT(exclusive == NULL);                  
643
 
                                exclusive = &lck->share_modes[i];
644
 
                        }
645
 
                } else {
646
 
                        if (EXCLUSIVE_OPLOCK_TYPE(lck->share_modes[i].op_type)) {
647
 
                                SMB_ASSERT(exclusive == NULL);                  
648
 
                                exclusive = &lck->share_modes[i];
649
 
                        }
650
 
                }
651
 
 
652
 
                if (lck->share_modes[i].op_type == LEVEL_II_OPLOCK) {
653
 
                        SMB_ASSERT(exclusive == NULL);                  
654
 
                        have_level2 = True;
655
 
                }
656
 
        }
657
 
 
658
 
        if (!valid_entry) {
659
 
                /* All entries are placeholders or deferred.
660
 
                 * Directly grant whatever the client wants. */
661
 
                if (fsp->oplock_type == NO_OPLOCK) {
662
 
                        /* Store a level2 oplock, but don't tell the client */
663
 
                        fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
664
 
                }
665
 
                return False;
666
 
        }
667
 
 
668
 
        if (exclusive != NULL) { /* Found an exclusive oplock */
669
 
                SMB_ASSERT(!have_level2);
670
 
                delay_it = is_delete_request(fsp) ?
671
 
                        BATCH_OPLOCK_TYPE(exclusive->op_type) : True;
672
 
        }
673
 
 
674
 
        if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
675
 
                /* We can at most grant level2 as there are other
676
 
                 * level2 or NO_OPLOCK entries. */
677
 
                fsp->oplock_type = LEVEL_II_OPLOCK;
678
 
        }
679
 
 
680
 
        if ((fsp->oplock_type == NO_OPLOCK) && have_level2) {
681
 
                /* Store a level2 oplock, but don't tell the client */
682
 
                fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
683
 
        }
684
 
 
685
 
        if (delay_it) {
686
 
                BOOL ret;
687
 
                char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
688
 
 
689
 
                DEBUG(10, ("Sending break request to PID %s\n",
690
 
                           procid_str_static(&exclusive->pid)));
691
 
                exclusive->op_mid = get_current_mid();
692
 
 
693
 
                /* Create the message. */
694
 
                share_mode_entry_to_message(msg, exclusive);
695
 
 
696
 
                /* Add in the FORCE_OPLOCK_BREAK_TO_NONE bit in the message if set. We don't
697
 
                   want this set in the share mode struct pointed to by lck. */
698
 
 
699
 
                if (oplock_request & FORCE_OPLOCK_BREAK_TO_NONE) {
700
 
                        SSVAL(msg,6,exclusive->op_type | FORCE_OPLOCK_BREAK_TO_NONE);
701
 
                }
702
 
 
703
 
                become_root();
704
 
                ret = message_send_pid(exclusive->pid, MSG_SMB_BREAK_REQUEST,
705
 
                                       msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
706
 
                unbecome_root();
707
 
                if (!ret) {
708
 
                        DEBUG(3, ("Could not send oplock break message\n"));
709
 
                }
710
 
        }
711
 
 
712
 
        return delay_it;
713
 
}
714
 
 
715
 
static BOOL request_timed_out(struct timeval request_time,
716
 
                              struct timeval timeout)
717
 
{
718
 
        struct timeval now, end_time;
719
 
        GetTimeOfDay(&now);
720
 
        end_time = timeval_sum(&request_time, &timeout);
721
 
        return (timeval_compare(&end_time, &now) < 0);
722
 
}
723
 
 
724
 
/****************************************************************************
725
 
 Handle the 1 second delay in returning a SHARING_VIOLATION error.
726
 
****************************************************************************/
727
 
 
728
 
static void defer_open(struct share_mode_lock *lck,
729
 
                       struct timeval request_time,
730
 
                       struct timeval timeout,
731
 
                       struct deferred_open_record *state)
732
 
{
733
 
        uint16 mid = get_current_mid();
734
 
        int i;
735
 
 
736
 
        /* Paranoia check */
737
 
 
738
 
        for (i=0; i<lck->num_share_modes; i++) {
739
 
                struct share_mode_entry *e = &lck->share_modes[i];
740
 
 
741
 
                if (!is_deferred_open_entry(e)) {
742
 
                        continue;
743
 
                }
744
 
 
745
 
                if (procid_is_me(&e->pid) && (e->op_mid == mid)) {
746
 
                        DEBUG(0, ("Trying to defer an already deferred "
747
 
                                  "request: mid=%d, exiting\n", mid));
748
 
                        exit_server("attempt to defer a deferred request");
749
 
                }
750
 
        }
751
 
 
752
 
        /* End paranoia check */
753
 
 
754
 
        DEBUG(10,("defer_open_sharing_error: time [%u.%06u] adding deferred "
755
 
                  "open entry for mid %u\n",
756
 
                  (unsigned int)request_time.tv_sec,
757
 
                  (unsigned int)request_time.tv_usec,
758
 
                  (unsigned int)mid));
759
 
 
760
 
        if (!push_deferred_smb_message(mid, request_time, timeout,
761
 
                                       (char *)state, sizeof(*state))) {
762
 
                exit_server("push_deferred_smb_message failed");
763
 
        }
764
 
        add_deferred_open(lck, mid, request_time, state->dev, state->inode);
765
 
 
766
 
        /*
767
 
         * Push the MID of this packet on the signing queue.
768
 
         * We only do this once, the first time we push the packet
769
 
         * onto the deferred open queue, as this has a side effect
770
 
         * of incrementing the response sequence number.
771
 
         */
772
 
 
773
 
        srv_defer_sign_response(mid);
774
 
}
775
 
 
776
 
/****************************************************************************
777
 
 Set a kernel flock on a file for NFS interoperability.
778
 
 This requires a patch to Linux.
779
 
****************************************************************************/
780
 
 
781
 
static void kernel_flock(files_struct *fsp, uint32 share_mode)
782
 
{
783
 
#if HAVE_KERNEL_SHARE_MODES
784
 
        int kernel_mode = 0;
785
 
        if (share_mode == FILE_SHARE_WRITE) {
786
 
                kernel_mode = LOCK_MAND|LOCK_WRITE;
787
 
        } else if (share_mode == FILE_SHARE_READ) {
788
 
                kernel_mode = LOCK_MAND|LOCK_READ;
789
 
        } else if (share_mode == FILE_SHARE_NONE) {
790
 
                kernel_mode = LOCK_MAND;
791
 
        }
792
 
        if (kernel_mode) {
793
 
                flock(fsp->fh->fd, kernel_mode);
794
 
        }
795
 
#endif
796
 
        ;
797
 
}
798
 
 
799
 
/****************************************************************************
800
 
 On overwrite open ensure that the attributes match.
801
 
****************************************************************************/
802
 
 
803
 
static BOOL open_match_attributes(connection_struct *conn,
804
 
                                const char *path,
805
 
                                uint32 old_dos_attr,
806
 
                                uint32 new_dos_attr,
807
 
                                mode_t existing_unx_mode,
808
 
                                mode_t new_unx_mode,
809
 
                                mode_t *returned_unx_mode)
810
 
{
811
 
        uint32 noarch_old_dos_attr, noarch_new_dos_attr;
812
 
 
813
 
        noarch_old_dos_attr = (old_dos_attr & ~FILE_ATTRIBUTE_ARCHIVE);
814
 
        noarch_new_dos_attr = (new_dos_attr & ~FILE_ATTRIBUTE_ARCHIVE);
815
 
 
816
 
        if((noarch_old_dos_attr == 0 && noarch_new_dos_attr != 0) || 
817
 
           (noarch_old_dos_attr != 0 && ((noarch_old_dos_attr & noarch_new_dos_attr) == noarch_old_dos_attr))) {
818
 
                *returned_unx_mode = new_unx_mode;
819
 
        } else {
820
 
                *returned_unx_mode = (mode_t)0;
821
 
        }
822
 
 
823
 
        DEBUG(10,("open_match_attributes: file %s old_dos_attr = 0x%x, "
824
 
                  "existing_unx_mode = 0%o, new_dos_attr = 0x%x "
825
 
                  "returned_unx_mode = 0%o\n",
826
 
                  path,
827
 
                  (unsigned int)old_dos_attr,
828
 
                  (unsigned int)existing_unx_mode,
829
 
                  (unsigned int)new_dos_attr,
830
 
                  (unsigned int)*returned_unx_mode ));
831
 
 
832
 
        /* If we're mapping SYSTEM and HIDDEN ensure they match. */
833
 
        if (lp_map_system(SNUM(conn)) || lp_store_dos_attributes(SNUM(conn))) {
834
 
                if ((old_dos_attr & FILE_ATTRIBUTE_SYSTEM) &&
835
 
                    !(new_dos_attr & FILE_ATTRIBUTE_SYSTEM)) {
836
 
                        return False;
837
 
                }
838
 
        }
839
 
        if (lp_map_hidden(SNUM(conn)) || lp_store_dos_attributes(SNUM(conn))) {
840
 
                if ((old_dos_attr & FILE_ATTRIBUTE_HIDDEN) &&
841
 
                    !(new_dos_attr & FILE_ATTRIBUTE_HIDDEN)) {
842
 
                        return False;
843
 
                }
844
 
        }
845
 
        return True;
846
 
}
847
 
 
848
 
/****************************************************************************
849
 
 Special FCB or DOS processing in the case of a sharing violation.
850
 
 Try and find a duplicated file handle.
851
 
****************************************************************************/
852
 
 
853
 
static files_struct *fcb_or_dos_open(connection_struct *conn,
854
 
                                     const char *fname, SMB_DEV_T dev,
855
 
                                     SMB_INO_T inode,
856
 
                                     uint32 access_mask,
857
 
                                     uint32 share_access,
858
 
                                     uint32 create_options)
859
 
{
860
 
        files_struct *fsp;
861
 
        files_struct *dup_fsp;
862
 
 
863
 
        DEBUG(5,("fcb_or_dos_open: attempting old open semantics for "
864
 
                 "file %s.\n", fname ));
865
 
 
866
 
        for(fsp = file_find_di_first(dev, inode); fsp;
867
 
            fsp = file_find_di_next(fsp)) {
868
 
 
869
 
                DEBUG(10,("fcb_or_dos_open: checking file %s, fd = %d, "
870
 
                          "vuid = %u, file_pid = %u, private_options = 0x%x "
871
 
                          "access_mask = 0x%x\n", fsp->fsp_name,
872
 
                          fsp->fh->fd, (unsigned int)fsp->vuid,
873
 
                          (unsigned int)fsp->file_pid,
874
 
                          (unsigned int)fsp->fh->private_options,
875
 
                          (unsigned int)fsp->access_mask ));
876
 
 
877
 
                if (fsp->fh->fd != -1 &&
878
 
                    fsp->vuid == current_user.vuid &&
879
 
                    fsp->file_pid == global_smbpid &&
880
 
                    (fsp->fh->private_options & (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS |
881
 
                                                 NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) &&
882
 
                    (fsp->access_mask & FILE_WRITE_DATA) &&
883
 
                    strequal(fsp->fsp_name, fname)) {
884
 
                        DEBUG(10,("fcb_or_dos_open: file match\n"));
885
 
                        break;
886
 
                }
887
 
        }
888
 
 
889
 
        if (!fsp) {
890
 
                return NULL;
891
 
        }
892
 
 
893
 
        /* quite an insane set of semantics ... */
894
 
        if (is_executable(fname) &&
895
 
            (fsp->fh->private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS)) {
896
 
                DEBUG(10,("fcb_or_dos_open: file fail due to is_executable.\n"));
897
 
                return NULL;
898
 
        }
899
 
 
900
 
        /* We need to duplicate this fsp. */
901
 
        if (!NT_STATUS_IS_OK(dup_file_fsp(fsp, access_mask, share_access,
902
 
                                          create_options, &dup_fsp))) {
903
 
                return NULL;
904
 
        }
905
 
 
906
 
        return dup_fsp;
907
 
}
908
 
 
909
 
/****************************************************************************
910
 
 Open a file with a share mode - old openX method - map into NTCreate.
911
 
****************************************************************************/
912
 
 
913
 
BOOL map_open_params_to_ntcreate(const char *fname, int deny_mode, int open_func,
914
 
                                uint32 *paccess_mask,
915
 
                                uint32 *pshare_mode,
916
 
                                uint32 *pcreate_disposition,
917
 
                                uint32 *pcreate_options)
918
 
{
919
 
        uint32 access_mask;
920
 
        uint32 share_mode;
921
 
        uint32 create_disposition;
922
 
        uint32 create_options = 0;
923
 
 
924
 
        DEBUG(10,("map_open_params_to_ntcreate: fname = %s, deny_mode = 0x%x, "
925
 
                  "open_func = 0x%x\n",
926
 
                  fname, (unsigned int)deny_mode, (unsigned int)open_func ));
927
 
 
928
 
        /* Create the NT compatible access_mask. */
929
 
        switch (GET_OPENX_MODE(deny_mode)) {
930
 
                case DOS_OPEN_EXEC: /* Implies read-only - used to be FILE_READ_DATA */
931
 
                case DOS_OPEN_RDONLY:
932
 
                        access_mask = FILE_GENERIC_READ;
933
 
                        break;
934
 
                case DOS_OPEN_WRONLY:
935
 
                        access_mask = FILE_GENERIC_WRITE;
936
 
                        break;
937
 
                case DOS_OPEN_RDWR:
938
 
                case DOS_OPEN_FCB:
939
 
                        access_mask = FILE_GENERIC_READ|FILE_GENERIC_WRITE;
940
 
                        break;
941
 
                default:
942
 
                        DEBUG(10,("map_open_params_to_ntcreate: bad open mode = 0x%x\n",
943
 
                                  (unsigned int)GET_OPENX_MODE(deny_mode)));
944
 
                        return False;
945
 
        }
946
 
 
947
 
        /* Create the NT compatible create_disposition. */
948
 
        switch (open_func) {
949
 
                case OPENX_FILE_EXISTS_FAIL|OPENX_FILE_CREATE_IF_NOT_EXIST:
950
 
                        create_disposition = FILE_CREATE;
951
 
                        break;
952
 
 
953
 
                case OPENX_FILE_EXISTS_OPEN:
954
 
                        create_disposition = FILE_OPEN;
955
 
                        break;
956
 
 
957
 
                case OPENX_FILE_EXISTS_OPEN|OPENX_FILE_CREATE_IF_NOT_EXIST:
958
 
                        create_disposition = FILE_OPEN_IF;
959
 
                        break;
960
 
       
961
 
                case OPENX_FILE_EXISTS_TRUNCATE:
962
 
                        create_disposition = FILE_OVERWRITE;
963
 
                        break;
964
 
 
965
 
                case OPENX_FILE_EXISTS_TRUNCATE|OPENX_FILE_CREATE_IF_NOT_EXIST:
966
 
                        create_disposition = FILE_OVERWRITE_IF;
967
 
                        break;
968
 
 
969
 
                default:
970
 
                        /* From samba4 - to be confirmed. */
971
 
                        if (GET_OPENX_MODE(deny_mode) == DOS_OPEN_EXEC) {
972
 
                                create_disposition = FILE_CREATE;
973
 
                                break;
974
 
                        }
975
 
                        DEBUG(10,("map_open_params_to_ntcreate: bad "
976
 
                                  "open_func 0x%x\n", (unsigned int)open_func));
977
 
                        return False;
978
 
        }
979
 
 
980
 
        /* Create the NT compatible share modes. */
981
 
        switch (GET_DENY_MODE(deny_mode)) {
982
 
                case DENY_ALL:
983
 
                        share_mode = FILE_SHARE_NONE;
984
 
                        break;
985
 
 
986
 
                case DENY_WRITE:
987
 
                        share_mode = FILE_SHARE_READ;
988
 
                        break;
989
 
 
990
 
                case DENY_READ:
991
 
                        share_mode = FILE_SHARE_WRITE;
992
 
                        break;
993
 
 
994
 
                case DENY_NONE:
995
 
                        share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;
996
 
                        break;
997
 
 
998
 
                case DENY_DOS:
999
 
                        create_options |= NTCREATEX_OPTIONS_PRIVATE_DENY_DOS;
1000
 
                        if (is_executable(fname)) {
1001
 
                                share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;
1002
 
                        } else {
1003
 
                                if (GET_OPENX_MODE(deny_mode) == DOS_OPEN_RDONLY) {
1004
 
                                        share_mode = FILE_SHARE_READ;
1005
 
                                } else {
1006
 
                                        share_mode = FILE_SHARE_NONE;
1007
 
                                }
1008
 
                        }
1009
 
                        break;
1010
 
 
1011
 
                case DENY_FCB:
1012
 
                        create_options |= NTCREATEX_OPTIONS_PRIVATE_DENY_FCB;
1013
 
                        share_mode = FILE_SHARE_NONE;
1014
 
                        break;
1015
 
 
1016
 
                default:
1017
 
                        DEBUG(10,("map_open_params_to_ntcreate: bad deny_mode 0x%x\n",
1018
 
                                (unsigned int)GET_DENY_MODE(deny_mode) ));
1019
 
                        return False;
1020
 
        }
1021
 
 
1022
 
        DEBUG(10,("map_open_params_to_ntcreate: file %s, access_mask = 0x%x, "
1023
 
                  "share_mode = 0x%x, create_disposition = 0x%x, "
1024
 
                  "create_options = 0x%x\n",
1025
 
                  fname,
1026
 
                  (unsigned int)access_mask,
1027
 
                  (unsigned int)share_mode,
1028
 
                  (unsigned int)create_disposition,
1029
 
                  (unsigned int)create_options ));
1030
 
 
1031
 
        if (paccess_mask) {
1032
 
                *paccess_mask = access_mask;
1033
 
        }
1034
 
        if (pshare_mode) {
1035
 
                *pshare_mode = share_mode;
1036
 
        }
1037
 
        if (pcreate_disposition) {
1038
 
                *pcreate_disposition = create_disposition;
1039
 
        }
1040
 
        if (pcreate_options) {
1041
 
                *pcreate_options = create_options;
1042
 
        }
1043
 
 
1044
 
        return True;
1045
 
 
1046
 
}
1047
 
 
1048
 
static void schedule_defer_open(struct share_mode_lock *lck, struct timeval request_time)
1049
 
{
1050
 
        struct deferred_open_record state;
1051
 
 
1052
 
        /* This is a relative time, added to the absolute
1053
 
           request_time value to get the absolute timeout time.
1054
 
           Note that if this is the second or greater time we enter
1055
 
           this codepath for this particular request mid then
1056
 
           request_time is left as the absolute time of the *first*
1057
 
           time this request mid was processed. This is what allows
1058
 
           the request to eventually time out. */
1059
 
 
1060
 
        struct timeval timeout;
1061
 
 
1062
 
        /* Normally the smbd we asked should respond within
1063
 
         * OPLOCK_BREAK_TIMEOUT seconds regardless of whether
1064
 
         * the client did, give twice the timeout as a safety
1065
 
         * measure here in case the other smbd is stuck
1066
 
         * somewhere else. */
1067
 
 
1068
 
        timeout = timeval_set(OPLOCK_BREAK_TIMEOUT*2, 0);
1069
 
 
1070
 
        /* Nothing actually uses state.delayed_for_oplocks
1071
 
           but it's handy to differentiate in debug messages
1072
 
           between a 30 second delay due to oplock break, and
1073
 
           a 1 second delay for share mode conflicts. */
1074
 
 
1075
 
        state.delayed_for_oplocks = True;
1076
 
        state.dev = lck->dev;
1077
 
        state.inode = lck->ino;
1078
 
 
1079
 
        if (!request_timed_out(request_time, timeout)) {
1080
 
                defer_open(lck, request_time, timeout, &state);
1081
 
        }
1082
 
}
1083
 
 
1084
 
/****************************************************************************
1085
 
 Open a file with a share mode.
1086
 
****************************************************************************/
1087
 
 
1088
 
NTSTATUS open_file_ntcreate(connection_struct *conn,
1089
 
                                 const char *fname,
1090
 
                                 SMB_STRUCT_STAT *psbuf,
1091
 
                                 uint32 access_mask,            /* access bits (FILE_READ_DATA etc.) */
1092
 
                                 uint32 share_access,           /* share constants (FILE_SHARE_READ etc). */
1093
 
                                 uint32 create_disposition,     /* FILE_OPEN_IF etc. */
1094
 
                                 uint32 create_options,         /* options such as delete on close. */
1095
 
                                 uint32 new_dos_attributes,     /* attributes used for new file. */
1096
 
                                 int oplock_request,            /* internal Samba oplock codes. */
1097
 
                                                                /* Information (FILE_EXISTS etc.) */
1098
 
                                 int *pinfo,
1099
 
                                 files_struct **result)
1100
 
{
1101
 
        int flags=0;
1102
 
        int flags2=0;
1103
 
        BOOL file_existed = VALID_STAT(*psbuf);
1104
 
        BOOL def_acl = False;
1105
 
        SMB_DEV_T dev = 0;
1106
 
        SMB_INO_T inode = 0;
1107
 
        NTSTATUS fsp_open = NT_STATUS_ACCESS_DENIED;
1108
 
        files_struct *fsp = NULL;
1109
 
        mode_t new_unx_mode = (mode_t)0;
1110
 
        mode_t unx_mode = (mode_t)0;
1111
 
        int info;
1112
 
        uint32 existing_dos_attributes = 0;
1113
 
        struct pending_message_list *pml = NULL;
1114
 
        uint16 mid = get_current_mid();
1115
 
        struct timeval request_time = timeval_zero();
1116
 
        struct share_mode_lock *lck = NULL;
1117
 
        NTSTATUS status;
1118
 
 
1119
 
        if (conn->printer) {
1120
 
                /* 
1121
 
                 * Printers are handled completely differently.
1122
 
                 * Most of the passed parameters are ignored.
1123
 
                 */
1124
 
 
1125
 
                if (pinfo) {
1126
 
                        *pinfo = FILE_WAS_CREATED;
1127
 
                }
1128
 
 
1129
 
                DEBUG(10, ("open_file_ntcreate: printer open fname=%s\n", fname));
1130
 
 
1131
 
                return print_fsp_open(conn, fname, &fsp);
1132
 
        }
1133
 
 
1134
 
        /* We add aARCH to this as this mode is only used if the file is
1135
 
         * created new. */
1136
 
        unx_mode = unix_mode(conn, new_dos_attributes | aARCH,fname, True);
1137
 
 
1138
 
        DEBUG(10, ("open_file_ntcreate: fname=%s, dos_attrs=0x%x "
1139
 
                   "access_mask=0x%x share_access=0x%x "
1140
 
                   "create_disposition = 0x%x create_options=0x%x "
1141
 
                   "unix mode=0%o oplock_request=%d\n",
1142
 
                   fname, new_dos_attributes, access_mask, share_access,
1143
 
                   create_disposition, create_options, unx_mode,
1144
 
                   oplock_request));
1145
 
 
1146
 
        if ((pml = get_open_deferred_message(mid)) != NULL) {
1147
 
                struct deferred_open_record *state =
1148
 
                        (struct deferred_open_record *)pml->private_data.data;
1149
 
 
1150
 
                /* Remember the absolute time of the original
1151
 
                   request with this mid. We'll use it later to
1152
 
                   see if this has timed out. */
1153
 
 
1154
 
                request_time = pml->request_time;
1155
 
 
1156
 
                /* Remove the deferred open entry under lock. */
1157
 
                lck = get_share_mode_lock(NULL, state->dev, state->inode, NULL, NULL);
1158
 
                if (lck == NULL) {
1159
 
                        DEBUG(0, ("could not get share mode lock\n"));
1160
 
                } else {
1161
 
                        del_deferred_open_entry(lck, mid);
1162
 
                        TALLOC_FREE(lck);
1163
 
                }
1164
 
 
1165
 
                /* Ensure we don't reprocess this message. */
1166
 
                remove_deferred_open_smb_message(mid);
1167
 
        }
1168
 
 
1169
 
        if (!check_name(fname,conn)) {
1170
 
                return map_nt_error_from_unix(errno);
1171
 
        } 
1172
 
 
1173
 
        new_dos_attributes &= SAMBA_ATTRIBUTES_MASK;
1174
 
        if (file_existed) {
1175
 
                existing_dos_attributes = dos_mode(conn, fname, psbuf);
1176
 
        }
1177
 
 
1178
 
        /* ignore any oplock requests if oplocks are disabled */
1179
 
        if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break ||
1180
 
            IS_VETO_OPLOCK_PATH(conn, fname)) {
1181
 
                /* Mask off everything except the private Samba bits. */
1182
 
                oplock_request &= SAMBA_PRIVATE_OPLOCK_MASK;
1183
 
        }
1184
 
 
1185
 
        /* this is for OS/2 long file names - say we don't support them */
1186
 
        if (!lp_posix_pathnames() && strstr(fname,".+,;=[].")) {
1187
 
                /* OS/2 Workplace shell fix may be main code stream in a later
1188
 
                 * release. */ 
1189
 
                DEBUG(5,("open_file_ntcreate: OS/2 long filenames are not "
1190
 
                         "supported.\n"));
1191
 
                if (use_nt_status()) {
1192
 
                        return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1193
 
                }
1194
 
                return NT_STATUS_DOS(ERRDOS, ERRcannotopen);
1195
 
        }
1196
 
 
1197
 
        switch( create_disposition ) {
1198
 
                /*
1199
 
                 * Currently we're using FILE_SUPERSEDE as the same as
1200
 
                 * FILE_OVERWRITE_IF but they really are
1201
 
                 * different. FILE_SUPERSEDE deletes an existing file
1202
 
                 * (requiring delete access) then recreates it.
1203
 
                 */
1204
 
                case FILE_SUPERSEDE:
1205
 
                        /* If file exists replace/overwrite. If file doesn't
1206
 
                         * exist create. */
1207
 
                        flags2 |= (O_CREAT | O_TRUNC);
1208
 
                        break;
1209
 
 
1210
 
                case FILE_OVERWRITE_IF:
1211
 
                        /* If file exists replace/overwrite. If file doesn't
1212
 
                         * exist create. */
1213
 
                        flags2 |= (O_CREAT | O_TRUNC);
1214
 
                        break;
1215
 
 
1216
 
                case FILE_OPEN:
1217
 
                        /* If file exists open. If file doesn't exist error. */
1218
 
                        if (!file_existed) {
1219
 
                                DEBUG(5,("open_file_ntcreate: FILE_OPEN "
1220
 
                                         "requested for file %s and file "
1221
 
                                         "doesn't exist.\n", fname ));
1222
 
                                errno = ENOENT;
1223
 
                                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1224
 
                        }
1225
 
                        break;
1226
 
 
1227
 
                case FILE_OVERWRITE:
1228
 
                        /* If file exists overwrite. If file doesn't exist
1229
 
                         * error. */
1230
 
                        if (!file_existed) {
1231
 
                                DEBUG(5,("open_file_ntcreate: FILE_OVERWRITE "
1232
 
                                         "requested for file %s and file "
1233
 
                                         "doesn't exist.\n", fname ));
1234
 
                                errno = ENOENT;
1235
 
                                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1236
 
                        }
1237
 
                        flags2 |= O_TRUNC;
1238
 
                        break;
1239
 
 
1240
 
                case FILE_CREATE:
1241
 
                        /* If file exists error. If file doesn't exist
1242
 
                         * create. */
1243
 
                        if (file_existed) {
1244
 
                                DEBUG(5,("open_file_ntcreate: FILE_CREATE "
1245
 
                                         "requested for file %s and file "
1246
 
                                         "already exists.\n", fname ));
1247
 
                                if (S_ISDIR(psbuf->st_mode)) {
1248
 
                                        errno = EISDIR;
1249
 
                                } else {
1250
 
                                        errno = EEXIST;
1251
 
                                }
1252
 
                                return map_nt_error_from_unix(errno);
1253
 
                        }
1254
 
                        flags2 |= (O_CREAT|O_EXCL);
1255
 
                        break;
1256
 
 
1257
 
                case FILE_OPEN_IF:
1258
 
                        /* If file exists open. If file doesn't exist
1259
 
                         * create. */
1260
 
                        flags2 |= O_CREAT;
1261
 
                        break;
1262
 
 
1263
 
                default:
1264
 
                        return NT_STATUS_INVALID_PARAMETER;
1265
 
        }
1266
 
 
1267
 
        /* We only care about matching attributes on file exists and
1268
 
         * overwrite. */
1269
 
 
1270
 
        if (file_existed && ((create_disposition == FILE_OVERWRITE) ||
1271
 
                             (create_disposition == FILE_OVERWRITE_IF))) {
1272
 
                if (!open_match_attributes(conn, fname,
1273
 
                                           existing_dos_attributes,
1274
 
                                           new_dos_attributes, psbuf->st_mode,
1275
 
                                           unx_mode, &new_unx_mode)) {
1276
 
                        DEBUG(5,("open_file_ntcreate: attributes missmatch "
1277
 
                                 "for file %s (%x %x) (0%o, 0%o)\n",
1278
 
                                 fname, existing_dos_attributes,
1279
 
                                 new_dos_attributes,
1280
 
                                 (unsigned int)psbuf->st_mode,
1281
 
                                 (unsigned int)unx_mode ));
1282
 
                        errno = EACCES;
1283
 
                        return NT_STATUS_ACCESS_DENIED;
1284
 
                }
1285
 
        }
1286
 
 
1287
 
        /* This is a nasty hack - must fix... JRA. */
1288
 
        if (access_mask == MAXIMUM_ALLOWED_ACCESS) {
1289
 
                access_mask = FILE_GENERIC_ALL;
1290
 
        }
1291
 
 
1292
 
        /*
1293
 
         * Convert GENERIC bits to specific bits.
1294
 
         */
1295
 
 
1296
 
        se_map_generic(&access_mask, &file_generic_mapping);
1297
 
 
1298
 
        DEBUG(10, ("open_file_ntcreate: fname=%s, after mapping "
1299
 
                   "access_mask=0x%x\n", fname, access_mask ));
1300
 
 
1301
 
        /*
1302
 
         * Note that we ignore the append flag as append does not
1303
 
         * mean the same thing under DOS and Unix.
1304
 
         */
1305
 
 
1306
 
        if (access_mask & (FILE_WRITE_DATA | FILE_APPEND_DATA)) {
1307
 
                flags = O_RDWR;
1308
 
        } else {
1309
 
                flags = O_RDONLY;
1310
 
        }
1311
 
 
1312
 
        /*
1313
 
         * Currently we only look at FILE_WRITE_THROUGH for create options.
1314
 
         */
1315
 
 
1316
 
#if defined(O_SYNC)
1317
 
        if ((create_options & FILE_WRITE_THROUGH) && lp_strict_sync(SNUM(conn))) {
1318
 
                flags2 |= O_SYNC;
1319
 
        }
1320
 
#endif /* O_SYNC */
1321
 
  
1322
 
        if (!CAN_WRITE(conn)) {
1323
 
                /*
1324
 
                 * We should really return a permission denied error if either
1325
 
                 * O_CREAT or O_TRUNC are set, but for compatibility with
1326
 
                 * older versions of Samba we just AND them out.
1327
 
                 */
1328
 
                flags2 &= ~(O_CREAT|O_TRUNC);
1329
 
        }
1330
 
 
1331
 
        /*
1332
 
         * Ensure we can't write on a read-only share or file.
1333
 
         */
1334
 
 
1335
 
        if (flags != O_RDONLY && file_existed &&
1336
 
            (!CAN_WRITE(conn) || IS_DOS_READONLY(existing_dos_attributes))) {
1337
 
                DEBUG(5,("open_file_ntcreate: write access requested for "
1338
 
                         "file %s on read only %s\n",
1339
 
                         fname, !CAN_WRITE(conn) ? "share" : "file" ));
1340
 
                errno = EACCES;
1341
 
                return NT_STATUS_ACCESS_DENIED;
1342
 
        }
1343
 
 
1344
 
        status = file_new(conn, &fsp);
1345
 
        if(!NT_STATUS_IS_OK(status)) {
1346
 
                return status;
1347
 
        }
1348
 
 
1349
 
        fsp->dev = psbuf->st_dev;
1350
 
        fsp->inode = psbuf->st_ino;
1351
 
        fsp->share_access = share_access;
1352
 
        fsp->fh->private_options = create_options;
1353
 
        fsp->access_mask = access_mask;
1354
 
        /* Ensure no SAMBA_PRIVATE bits can be set. */
1355
 
        fsp->oplock_type = (oplock_request & ~SAMBA_PRIVATE_OPLOCK_MASK);
1356
 
 
1357
 
        if (timeval_is_zero(&request_time)) {
1358
 
                request_time = fsp->open_time;
1359
 
        }
1360
 
 
1361
 
        if (file_existed) {
1362
 
                dev = psbuf->st_dev;
1363
 
                inode = psbuf->st_ino;
1364
 
 
1365
 
                lck = get_share_mode_lock(NULL, dev, inode,
1366
 
                                        conn->connectpath,
1367
 
                                        fname);
1368
 
 
1369
 
                if (lck == NULL) {
1370
 
                        file_free(fsp);
1371
 
                        DEBUG(0, ("Could not get share mode lock\n"));
1372
 
                        return NT_STATUS_SHARING_VIOLATION;
1373
 
                }
1374
 
 
1375
 
                /* First pass - send break only on batch oplocks. */
1376
 
                if (delay_for_oplocks(lck, fsp, 1, oplock_request)) {
1377
 
                        schedule_defer_open(lck, request_time);
1378
 
                        TALLOC_FREE(lck);
1379
 
                        file_free(fsp);
1380
 
                        return NT_STATUS_SHARING_VIOLATION;
1381
 
                }
1382
 
 
1383
 
                status = open_mode_check(conn, fname, lck,
1384
 
                                         access_mask, share_access,
1385
 
                                         create_options, &file_existed);
1386
 
 
1387
 
                if (NT_STATUS_IS_OK(status)) {
1388
 
                        /* We might be going to allow this open. Check oplock status again. */
1389
 
                        /* Second pass - send break for both batch or exclusive oplocks. */
1390
 
                        if (delay_for_oplocks(lck, fsp, 2, oplock_request)) {
1391
 
                                schedule_defer_open(lck, request_time);
1392
 
                                TALLOC_FREE(lck);
1393
 
                                file_free(fsp);
1394
 
                                return NT_STATUS_SHARING_VIOLATION;
1395
 
                        }
1396
 
                }
1397
 
 
1398
 
                if (NT_STATUS_EQUAL(status, NT_STATUS_DELETE_PENDING)) {
1399
 
                        /* DELETE_PENDING is not deferred for a second */
1400
 
                        TALLOC_FREE(lck);
1401
 
                        file_free(fsp);
1402
 
                        return status;
1403
 
                }
1404
 
 
1405
 
                if (!NT_STATUS_IS_OK(status)) {
1406
 
 
1407
 
                        SMB_ASSERT(NT_STATUS_EQUAL(status, NT_STATUS_SHARING_VIOLATION));
1408
 
 
1409
 
                        /* Check if this can be done with the deny_dos and fcb
1410
 
                         * calls. */
1411
 
                        if (create_options &
1412
 
                            (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS|
1413
 
                             NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) {
1414
 
                                files_struct *fsp_dup;
1415
 
                                fsp_dup = fcb_or_dos_open(conn, fname, dev,
1416
 
                                                          inode, access_mask,
1417
 
                                                          share_access,
1418
 
                                                          create_options);
1419
 
 
1420
 
                                if (fsp_dup) {
1421
 
                                        TALLOC_FREE(lck);
1422
 
                                        file_free(fsp);
1423
 
                                        if (pinfo) {
1424
 
                                                *pinfo = FILE_WAS_OPENED;
1425
 
                                        }
1426
 
                                        conn->num_files_open++;
1427
 
                                        *result = fsp_dup;
1428
 
                                        return NT_STATUS_OK;
1429
 
                                }
1430
 
                        }
1431
 
 
1432
 
                        /*
1433
 
                         * This next line is a subtlety we need for
1434
 
                         * MS-Access. If a file open will fail due to share
1435
 
                         * permissions and also for security (access) reasons,
1436
 
                         * we need to return the access failed error, not the
1437
 
                         * share error. This means we must attempt to open the
1438
 
                         * file anyway in order to get the UNIX access error -
1439
 
                         * even if we're going to fail the open for share
1440
 
                         * reasons. This is bad, as we're burning another fd
1441
 
                         * if there are existing locks but there's nothing
1442
 
                         * else we can do. We also ensure we're not going to
1443
 
                         * create or tuncate the file as we only want an
1444
 
                         * access decision at this stage. JRA.
1445
 
                         */
1446
 
                        errno = 0;
1447
 
                        fsp_open = open_file(fsp,conn,fname,psbuf,
1448
 
                                             flags|(flags2&~(O_TRUNC|O_CREAT)),
1449
 
                                             unx_mode,access_mask);
1450
 
 
1451
 
                        DEBUG(4,("open_file_ntcreate : share_mode deny - "
1452
 
                                 "calling open_file with flags=0x%X "
1453
 
                                 "flags2=0x%X mode=0%o returned %s\n",
1454
 
                                 flags, (flags2&~(O_TRUNC|O_CREAT)),
1455
 
                                 (unsigned int)unx_mode, nt_errstr(fsp_open)));
1456
 
 
1457
 
                        if (!NT_STATUS_IS_OK(fsp_open) && errno) {
1458
 
                                /* Default error. */
1459
 
                                status = NT_STATUS_ACCESS_DENIED;
1460
 
                        }
1461
 
 
1462
 
                        /* 
1463
 
                         * If we're returning a share violation, ensure we
1464
 
                         * cope with the braindead 1 second delay.
1465
 
                         */
1466
 
 
1467
 
                        if (!(oplock_request & INTERNAL_OPEN_ONLY) &&
1468
 
                            lp_defer_sharing_violations()) {
1469
 
                                struct timeval timeout;
1470
 
                                struct deferred_open_record state;
1471
 
                                int timeout_usecs;
1472
 
 
1473
 
                                /* this is a hack to speed up torture tests
1474
 
                                   in 'make test' */
1475
 
                                timeout_usecs = lp_parm_int(SNUM(conn),
1476
 
                                                            "smbd","sharedelay",
1477
 
                                                            SHARING_VIOLATION_USEC_WAIT);
1478
 
 
1479
 
                                /* This is a relative time, added to the absolute
1480
 
                                   request_time value to get the absolute timeout time.
1481
 
                                   Note that if this is the second or greater time we enter
1482
 
                                   this codepath for this particular request mid then
1483
 
                                   request_time is left as the absolute time of the *first*
1484
 
                                   time this request mid was processed. This is what allows
1485
 
                                   the request to eventually time out. */
1486
 
 
1487
 
                                timeout = timeval_set(0, timeout_usecs);
1488
 
 
1489
 
                                /* Nothing actually uses state.delayed_for_oplocks
1490
 
                                   but it's handy to differentiate in debug messages
1491
 
                                   between a 30 second delay due to oplock break, and
1492
 
                                   a 1 second delay for share mode conflicts. */
1493
 
 
1494
 
                                state.delayed_for_oplocks = False;
1495
 
                                state.dev = dev;
1496
 
                                state.inode = inode;
1497
 
 
1498
 
                                if (!request_timed_out(request_time,
1499
 
                                                       timeout)) {
1500
 
                                        defer_open(lck, request_time, timeout,
1501
 
                                                   &state);
1502
 
                                }
1503
 
                        }
1504
 
 
1505
 
                        TALLOC_FREE(lck);
1506
 
                        if (NT_STATUS_IS_OK(fsp_open)) {
1507
 
                                fd_close(conn, fsp);
1508
 
                                /*
1509
 
                                 * We have detected a sharing violation here
1510
 
                                 * so return the correct error code
1511
 
                                 */
1512
 
                                status = NT_STATUS_SHARING_VIOLATION;
1513
 
                        }
1514
 
                        file_free(fsp);
1515
 
                        return status;
1516
 
                }
1517
 
 
1518
 
                /*
1519
 
                 * We exit this block with the share entry *locked*.....
1520
 
                 */
1521
 
        }
1522
 
 
1523
 
        SMB_ASSERT(!file_existed || (lck != NULL));
1524
 
 
1525
 
        /*
1526
 
         * Ensure we pay attention to default ACLs on directories if required.
1527
 
         */
1528
 
 
1529
 
        if ((flags2 & O_CREAT) && lp_inherit_acls(SNUM(conn)) &&
1530
 
            (def_acl = directory_has_default_acl(conn,
1531
 
                                                 parent_dirname(fname)))) {
1532
 
                unx_mode = 0777;
1533
 
        }
1534
 
 
1535
 
        DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
1536
 
                 (unsigned int)flags, (unsigned int)flags2,
1537
 
                 (unsigned int)unx_mode));
1538
 
 
1539
 
        /*
1540
 
         * open_file strips any O_TRUNC flags itself.
1541
 
         */
1542
 
 
1543
 
        fsp_open = open_file(fsp,conn,fname,psbuf,flags|flags2,unx_mode,
1544
 
                             access_mask);
1545
 
 
1546
 
        if (!NT_STATUS_IS_OK(fsp_open)) {
1547
 
                if (lck != NULL) {
1548
 
                        TALLOC_FREE(lck);
1549
 
                }
1550
 
                file_free(fsp);
1551
 
                return fsp_open;
1552
 
        }
1553
 
 
1554
 
        if (!file_existed) { 
1555
 
 
1556
 
                /*
1557
 
                 * Deal with the race condition where two smbd's detect the
1558
 
                 * file doesn't exist and do the create at the same time. One
1559
 
                 * of them will win and set a share mode, the other (ie. this
1560
 
                 * one) should check if the requested share mode for this
1561
 
                 * create is allowed.
1562
 
                 */
1563
 
 
1564
 
                /*
1565
 
                 * Now the file exists and fsp is successfully opened,
1566
 
                 * fsp->dev and fsp->inode are valid and should replace the
1567
 
                 * dev=0,inode=0 from a non existent file. Spotted by
1568
 
                 * Nadav Danieli <nadavd@exanet.com>. JRA.
1569
 
                 */
1570
 
 
1571
 
                dev = fsp->dev;
1572
 
                inode = fsp->inode;
1573
 
 
1574
 
                lck = get_share_mode_lock(NULL, dev, inode,
1575
 
                                        conn->connectpath,
1576
 
                                        fname);
1577
 
 
1578
 
                if (lck == NULL) {
1579
 
                        DEBUG(0, ("open_file_ntcreate: Could not get share mode lock for %s\n", fname));
1580
 
                        fd_close(conn, fsp);
1581
 
                        file_free(fsp);
1582
 
                        return NT_STATUS_SHARING_VIOLATION;
1583
 
                }
1584
 
 
1585
 
                status = open_mode_check(conn, fname, lck,
1586
 
                                         access_mask, share_access,
1587
 
                                         create_options, &file_existed);
1588
 
 
1589
 
                if (!NT_STATUS_IS_OK(status)) {
1590
 
                        struct deferred_open_record state;
1591
 
 
1592
 
                        fd_close(conn, fsp);
1593
 
                        file_free(fsp);
1594
 
 
1595
 
                        state.delayed_for_oplocks = False;
1596
 
                        state.dev = dev;
1597
 
                        state.inode = inode;
1598
 
 
1599
 
                        /* Do it all over again immediately. In the second
1600
 
                         * round we will find that the file existed and handle
1601
 
                         * the DELETE_PENDING and FCB cases correctly. No need
1602
 
                         * to duplicate the code here. Essentially this is a
1603
 
                         * "goto top of this function", but don't tell
1604
 
                         * anybody... */
1605
 
 
1606
 
                        defer_open(lck, request_time, timeval_zero(),
1607
 
                                   &state);
1608
 
                        TALLOC_FREE(lck);
1609
 
                        return status;
1610
 
                }
1611
 
 
1612
 
                /*
1613
 
                 * We exit this block with the share entry *locked*.....
1614
 
                 */
1615
 
        }
1616
 
 
1617
 
        SMB_ASSERT(lck != NULL);
1618
 
 
1619
 
        /* note that we ignore failure for the following. It is
1620
 
           basically a hack for NFS, and NFS will never set one of
1621
 
           these only read them. Nobody but Samba can ever set a deny
1622
 
           mode and we have already checked our more authoritative
1623
 
           locking database for permission to set this deny mode. If
1624
 
           the kernel refuses the operations then the kernel is wrong */
1625
 
 
1626
 
        kernel_flock(fsp, share_access);
1627
 
 
1628
 
        /*
1629
 
         * At this point onwards, we can guarentee that the share entry
1630
 
         * is locked, whether we created the file or not, and that the
1631
 
         * deny mode is compatible with all current opens.
1632
 
         */
1633
 
 
1634
 
        /*
1635
 
         * If requested, truncate the file.
1636
 
         */
1637
 
 
1638
 
        if (flags2&O_TRUNC) {
1639
 
                /*
1640
 
                 * We are modifing the file after open - update the stat
1641
 
                 * struct..
1642
 
                 */
1643
 
                if ((SMB_VFS_FTRUNCATE(fsp,fsp->fh->fd,0) == -1) ||
1644
 
                    (SMB_VFS_FSTAT(fsp,fsp->fh->fd,psbuf)==-1)) {
1645
 
                        status = map_nt_error_from_unix(errno);
1646
 
                        TALLOC_FREE(lck);
1647
 
                        fd_close(conn,fsp);
1648
 
                        file_free(fsp);
1649
 
                        return status;
1650
 
                }
1651
 
        }
1652
 
 
1653
 
        /* Record the options we were opened with. */
1654
 
        fsp->share_access = share_access;
1655
 
        fsp->fh->private_options = create_options;
1656
 
        fsp->access_mask = access_mask;
1657
 
 
1658
 
        if (file_existed) {
1659
 
                if (!(flags2 & O_TRUNC)) {
1660
 
                        info = FILE_WAS_OPENED;
1661
 
                } else {
1662
 
                        info = FILE_WAS_OVERWRITTEN;
1663
 
                }
1664
 
        } else {
1665
 
                info = FILE_WAS_CREATED;
1666
 
                /* Change the owner if required. */
1667
 
                if (lp_inherit_owner(SNUM(conn))) {
1668
 
                        change_owner_to_parent(conn, fsp, fsp->fsp_name,
1669
 
                                               psbuf);
1670
 
                }
1671
 
        }
1672
 
 
1673
 
        if (pinfo) {
1674
 
                *pinfo = info;
1675
 
        }
1676
 
 
1677
 
        /* 
1678
 
         * Setup the oplock info in both the shared memory and
1679
 
         * file structs.
1680
 
         */
1681
 
 
1682
 
        if ((fsp->oplock_type != NO_OPLOCK) &&
1683
 
            (fsp->oplock_type != FAKE_LEVEL_II_OPLOCK)) {
1684
 
                if (!set_file_oplock(fsp, fsp->oplock_type)) {
1685
 
                        /* Could not get the kernel oplock */
1686
 
                        fsp->oplock_type = NO_OPLOCK;
1687
 
                }
1688
 
        }
1689
 
        set_share_mode(lck, fsp, current_user.ut.uid, 0, fsp->oplock_type);
1690
 
 
1691
 
        if (info == FILE_WAS_OVERWRITTEN || info == FILE_WAS_CREATED ||
1692
 
                                info == FILE_WAS_SUPERSEDED) {
1693
 
 
1694
 
                /* Handle strange delete on close create semantics. */
1695
 
                if (create_options & FILE_DELETE_ON_CLOSE) {
1696
 
                        status = can_set_delete_on_close(fsp, True, new_dos_attributes);
1697
 
 
1698
 
                        if (!NT_STATUS_IS_OK(status)) {
1699
 
                                /* Remember to delete the mode we just added. */
1700
 
                                del_share_mode(lck, fsp);
1701
 
                                TALLOC_FREE(lck);
1702
 
                                fd_close(conn,fsp);
1703
 
                                file_free(fsp);
1704
 
                                return status;
1705
 
                        }
1706
 
                        /* Note that here we set the *inital* delete on close flag,
1707
 
                           not the regular one. */
1708
 
                        set_delete_on_close_token(lck, &current_user.ut);
1709
 
                        lck->initial_delete_on_close = True;
1710
 
                        lck->modified = True;
1711
 
                }
1712
 
        
1713
 
                /* Files should be initially set as archive */
1714
 
                if (lp_map_archive(SNUM(conn)) ||
1715
 
                    lp_store_dos_attributes(SNUM(conn))) {
1716
 
                        file_set_dosmode(conn, fname,
1717
 
                                         new_dos_attributes | aARCH, NULL,
1718
 
                                         True);
1719
 
                }
1720
 
        }
1721
 
 
1722
 
        /*
1723
 
         * Take care of inherited ACLs on created files - if default ACL not
1724
 
         * selected.
1725
 
         */
1726
 
 
1727
 
        if (!file_existed && !def_acl) {
1728
 
 
1729
 
                int saved_errno = errno; /* We might get ENOSYS in the next
1730
 
                                          * call.. */
1731
 
 
1732
 
                if (SMB_VFS_FCHMOD_ACL(fsp, fsp->fh->fd, unx_mode) == -1
1733
 
                    && errno == ENOSYS) {
1734
 
                        errno = saved_errno; /* Ignore ENOSYS */
1735
 
                }
1736
 
 
1737
 
        } else if (new_unx_mode) {
1738
 
 
1739
 
                int ret = -1;
1740
 
 
1741
 
                /* Attributes need changing. File already existed. */
1742
 
 
1743
 
                {
1744
 
                        int saved_errno = errno; /* We might get ENOSYS in the
1745
 
                                                  * next call.. */
1746
 
                        ret = SMB_VFS_FCHMOD_ACL(fsp, fsp->fh->fd,
1747
 
                                                 new_unx_mode);
1748
 
 
1749
 
                        if (ret == -1 && errno == ENOSYS) {
1750
 
                                errno = saved_errno; /* Ignore ENOSYS */
1751
 
                        } else {
1752
 
                                DEBUG(5, ("open_file_ntcreate: reset "
1753
 
                                          "attributes of file %s to 0%o\n",
1754
 
                                        fname, (unsigned int)new_unx_mode));
1755
 
                                ret = 0; /* Don't do the fchmod below. */
1756
 
                        }
1757
 
                }
1758
 
 
1759
 
                if ((ret == -1) &&
1760
 
                    (SMB_VFS_FCHMOD(fsp, fsp->fh->fd, new_unx_mode) == -1))
1761
 
                        DEBUG(5, ("open_file_ntcreate: failed to reset "
1762
 
                                  "attributes of file %s to 0%o\n",
1763
 
                                fname, (unsigned int)new_unx_mode));
1764
 
        }
1765
 
 
1766
 
        /* If this is a successful open, we must remove any deferred open
1767
 
         * records. */
1768
 
        del_deferred_open_entry(lck, mid);
1769
 
        TALLOC_FREE(lck);
1770
 
 
1771
 
        conn->num_files_open++;
1772
 
 
1773
 
        *result = fsp;
1774
 
        return NT_STATUS_OK;
1775
 
}
1776
 
 
1777
 
/****************************************************************************
1778
 
 Open a file for for write to ensure that we can fchmod it.
1779
 
****************************************************************************/
1780
 
 
1781
 
NTSTATUS open_file_fchmod(connection_struct *conn, const char *fname,
1782
 
                          SMB_STRUCT_STAT *psbuf, files_struct **result)
1783
 
{
1784
 
        files_struct *fsp = NULL;
1785
 
        NTSTATUS status;
1786
 
 
1787
 
        if (!VALID_STAT(*psbuf)) {
1788
 
                return NT_STATUS_INVALID_PARAMETER;
1789
 
        }
1790
 
 
1791
 
        status = file_new(conn, &fsp);
1792
 
        if(!NT_STATUS_IS_OK(status)) {
1793
 
                return status;
1794
 
        }
1795
 
 
1796
 
        /* note! we must use a non-zero desired access or we don't get
1797
 
           a real file descriptor. Oh what a twisted web we weave. */
1798
 
        status = open_file(fsp,conn,fname,psbuf,O_WRONLY,0,FILE_WRITE_DATA);
1799
 
 
1800
 
        /* 
1801
 
         * This is not a user visible file open.
1802
 
         * Don't set a share mode and don't increment
1803
 
         * the conn->num_files_open.
1804
 
         */
1805
 
 
1806
 
        if (!NT_STATUS_IS_OK(status)) {
1807
 
                file_free(fsp);
1808
 
                return status;
1809
 
        }
1810
 
 
1811
 
        *result = fsp;
1812
 
        return NT_STATUS_OK;
1813
 
}
1814
 
 
1815
 
/****************************************************************************
1816
 
 Close the fchmod file fd - ensure no locks are lost.
1817
 
****************************************************************************/
1818
 
 
1819
 
int close_file_fchmod(files_struct *fsp)
1820
 
{
1821
 
        int ret = fd_close(fsp->conn, fsp);
1822
 
        file_free(fsp);
1823
 
        return ret;
1824
 
}
1825
 
 
1826
 
/****************************************************************************
1827
 
 Open a directory from an NT SMB call.
1828
 
****************************************************************************/
1829
 
 
1830
 
NTSTATUS open_directory(connection_struct *conn,
1831
 
                                const char *fname,
1832
 
                                SMB_STRUCT_STAT *psbuf,
1833
 
                                uint32 access_mask,
1834
 
                                uint32 share_access,
1835
 
                                uint32 create_disposition,
1836
 
                                uint32 create_options,
1837
 
                                int *pinfo,
1838
 
                                files_struct **result)
1839
 
{
1840
 
        files_struct *fsp = NULL;
1841
 
        BOOL dir_existed = VALID_STAT(*psbuf) ? True : False;
1842
 
        BOOL create_dir = False;
1843
 
        struct share_mode_lock *lck = NULL;
1844
 
        NTSTATUS status;
1845
 
        int info = 0;
1846
 
 
1847
 
        DEBUG(5,("open_directory: opening directory %s, access_mask = 0x%x, "
1848
 
                 "share_access = 0x%x create_options = 0x%x, "
1849
 
                 "create_disposition = 0x%x\n",
1850
 
                 fname,
1851
 
                 (unsigned int)access_mask,
1852
 
                 (unsigned int)share_access,
1853
 
                 (unsigned int)create_options,
1854
 
                 (unsigned int)create_disposition));
1855
 
 
1856
 
        if (is_ntfs_stream_name(fname)) {
1857
 
                DEBUG(0,("open_directory: %s is a stream name!\n", fname ));
1858
 
                return NT_STATUS_NOT_A_DIRECTORY;
1859
 
        }
1860
 
 
1861
 
        switch( create_disposition ) {
1862
 
                case FILE_OPEN:
1863
 
                        /* If directory exists open. If directory doesn't
1864
 
                         * exist error. */
1865
 
                        if (!dir_existed) {
1866
 
                                DEBUG(5,("open_directory: FILE_OPEN requested "
1867
 
                                         "for directory %s and it doesn't "
1868
 
                                         "exist.\n", fname ));
1869
 
                                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1870
 
                        }
1871
 
                        info = FILE_WAS_OPENED;
1872
 
                        break;
1873
 
 
1874
 
                case FILE_CREATE:
1875
 
                        /* If directory exists error. If directory doesn't
1876
 
                         * exist create. */
1877
 
                        if (dir_existed) {
1878
 
                                DEBUG(5,("open_directory: FILE_CREATE "
1879
 
                                         "requested for directory %s and it "
1880
 
                                         "already exists.\n", fname ));
1881
 
                                if (use_nt_status()) {
1882
 
                                        return NT_STATUS_OBJECT_NAME_COLLISION;
1883
 
                                } else {
1884
 
                                        return NT_STATUS_DOS(ERRDOS,
1885
 
                                                             ERRfilexists);
1886
 
                                }
1887
 
                        }
1888
 
                        create_dir = True;
1889
 
                        info = FILE_WAS_CREATED;
1890
 
                        break;
1891
 
 
1892
 
                case FILE_OPEN_IF:
1893
 
                        /* If directory exists open. If directory doesn't
1894
 
                         * exist create. */
1895
 
                        if (!dir_existed) {
1896
 
                                create_dir = True;
1897
 
                                info = FILE_WAS_CREATED;
1898
 
                        } else {
1899
 
                                info = FILE_WAS_OPENED;
1900
 
                        }
1901
 
                        break;
1902
 
 
1903
 
                case FILE_SUPERSEDE:
1904
 
                case FILE_OVERWRITE:
1905
 
                case FILE_OVERWRITE_IF:
1906
 
                default:
1907
 
                        DEBUG(5,("open_directory: invalid create_disposition "
1908
 
                                 "0x%x for directory %s\n",
1909
 
                                 (unsigned int)create_disposition, fname));
1910
 
                        return NT_STATUS_INVALID_PARAMETER;
1911
 
        }
1912
 
 
1913
 
        if (create_dir) {
1914
 
                /*
1915
 
                 * Try and create the directory.
1916
 
                 */
1917
 
 
1918
 
                /* We know bad_path is false as it's caught earlier. */
1919
 
 
1920
 
                status = mkdir_internal(conn, fname, False);
1921
 
 
1922
 
                if (!NT_STATUS_IS_OK(status)) {
1923
 
                        DEBUG(2,("open_directory: unable to create %s. "
1924
 
                                 "Error was %s\n", fname, strerror(errno) ));
1925
 
                        /* Ensure we return the correct NT status to the
1926
 
                         * client. */
1927
 
                        return status;
1928
 
                }
1929
 
 
1930
 
                /* Ensure we're checking for a symlink here.... */
1931
 
                /* We don't want to get caught by a symlink racer. */
1932
 
 
1933
 
                if(SMB_VFS_LSTAT(conn,fname, psbuf) != 0) {
1934
 
                        return map_nt_error_from_unix(errno);
1935
 
                }
1936
 
 
1937
 
                if(!S_ISDIR(psbuf->st_mode)) {
1938
 
                        DEBUG(0,("open_directory: %s is not a directory !\n",
1939
 
                                 fname ));
1940
 
                        return NT_STATUS_NOT_A_DIRECTORY;
1941
 
                }
1942
 
        }
1943
 
 
1944
 
        status = file_new(conn, &fsp);
1945
 
        if(!NT_STATUS_IS_OK(status)) {
1946
 
                return status;
1947
 
        }
1948
 
 
1949
 
        /*
1950
 
         * Setup the files_struct for it.
1951
 
         */
1952
 
        
1953
 
        fsp->mode = psbuf->st_mode;
1954
 
        fsp->inode = psbuf->st_ino;
1955
 
        fsp->dev = psbuf->st_dev;
1956
 
        fsp->vuid = current_user.vuid;
1957
 
        fsp->file_pid = global_smbpid;
1958
 
        fsp->can_lock = False;
1959
 
        fsp->can_read = False;
1960
 
        fsp->can_write = False;
1961
 
 
1962
 
        fsp->share_access = share_access;
1963
 
        fsp->fh->private_options = create_options;
1964
 
        fsp->access_mask = access_mask;
1965
 
 
1966
 
        fsp->print_file = False;
1967
 
        fsp->modified = False;
1968
 
        fsp->oplock_type = NO_OPLOCK;
1969
 
        fsp->sent_oplock_break = NO_BREAK_SENT;
1970
 
        fsp->is_directory = True;
1971
 
        fsp->is_stat = False;
1972
 
        string_set(&fsp->fsp_name,fname);
1973
 
 
1974
 
        lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode,
1975
 
                                conn->connectpath,
1976
 
                                fname);
1977
 
 
1978
 
        if (lck == NULL) {
1979
 
                DEBUG(0, ("open_directory: Could not get share mode lock for %s\n", fname));
1980
 
                file_free(fsp);
1981
 
                return NT_STATUS_SHARING_VIOLATION;
1982
 
        }
1983
 
 
1984
 
        status = open_mode_check(conn, fname, lck,
1985
 
                                access_mask, share_access,
1986
 
                                create_options, &dir_existed);
1987
 
 
1988
 
        if (!NT_STATUS_IS_OK(status)) {
1989
 
                TALLOC_FREE(lck);
1990
 
                file_free(fsp);
1991
 
                return status;
1992
 
        }
1993
 
 
1994
 
        set_share_mode(lck, fsp, current_user.ut.uid, 0, NO_OPLOCK);
1995
 
 
1996
 
        /* For directories the delete on close bit at open time seems
1997
 
           always to be honored on close... See test 19 in Samba4 BASE-DELETE. */
1998
 
        if (create_options & FILE_DELETE_ON_CLOSE) {
1999
 
                status = can_set_delete_on_close(fsp, True, 0);
2000
 
                if (!NT_STATUS_IS_OK(status)) {
2001
 
                        TALLOC_FREE(lck);
2002
 
                        file_free(fsp);
2003
 
                        return status;
2004
 
                }
2005
 
 
2006
 
                set_delete_on_close_token(lck, &current_user.ut);
2007
 
                lck->initial_delete_on_close = True;
2008
 
                lck->modified = True;
2009
 
        }
2010
 
 
2011
 
        TALLOC_FREE(lck);
2012
 
 
2013
 
        /* Change the owner if required. */
2014
 
        if ((info == FILE_WAS_CREATED) && lp_inherit_owner(SNUM(conn))) {
2015
 
                change_owner_to_parent(conn, fsp, fsp->fsp_name, psbuf);
2016
 
        }
2017
 
 
2018
 
        if (pinfo) {
2019
 
                *pinfo = info;
2020
 
        }
2021
 
 
2022
 
        conn->num_files_open++;
2023
 
 
2024
 
        *result = fsp;
2025
 
        return NT_STATUS_OK;
2026
 
}
2027
 
 
2028
 
/****************************************************************************
2029
 
 Open a pseudo-file (no locking checks - a 'stat' open).
2030
 
****************************************************************************/
2031
 
 
2032
 
NTSTATUS open_file_stat(connection_struct *conn, char *fname,
2033
 
                        SMB_STRUCT_STAT *psbuf, files_struct **result)
2034
 
{
2035
 
        files_struct *fsp = NULL;
2036
 
        NTSTATUS status;
2037
 
 
2038
 
        if (!VALID_STAT(*psbuf)) {
2039
 
                return NT_STATUS_INVALID_PARAMETER;
2040
 
        }
2041
 
 
2042
 
        /* Can't 'stat' open directories. */
2043
 
        if(S_ISDIR(psbuf->st_mode)) {
2044
 
                return NT_STATUS_FILE_IS_A_DIRECTORY;
2045
 
        }
2046
 
 
2047
 
        status = file_new(conn, &fsp);
2048
 
        if(!NT_STATUS_IS_OK(status)) {
2049
 
                return status;
2050
 
        }
2051
 
 
2052
 
        DEBUG(5,("open_file_stat: 'opening' file %s\n", fname));
2053
 
 
2054
 
        /*
2055
 
         * Setup the files_struct for it.
2056
 
         */
2057
 
        
2058
 
        fsp->mode = psbuf->st_mode;
2059
 
        fsp->inode = psbuf->st_ino;
2060
 
        fsp->dev = psbuf->st_dev;
2061
 
        fsp->vuid = current_user.vuid;
2062
 
        fsp->file_pid = global_smbpid;
2063
 
        fsp->can_lock = False;
2064
 
        fsp->can_read = False;
2065
 
        fsp->can_write = False;
2066
 
        fsp->print_file = False;
2067
 
        fsp->modified = False;
2068
 
        fsp->oplock_type = NO_OPLOCK;
2069
 
        fsp->sent_oplock_break = NO_BREAK_SENT;
2070
 
        fsp->is_directory = False;
2071
 
        fsp->is_stat = True;
2072
 
        string_set(&fsp->fsp_name,fname);
2073
 
 
2074
 
        conn->num_files_open++;
2075
 
 
2076
 
        *result = fsp;
2077
 
        return NT_STATUS_OK;
2078
 
}
2079
 
 
2080
 
/****************************************************************************
2081
 
 Receive notification that one of our open files has been renamed by another
2082
 
 smbd process.
2083
 
****************************************************************************/
2084
 
 
2085
 
void msg_file_was_renamed(int msg_type, struct process_id src, void *buf, size_t len)
2086
 
{
2087
 
        files_struct *fsp;
2088
 
        char *frm = (char *)buf;
2089
 
        SMB_DEV_T dev;
2090
 
        SMB_INO_T inode;
2091
 
        const char *sharepath;
2092
 
        const char *newname;
2093
 
        size_t sp_len;
2094
 
 
2095
 
        if (buf == NULL || len < MSG_FILE_RENAMED_MIN_SIZE + 2) {
2096
 
                DEBUG(0, ("msg_file_was_renamed: Got invalid msg len %d\n", (int)len));
2097
 
                return;
2098
 
        }
2099
 
 
2100
 
        /* Unpack the message. */
2101
 
        dev = DEV_T_VAL(frm,0);
2102
 
        inode = INO_T_VAL(frm,8);
2103
 
        sharepath = &frm[16];
2104
 
        newname = sharepath + strlen(sharepath) + 1;
2105
 
        sp_len = strlen(sharepath);
2106
 
 
2107
 
        DEBUG(10,("msg_file_was_renamed: Got rename message for sharepath %s, new name %s, "
2108
 
                "dev %x, inode  %.0f\n",
2109
 
                sharepath, newname, (unsigned int)dev, (double)inode ));
2110
 
 
2111
 
        for(fsp = file_find_di_first(dev, inode); fsp; fsp = file_find_di_next(fsp)) {
2112
 
                if (memcmp(fsp->conn->connectpath, sharepath, sp_len) == 0) {
2113
 
                        DEBUG(10,("msg_file_was_renamed: renaming file fnum %d from %s -> %s\n",
2114
 
                                fsp->fnum, fsp->fsp_name, newname ));
2115
 
                        string_set(&fsp->fsp_name, newname);
2116
 
                } else {
2117
 
                        /* TODO. JRA. */
2118
 
                        /* Now we have the complete path we can work out if this is
2119
 
                           actually within this share and adjust newname accordingly. */
2120
 
                        DEBUG(10,("msg_file_was_renamed: share mismatch (sharepath %s "
2121
 
                                "not sharepath %s) "
2122
 
                                "fnum %d from %s -> %s\n",
2123
 
                                fsp->conn->connectpath,
2124
 
                                sharepath,
2125
 
                                fsp->fnum,
2126
 
                                fsp->fsp_name,
2127
 
                                newname ));
2128
 
                }
2129
 
        }
2130
 
}