Fix a delete on close divergence from windows [1/2]
authorTim Prouty <tprouty@samba.org>
Sun, 7 Dec 2008 18:30:01 +0000 (10:30 -0800)
committerKarolin Seeger <kseeger@samba.org>
Thu, 11 Dec 2008 09:27:18 +0000 (10:27 +0100)
smbtorture4's BASE-DELETE:deltest17 was failing against win2k8,
win2k3, and winXPsp2 but passing against samba.

deltest17 does the following:

1. open file -> file is created
2. closes file
3. open file with DOC -> fnum1
4. check that DOC is not reported as being set from fnum1
5. opens file again Read Only -> fnum2
6. check that DOC is not reported as being set from either file handle
7. close fnum1 (the file handle that requested DOC to be set)
8. check if DOC is reported as being set from fnum2
 * This is where windows and samba begin to diverge.  Windows
   reports that the DOC bit is set, while samba reports that it is not set.
9. close fnum2 (the last remaining open handle for the file)
10.See if the file has been deleted.
 * On samba the file still exists.  On windows the file was deleted.

The way open_file_ntcreate is written now, if an open has the DOC bit
set on the wire, DOC (fsp->initial_delete_on_close) is not set unless:
a. the open creates the file, or b. there is an open file handle with
a share_entry in the struct lck that has the
SHARE_MODE_ALLOW_INITIAL_DELETE_ON_CLOSE bit set (let's call it
SM_AIDOC).

My understanding of SM_AIDOC is that it was added to differentiate
between DOC being set on an open that creates a file vs an open that
opens an existing.  As described in step 8/10 above, it appears that
windows does not make this differentiation.

To resolve this issue there are two patches.  This first patch is a
simple proof of concept change that is sufficient to fix the bug.  It
removes the differentiation in open_file_ntcreate, and updates
deltest17 to allow it to pass against win2k3/xp.  This makes
open_file_ntcreate more closely match the semantics in open_directory
and rename_internals_fsp.  This change also does not break any other
tests in BASE-DELETE or "make test".  Specifically test deltest20b
which verifies the CIFSFS rename DOC semantics still passes :).
(cherry picked from commit 69a2b8ea06bf65109ed8a44df38e62bcbac7c4a9)

source/smbd/open.c

index 632e02d6953aa5b641281d750f7e22708b6b6473..74c1c2223d624be3646992c0862915b5ba438cec 100644 (file)
@@ -1965,10 +1965,8 @@ static NTSTATUS open_file_ntcreate_internal(connection_struct *conn,
                       fsp->oplock_type, new_file_created);
 
        /* Handle strange delete on close create semantics. */
-       if ((create_options & FILE_DELETE_ON_CLOSE)
-           && (((conn->fs_capabilities & FILE_NAMED_STREAMS)
-                       && is_ntfs_stream_name(fname))
-               || can_set_initial_delete_on_close(lck))) {
+       if (create_options & FILE_DELETE_ON_CLOSE) {
+
                status = can_set_delete_on_close(fsp, True, new_dos_attributes);
 
                if (!NT_STATUS_IS_OK(status)) {