Commit 04e26094 authored by Namjae Jeon's avatar Namjae Jeon Committed by Steve French
Browse files

ksmbd: don't align last entry offset in smb2 query directory



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: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 97550c74
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -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);
+1 −0
Original line number Original line Diff line number Diff line
@@ -47,6 +47,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 {