summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2010-05-13 10:54:15 -0700
committerJeremy Allison <jra@samba.org>2010-05-13 10:54:15 -0700
commited6fa379ef6e1f5d7ca3d5c42e4e97a2c7604683 (patch)
tree34525c56de08cbb104b0adab5b8b301668a15d37
parent6427484f84e3437bdabb90a2672ec7c037cedf0d (diff)
downloadsamba-ed6fa379ef6e1f5d7ca3d5c42e4e97a2c7604683.tar.gz
Treat an open of stream ::$DATA as an open of the base file.
This fixes a class of SMB_ASSERT failures when doing stream tests. Jeremy.
-rw-r--r--source3/modules/onefs_open.c27
-rw-r--r--source3/smbd/open.c24
2 files changed, 50 insertions, 1 deletions
diff --git a/source3/modules/onefs_open.c b/source3/modules/onefs_open.c
index dd4c24555f6..f7d6e0700f9 100644
--- a/source3/modules/onefs_open.c
+++ b/source3/modules/onefs_open.c
@@ -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 */
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 62651b08adc..049ce222ada 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -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,