| From 46a0f8b7db190ffdd9ade71faca1581062b10f6f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 8 May 2025 16:46:11 +0900 |
| Subject: ksmbd: fix stream write failure |
| |
| From: Namjae Jeon <linkinjeon@kernel.org> |
| |
| [ Upstream commit 1f4bbedd4e5a69b01cde2cc21d01151ab2d0884f ] |
| |
| If there is no stream data in file, v_len is zero. |
| So, If position(*pos) is zero, stream write will fail |
| due to stream write position validation check. |
| This patch reorganize stream write position validation. |
| |
| Fixes: 0ca6df4f40cf ("ksmbd: prevent out-of-bounds stream writes by validating *pos") |
| Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/smb/server/vfs.c | 14 ++++++-------- |
| 1 file changed, 6 insertions(+), 8 deletions(-) |
| |
| diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c |
| index f6616d687365a..3bbf238270605 100644 |
| --- a/fs/smb/server/vfs.c |
| +++ b/fs/smb/server/vfs.c |
| @@ -426,10 +426,15 @@ static int ksmbd_vfs_stream_write(struct ksmbd_file *fp, char *buf, loff_t *pos, |
| ksmbd_debug(VFS, "write stream data pos : %llu, count : %zd\n", |
| *pos, count); |
| |
| + if (*pos >= XATTR_SIZE_MAX) { |
| + pr_err("stream write position %lld is out of bounds\n", *pos); |
| + return -EINVAL; |
| + } |
| + |
| size = *pos + count; |
| if (size > XATTR_SIZE_MAX) { |
| size = XATTR_SIZE_MAX; |
| - count = (*pos + count) - XATTR_SIZE_MAX; |
| + count = XATTR_SIZE_MAX - *pos; |
| } |
| |
| v_len = ksmbd_vfs_getcasexattr(idmap, |
| @@ -443,13 +448,6 @@ static int ksmbd_vfs_stream_write(struct ksmbd_file *fp, char *buf, loff_t *pos, |
| goto out; |
| } |
| |
| - if (v_len <= *pos) { |
| - pr_err("stream write position %lld is out of bounds (stream length: %zd)\n", |
| - *pos, v_len); |
| - err = -EINVAL; |
| - goto out; |
| - } |
| - |
| if (v_len < size) { |
| wbuf = kvzalloc(size, GFP_KERNEL); |
| if (!wbuf) { |
| -- |
| 2.39.5 |
| |