s3: Fix open path to delete streams depending on the create disposition
authorTim Prouty <tprouty@samba.org>
Fri, 9 Jan 2009 19:07:45 +0000 (11:07 -0800)
committerTim Prouty <tprouty@samba.org>
Fri, 9 Jan 2009 19:45:31 +0000 (11:45 -0800)
The new create disposition test in smbtorture RAW-STREAMS verifies
this fix.

source3/smbd/open.c

index 52e31dfc231cbca8b02ef981ca0ff460a07ec810..7d23b92359e73d53d279aa9b81dd9d063a8d5f12 100644 (file)
@@ -1330,6 +1330,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
        bool def_acl = False;
        bool posix_open = False;
        bool new_file_created = False;
+       bool clear_ads = false;
        struct file_id id;
        NTSTATUS fsp_open = NT_STATUS_ACCESS_DENIED;
        mode_t new_unx_mode = (mode_t)0;
@@ -1461,12 +1462,14 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
                        /* If file exists replace/overwrite. If file doesn't
                         * exist create. */
                        flags2 |= (O_CREAT | O_TRUNC);
+                       clear_ads = true;
                        break;
 
                case FILE_OVERWRITE_IF:
                        /* If file exists replace/overwrite. If file doesn't
                         * exist create. */
                        flags2 |= (O_CREAT | O_TRUNC);
+                       clear_ads = true;
                        break;
 
                case FILE_OPEN:
@@ -1491,6 +1494,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
                                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
                        }
                        flags2 |= O_TRUNC;
+                       clear_ads = true;
                        break;
 
                case FILE_CREATE:
@@ -1925,6 +1929,16 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 
        SMB_ASSERT(lck != NULL);
 
+       /* Delete streams if create_disposition requires it */
+       if (file_existed && clear_ads) {
+               status = delete_all_streams(conn, fname);
+               if (!NT_STATUS_IS_OK(status)) {
+                       TALLOC_FREE(lck);
+                       fd_close(fsp);
+                       return status;
+               }
+       }
+
        /* note that we ignore failure for the following. It is
            basically a hack for NFS, and NFS will never set one of
            these only read them. Nobody but Samba can ever set a deny