]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
Add support for VFS op streaminfo chaining in all relevant VFS modules.
authorFrank Lahm <franklahm@googlemail.com>
Thu, 13 Oct 2011 22:41:53 +0000 (15:41 -0700)
committerKarolin Seeger <kseeger@samba.org>
Thu, 20 Oct 2011 17:53:18 +0000 (19:53 +0200)
Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Fri Oct 14 03:26:06 CEST 2011 on sn-devel-104
(cherry picked from commit 7a0b5d6fc51d5d212529e82e5ed8e21516bfbe27)

source3/modules/onefs_streams.c
source3/modules/vfs_default.c
source3/modules/vfs_streams_depot.c
source3/modules/vfs_streams_xattr.c
source3/smbd/close.c
source3/smbd/filename.c
source3/smbd/nttrans.c
source3/smbd/open.c
source3/smbd/trans2.c

index 85ab25683f3eb60e343513256d0dab113f276213..ac88573b5426bebaf0fd9165feb835a59fed9e9b 100644 (file)
@@ -736,25 +736,14 @@ NTSTATUS onefs_streaminfo(vfs_handle_struct *handle,
                return map_nt_error_from_unix(errno);
        }
 
-       state.streams = NULL;
-       state.num_streams = 0;
+       state.streams = *pstreams;
+       state.num_streams = *pnum_streams;
 
        if (lp_parm_bool(SNUM(handle->conn), PARM_ONEFS_TYPE,
                PARM_IGNORE_STREAMS, PARM_IGNORE_STREAMS_DEFAULT)) {
                goto out;
        }
 
-       /* Add the default stream. */
-       if (S_ISREG(sbuf.st_ex_mode)) {
-               if (!add_one_stream(mem_ctx,
-                                   &state.num_streams, &state.streams,
-                                   "", sbuf.st_ex_size,
-                                   SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp,
-                                                          &sbuf))) {
-                       return NT_STATUS_NO_MEMORY;
-               }
-       }
-
        state.mem_ctx = mem_ctx;
        state.handle = handle;
        state.status = NT_STATUS_OK;
@@ -778,5 +767,5 @@ NTSTATUS onefs_streaminfo(vfs_handle_struct *handle,
  out:
        *num_streams = state.num_streams;
        *streams = state.streams;
-       return NT_STATUS_OK;
+       return SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx, pnum_streams, pstreams);
 }
