diff mbox series

[2/2] ksmbd: contain default data stream even if xattr is empty

Message ID 20211121114333.6179-2-linkinjeon@kernel.org (mailing list archive)
State New, archived
Headers show
Series [1/2] ksmbd: downgrade addition info error msg to debug in smb2_get_info_sec() | expand

Commit Message

Namjae Jeon Nov. 21, 2021, 11:43 a.m. UTC
If xattr is not supported like exfat or fat, ksmbd server doesn't
contain default data stream in FILE_STREAM_INFORMATION response. It will
cause ppt or doc file update issue if local filesystem is such as ones.
This patch move goto statement to contain it.

Fixes: 9f6323311c70 ("ksmbd: add default data stream name in FILE_STREAM_INFORMATION")
Cc: stable@vger.kernel.org # v5.15
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
---
 fs/ksmbd/smb2pdu.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

Comments

Hyunchul Lee Nov. 23, 2021, 12:19 a.m. UTC | #1
Acked-by: Hyunchul Lee <hyc.lee@gmail.com>

2021년 11월 21일 (일) 오후 9:33, Namjae Jeon <linkinjeon@kernel.org>님이 작성:
>
> If xattr is not supported like exfat or fat, ksmbd server doesn't
> contain default data stream in FILE_STREAM_INFORMATION response. It will
> cause ppt or doc file update issue if local filesystem is such as ones.
> This patch move goto statement to contain it.
>
> Fixes: 9f6323311c70 ("ksmbd: add default data stream name in FILE_STREAM_INFORMATION")
> Cc: stable@vger.kernel.org # v5.15
> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
> ---
>  fs/ksmbd/smb2pdu.c | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c
> index 82954b2b8d31..2067d5bab1b0 100644
> --- a/fs/ksmbd/smb2pdu.c
> +++ b/fs/ksmbd/smb2pdu.c
> @@ -4457,6 +4457,12 @@ static void get_file_stream_info(struct ksmbd_work *work,
>                          &stat);
>         file_info = (struct smb2_file_stream_info *)rsp->Buffer;
>
> +       buf_free_len =
> +               smb2_calc_max_out_buf_len(work, 8,
> +                                         le32_to_cpu(req->OutputBufferLength));
> +       if (buf_free_len < 0)
> +               goto out;
> +
>         xattr_list_len = ksmbd_vfs_listxattr(path->dentry, &xattr_list);
>         if (xattr_list_len < 0) {
>                 goto out;
> @@ -4465,12 +4471,6 @@ static void get_file_stream_info(struct ksmbd_work *work,
>                 goto out;
>         }
>
> -       buf_free_len =
> -               smb2_calc_max_out_buf_len(work, 8,
> -                                         le32_to_cpu(req->OutputBufferLength));
> -       if (buf_free_len < 0)
> -               goto out;
> -
>         while (idx < xattr_list_len) {
>                 stream_name = xattr_list + idx;
>                 streamlen = strlen(stream_name);
> @@ -4514,6 +4514,7 @@ static void get_file_stream_info(struct ksmbd_work *work,
>                 file_info->NextEntryOffset = cpu_to_le32(next);
>         }
>
> +out:
>         if (!S_ISDIR(stat.mode) &&
>             buf_free_len >= sizeof(struct smb2_file_stream_info) + 7 * 2) {
>                 file_info = (struct smb2_file_stream_info *)
> @@ -4522,14 +4523,13 @@ static void get_file_stream_info(struct ksmbd_work *work,
>                                               "::$DATA", 7, conn->local_nls, 0);
>                 streamlen *= 2;
>                 file_info->StreamNameLength = cpu_to_le32(streamlen);
> -               file_info->StreamSize = 0;
> -               file_info->StreamAllocationSize = 0;
> +               file_info->StreamSize = cpu_to_le64(stat.size);
> +               file_info->StreamAllocationSize = cpu_to_le64(stat.blocks << 9);
>                 nbytes += sizeof(struct smb2_file_stream_info) + streamlen;
>         }
>
>         /* last entry offset should be 0 */
>         file_info->NextEntryOffset = 0;
> -out:
>         kvfree(xattr_list);
>
>         rsp->OutputBufferLength = cpu_to_le32(nbytes);
> --
> 2.25.1
>
diff mbox series

Patch

diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c
index 82954b2b8d31..2067d5bab1b0 100644
--- a/fs/ksmbd/smb2pdu.c
+++ b/fs/ksmbd/smb2pdu.c
@@ -4457,6 +4457,12 @@  static void get_file_stream_info(struct ksmbd_work *work,
 			 &stat);
 	file_info = (struct smb2_file_stream_info *)rsp->Buffer;
 
+	buf_free_len =
+		smb2_calc_max_out_buf_len(work, 8,
+					  le32_to_cpu(req->OutputBufferLength));
+	if (buf_free_len < 0)
+		goto out;
+
 	xattr_list_len = ksmbd_vfs_listxattr(path->dentry, &xattr_list);
 	if (xattr_list_len < 0) {
 		goto out;
@@ -4465,12 +4471,6 @@  static void get_file_stream_info(struct ksmbd_work *work,
 		goto out;
 	}
 
-	buf_free_len =
-		smb2_calc_max_out_buf_len(work, 8,
-					  le32_to_cpu(req->OutputBufferLength));
-	if (buf_free_len < 0)
-		goto out;
-
 	while (idx < xattr_list_len) {
 		stream_name = xattr_list + idx;
 		streamlen = strlen(stream_name);
@@ -4514,6 +4514,7 @@  static void get_file_stream_info(struct ksmbd_work *work,
 		file_info->NextEntryOffset = cpu_to_le32(next);
 	}
 
+out:
 	if (!S_ISDIR(stat.mode) &&
 	    buf_free_len >= sizeof(struct smb2_file_stream_info) + 7 * 2) {
 		file_info = (struct smb2_file_stream_info *)
@@ -4522,14 +4523,13 @@  static void get_file_stream_info(struct ksmbd_work *work,
 					      "::$DATA", 7, conn->local_nls, 0);
 		streamlen *= 2;
 		file_info->StreamNameLength = cpu_to_le32(streamlen);
-		file_info->StreamSize = 0;
-		file_info->StreamAllocationSize = 0;
+		file_info->StreamSize = cpu_to_le64(stat.size);
+		file_info->StreamAllocationSize = cpu_to_le64(stat.blocks << 9);
 		nbytes += sizeof(struct smb2_file_stream_info) + streamlen;
 	}
 
 	/* last entry offset should be 0 */
 	file_info->NextEntryOffset = 0;
-out:
 	kvfree(xattr_list);
 
 	rsp->OutputBufferLength = cpu_to_le32(nbytes);