mirror of
https://github.com/torvalds/linux.git
synced 2026-10-09 12:06:03 +02:00
ksmbd: report actual xattr value length in stream enumeration
get_file_stream_info() (FileStreamInformation QUERY_INFO) reported each enumerated stream's StreamSize/StreamAllocationSize as stream_name_len -- the byte length of the stream's *name*, not its data. This is the same bug class already fixed for EndOfFile/ AllocationSize on an open stream handle (ksmbd_stream_eof()), just missed at this second site: a client enumerating streams sees a size derived from the name string length instead of the stream's actual content length, inconsistent with what querying the same stream by handle reports. Compute the real value length the same way ksmbd_stream_eof() does, via ksmbd_vfs_casexattr_len() on the already-known xattr key. Assisted-by: Claude:claude-sonnet-5 Signed-off-by: Gael Blivet <gael.blivet@gmail.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
This commit is contained in:
parent
9907ed8457
commit
689f1eb371
|
|
@ -5952,6 +5952,8 @@ static int get_file_stream_info(struct ksmbd_work *work,
|
|||
struct kstat stat;
|
||||
const struct path *path = &fp->filp->f_path;
|
||||
ssize_t xattr_list_len;
|
||||
ssize_t slen;
|
||||
loff_t ssize;
|
||||
int nbytes = 0, streamlen, stream_name_len, next, idx = 0;
|
||||
int buf_free_len;
|
||||
int ret;
|
||||
|
|
@ -6013,8 +6015,20 @@ static int get_file_stream_info(struct ksmbd_work *work,
|
|||
streamlen *= 2;
|
||||
kfree(stream_buf);
|
||||
file_info->StreamNameLength = cpu_to_le32(streamlen);
|
||||
file_info->StreamSize = cpu_to_le64(stream_name_len);
|
||||
file_info->StreamAllocationSize = cpu_to_le64(stream_name_len);
|
||||
/*
|
||||
* stream_name_len is the byte length of the xattr's *name*,
|
||||
* not its value -- same class of bug ksmbd_stream_eof()
|
||||
* (smb2pdu.c) already fixes for EndOfFile/AllocationSize on
|
||||
* a stream handle; this enumeration path needs the same
|
||||
* real xattr value length, not the name length reused as a
|
||||
* size.
|
||||
*/
|
||||
slen = ksmbd_vfs_casexattr_len(file_mnt_idmap(fp->filp),
|
||||
path->dentry, stream_name,
|
||||
strlen(stream_name) + 1);
|
||||
ssize = slen < 0 ? 0 : (loff_t)slen;
|
||||
file_info->StreamSize = cpu_to_le64(ssize);
|
||||
file_info->StreamAllocationSize = cpu_to_le64(ssize);
|
||||
|
||||
nbytes += next;
|
||||
buf_free_len -= next;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user