index 4d06a10f42607a58cc4ff91004c87cff8796cf87..27e9b9b01371a0d7c23e33ce6c0d06ea2644f87e 100644 (file)
@@ -1182,8 +1182,7 @@ static NTSTATUS vfswrap_streaminfo(vfs_handle_struct *handle,
                                   struct stream_struct **pstreams)
 {
        SMB_STRUCT_STAT sbuf;
-       unsigned int num_streams = 0;
-       struct stream_struct *streams = NULL;
+       struct stream_struct *tmp_streams = NULL;
        int ret;
 
        if ((fsp != NULL) && (fsp->is_directory)) {
@@ -1218,25 +1217,21 @@ static NTSTATUS vfswrap_streaminfo(vfs_handle_struct *handle,
                goto done;
        }
 
-       streams = talloc(mem_ctx, struct stream_struct);
-
-       if (streams == NULL) {
+       tmp_streams = talloc_realloc(mem_ctx, *pstreams, struct stream_struct,
+                                       (*pnum_streams) + 1);
+       if (tmp_streams == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
-
-       streams->size = sbuf.st_ex_size;
-       streams->alloc_size = SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp, &sbuf);
-
-       streams->name = talloc_strdup(streams, "::$DATA");
-       if (streams->name == NULL) {
-               TALLOC_FREE(streams);
+       tmp_streams[*pnum_streams].name = talloc_strdup(tmp_streams, "::$DATA");
+       if (tmp_streams[*pnum_streams].name == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
+       tmp_streams[*pnum_streams].size = sbuf.st_ex_size;
+       tmp_streams[*pnum_streams].alloc_size = SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp, &sbuf);
 
-       num_streams = 1;
+       *pnum_streams += 1;
+       *pstreams = tmp_streams;
  done:
-       *pnum_streams = num_streams;
-       *pstreams = streams;
        return NT_STATUS_OK;
 }
 
index 01851cd2f83340efde22a22c84289752a6207091..708a90b0523623ea4e4e75c4e1444d67c973585d 100644 (file)
@@ -827,20 +827,8 @@ static NTSTATUS streams_depot_streaminfo(vfs_handle_struct *handle,
                goto out;
        }
 
-       state.streams = NULL;
-       state.num_streams = 0;
-
-       if (!S_ISDIR(smb_fname_base->st.st_ex_mode)) {
-               if (!add_one_stream(mem_ctx,
-                                   &state.num_streams, &state.streams,
-                                   "::$DATA", smb_fname_base->st.st_ex_size,
-                                   SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp,
-                                                      &smb_fname_base->st))) {
-                       status = NT_STATUS_NO_MEMORY;
-                       goto out;
-               }
-       }
-
+       state.streams = *pstreams;
+       state.num_streams = *pnum_streams;
        state.mem_ctx = mem_ctx;
        state.handle = handle;
        state.status = NT_STATUS_OK;
@@ -861,7 +849,7 @@ static NTSTATUS streams_depot_streaminfo(vfs_handle_struct *handle,
 
        *pnum_streams = state.num_streams;
        *pstreams = state.streams;
-       status = NT_STATUS_OK;
+       status = SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx, pnum_streams, pstreams);
 
  out:
        TALLOC_FREE(smb_fname_base);
index 34e01b0b5f2a4cc322add09863070f3825e28fa0..08d8d14cbdf6511b066510c1c2903266ceeeb4fa 100644 (file)
@@ -810,19 +810,8 @@ static NTSTATUS streams_xattr_streaminfo(vfs_handle_struct *handle,
                return map_nt_error_from_unix(errno);
        }
 
-       state.streams = NULL;
-       state.num_streams = 0;
-
-       if (!S_ISDIR(sbuf.st_ex_mode)) {
-               if (!add_one_stream(mem_ctx,
-                                   &state.num_streams, &state.streams,
-                                   "::$DATA", sbuf.st_ex_size,
-                                   SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp,
-                                                          &sbuf))) {
-                       return NT_STATUS_NO_MEMORY;
-               }
-       }
-
+       state.streams = *pstreams;
+       state.num_streams = *pnum_streams;
        state.mem_ctx = mem_ctx;
        state.handle = handle;
        state.status = NT_STATUS_OK;
@@ -842,7 +831,8 @@ static NTSTATUS streams_xattr_streaminfo(vfs_handle_struct *handle,
 
        *pnum_streams = state.num_streams;
        *pstreams = state.streams;
-       return NT_STATUS_OK;
+
+       return SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx, pnum_streams, pstreams);
 }
 
 static uint32_t streams_xattr_fs_capabilities(struct vfs_handle_struct *handle,
index aeed4e3c9d7b01cc93e3a033841a0f3abd3cd520..603cfffb332d390e9fed09a2fa3e6342af67c5a1 100644 (file)
@@ -201,9 +201,9 @@ static void notify_deferred_opens(struct messaging_context *msg_ctx,
 
 NTSTATUS delete_all_streams(connection_struct *conn, const char *fname)
 {
-       struct stream_struct *stream_info;
+       struct stream_struct *stream_info = NULL;
        int i;
-       unsigned int num_streams;
+       unsigned int num_streams = 0;
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
 
index 08bc79dfd2273a7b0012e0620371a90588cd3d6e..ec9ca20e32ce00a03d9c664dbec7af8f2a1e545c 100644 (file)
@@ -1170,7 +1170,7 @@ static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx,
                                  struct smb_filename *smb_fname)
 {
        NTSTATUS status;
-       unsigned int i, num_streams;
+       unsigned int i, num_streams = 0;
        struct stream_struct *streams = NULL;
 
        if (SMB_VFS_STAT(conn, smb_fname) == 0) {
index f21b62b4b2e165143dd8fe133d3db097b3e17c5c..8f5a4c560472cd862b8837a53d902bb229875ec2 100644 (file)
@@ -693,7 +693,7 @@ void reply_ntcreate_and_X(struct smb_request *req)
        if (flags & EXTENDED_RESPONSE_REQUIRED) {
                uint16_t file_status = (NO_EAS|NO_SUBSTREAMS|NO_REPARSETAG);
                size_t num_names = 0;
-               unsigned int num_streams;
+               unsigned int num_streams = 0;
                struct stream_struct *streams = NULL;
 
                /* Do we have any EA's ? */
@@ -1274,7 +1274,7 @@ static void call_nt_transact_create(connection_struct *conn,
        if (flags & EXTENDED_RESPONSE_REQUIRED) {
                uint16_t file_status = (NO_EAS|NO_SUBSTREAMS|NO_REPARSETAG);
                size_t num_names = 0;
-               unsigned int num_streams;
+               unsigned int num_streams = 0;
                struct stream_struct *streams = NULL;
 
                /* Do we have any EA's ? */
index e30d36ebf9a707cd87b88786be7dcae0795a581a..0813496bf96c2efc20db5d431d4c4bfe72f0699b 100644 (file)
@@ -2967,10 +2967,10 @@ void msg_file_was_renamed(struct messaging_context *msg,
 NTSTATUS open_streams_for_delete(connection_struct *conn,
                                        const char *fname)
 {
-       struct stream_struct *stream_info;
-       files_struct **streams;
+       struct stream_struct *stream_info = NULL;
+       files_struct **streams = NULL;
        int i;
-       unsigned int num_streams;
+       unsigned int num_streams = 0;
        TALLOC_CTX *frame = talloc_stackframe();
        NTSTATUS status;
 
index 114f68832f9a8aa93359bd7d5e66538a01f73aeb..ffa730945ba2eaf9422c13a529dd0f43717dda0c 100644 (file)
@@ -4673,8 +4673,8 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
                 */
                case SMB_QUERY_FILE_STREAM_INFO:
                case SMB_FILE_STREAM_INFORMATION: {
-                       unsigned int num_streams;
-                       struct stream_struct *streams;
+                       unsigned int num_streams = 0;
+                       struct stream_struct *streams = NULL;
 
                        DEBUG(10,("smbd_do_qfilepathinfo: "
                                  "SMB_FILE_STREAM_INFORMATION\n"));