ksmbd: don't align last entry offset in smb2 query directory
[ Upstream commit 04e260948a160d3b7d622bf4c8a96fa4577c09bd ] When checking smb2 query directory packets from other servers, OutputBufferLength is different with ksmbd. Other servers add an unaligned next offset to OutputBufferLength for the last entry. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
03dd71e0b9
commit
5644bf688e
|
@ -3422,9 +3422,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
|
||||||
goto free_conv_name;
|
goto free_conv_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct_sz = readdir_info_level_struct_sz(info_level);
|
struct_sz = readdir_info_level_struct_sz(info_level) - 1 + conv_len;
|
||||||
next_entry_offset = ALIGN(struct_sz - 1 + conv_len,
|
next_entry_offset = ALIGN(struct_sz, KSMBD_DIR_INFO_ALIGNMENT);
|
||||||
KSMBD_DIR_INFO_ALIGNMENT);
|
d_info->last_entry_off_align = next_entry_offset - struct_sz;
|
||||||
|
|
||||||
if (next_entry_offset > d_info->out_buf_len) {
|
if (next_entry_offset > d_info->out_buf_len) {
|
||||||
d_info->out_buf_len = 0;
|
d_info->out_buf_len = 0;
|
||||||
|
@ -3976,6 +3976,7 @@ int smb2_query_dir(struct ksmbd_work *work)
|
||||||
((struct file_directory_info *)
|
((struct file_directory_info *)
|
||||||
((char *)rsp->Buffer + d_info.last_entry_offset))
|
((char *)rsp->Buffer + d_info.last_entry_offset))
|
||||||
->NextEntryOffset = 0;
|
->NextEntryOffset = 0;
|
||||||
|
d_info.data_count -= d_info.last_entry_off_align;
|
||||||
|
|
||||||
rsp->StructureSize = cpu_to_le16(9);
|
rsp->StructureSize = cpu_to_le16(9);
|
||||||
rsp->OutputBufferOffset = cpu_to_le16(72);
|
rsp->OutputBufferOffset = cpu_to_le16(72);
|
||||||
|
|
|
@ -86,6 +86,7 @@ struct ksmbd_dir_info {
|
||||||
int last_entry_offset;
|
int last_entry_offset;
|
||||||
bool hide_dot_file;
|
bool hide_dot_file;
|
||||||
int flags;
|
int flags;
|
||||||
|
int last_entry_off_align;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ksmbd_readdir_data {
|
struct ksmbd_readdir_data {
|
||||||
|
|
Loading…
Reference in New Issue