Treat an open of stream ::$DATA as an open of the base file.
authorJeremy Allison <jra@samba.org>
Thu, 13 May 2010 17:54:15 +0000 (10:54 -0700)
committerJeremy Allison <jra@samba.org>
Thu, 13 May 2010 17:54:15 +0000 (10:54 -0700)
This fixes a class of SMB_ASSERT failures when doing stream tests.

Jeremy.

source3/modules/onefs_open.c
source3/smbd/open.c

index dd4c24555f65422efe7b4e72c4d1256bce2b9807..f7d6e0700f93d222196c26d0e4a53e8db1f51325 100644 (file)
@@ -2106,6 +2106,33 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle,
                goto fail;
        }
 
+       if (is_ntfs_stream_smb_fname(smb_fname)) {
+               if (!(conn->fs_capabilities & FILE_NAMED_STREAMS)) {
+                       status = NT_STATUS_OBJECT_NAME_NOT_FOUND;
+                       goto fail;
+               }
+
+               if (is_ntfs_default_stream_smb_fname(smb_fname)) {
+                       int ret;
+                       smb_fname->stream_name = NULL;
+                       /* We have to handle this error here. */
+                       if (create_options & FILE_DIRECTORY_FILE) {
+                               status = NT_STATUS_NOT_A_DIRECTORY;
+                               goto fail;
+                       }
+                       if (lp_posix_pathnames()) {
+                               ret = SMB_VFS_LSTAT(conn, smb_fname);
+                       } else {
+                               ret = SMB_VFS_STAT(conn, smb_fname);
+                       }
+
+                       if (ret == 0 && VALID_STAT_OF_DIR(smb_fname->st)) {
+                               status = NT_STATUS_FILE_IS_A_DIRECTORY;
+                               goto fail;
+                       }
+               }
+       }
+
        status = onefs_create_file_unixpath(
                conn,                                   /* conn */
                req,                                    /* req */
index 62651b08adc047058df2f3aeb19142c5c028e706..049ce222adad500b182603e7d5cc5232d8b08436 100644 (file)
@@ -3419,6 +3419,7 @@ NTSTATUS create_file_default(connection_struct *conn,
        int info = FILE_WAS_OPENED;
        files_struct *fsp = NULL;
        NTSTATUS status;
+       bool stream_name = false;
 
        DEBUG(10,("create_file: access_mask = 0x%x "
                  "file_attributes = 0x%x, share_access = 0x%x, "
@@ -3453,7 +3454,8 @@ NTSTATUS create_file_default(connection_struct *conn,
         * Check to see if this is a mac fork of some kind.
         */
 
-       if (is_ntfs_stream_smb_fname(smb_fname)) {
+       stream_name = is_ntfs_stream_smb_fname(smb_fname);
+       if (stream_name) {
                enum FAKE_FILE_TYPE fake_file_type;
 
                fake_file_type = is_fake_file(smb_fname);
@@ -3495,6 +3497,26 @@ NTSTATUS create_file_default(connection_struct *conn,
                goto fail;
        }
 
+       if (stream_name && is_ntfs_default_stream_smb_fname(smb_fname)) {
+               int ret;
+               smb_fname->stream_name = NULL;
+               /* We have to handle this error here. */
+               if (create_options & FILE_DIRECTORY_FILE) {
+                       status = NT_STATUS_NOT_A_DIRECTORY;
+                       goto fail;
+               }
+               if (lp_posix_pathnames()) {
+                       ret = SMB_VFS_LSTAT(conn, smb_fname);
+               } else {
+                       ret = SMB_VFS_STAT(conn, smb_fname);
+               }
+
+               if (ret == 0 && VALID_STAT_OF_DIR(smb_fname->st)) {
+                       status = NT_STATUS_FILE_IS_A_DIRECTORY;
+                       goto fail;
+               }
+       }
+
        status = create_file_unixpath(
                conn, req, smb_fname, access_mask, share_access,
                create_disposition, create_options, file_attributes,