ksmbd: add the check to vaildate if stream protocol length exceeds maximum value
This patch add MAX_STREAM_PROT_LEN macro and check if stream protocol length exceeds maximum value. opencode pdu size check in ksmbd_pdu_size_has_room(). Cc: Tom Talpey <tom@talpey.com> Cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> Cc: Ralph Böhme <slow@samba.org> Acked-by: Hyunchul Lee <hyc.lee@gmail.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
committed by
Steve French
parent
9e1ff307c7
commit
3639999011
@@ -296,10 +296,12 @@ int ksmbd_conn_handler_loop(void *p)
|
|||||||
pdu_size = get_rfc1002_len(hdr_buf);
|
pdu_size = get_rfc1002_len(hdr_buf);
|
||||||
ksmbd_debug(CONN, "RFC1002 header %u bytes\n", pdu_size);
|
ksmbd_debug(CONN, "RFC1002 header %u bytes\n", pdu_size);
|
||||||
|
|
||||||
/* make sure we have enough to get to SMB header end */
|
/*
|
||||||
if (!ksmbd_pdu_size_has_room(pdu_size)) {
|
* Check if pdu size is valid (min : smb header size,
|
||||||
ksmbd_debug(CONN, "SMB request too short (%u bytes)\n",
|
* max : 0x00FFFFFF).
|
||||||
pdu_size);
|
*/
|
||||||
|
if (pdu_size < __SMB2_HEADER_STRUCTURE_SIZE ||
|
||||||
|
pdu_size > MAX_STREAM_PROT_LEN) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ static const char basechars[43] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_-!@#$%";
|
|||||||
#define MAGIC_CHAR '~'
|
#define MAGIC_CHAR '~'
|
||||||
#define PERIOD '.'
|
#define PERIOD '.'
|
||||||
#define mangle(V) ((char)(basechars[(V) % MANGLE_BASE]))
|
#define mangle(V) ((char)(basechars[(V) % MANGLE_BASE]))
|
||||||
#define KSMBD_MIN_SUPPORTED_HEADER_SIZE (sizeof(struct smb2_hdr))
|
|
||||||
|
|
||||||
struct smb_protocol {
|
struct smb_protocol {
|
||||||
int index;
|
int index;
|
||||||
@@ -294,11 +293,6 @@ int ksmbd_init_smb_server(struct ksmbd_work *work)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ksmbd_pdu_size_has_room(unsigned int pdu)
|
|
||||||
{
|
|
||||||
return (pdu >= KSMBD_MIN_SUPPORTED_HEADER_SIZE - 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level,
|
int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level,
|
||||||
struct ksmbd_file *dir,
|
struct ksmbd_file *dir,
|
||||||
struct ksmbd_dir_info *d_info,
|
struct ksmbd_dir_info *d_info,
|
||||||
|
|||||||
@@ -48,6 +48,8 @@
|
|||||||
#define CIFS_DEFAULT_IOSIZE (64 * 1024)
|
#define CIFS_DEFAULT_IOSIZE (64 * 1024)
|
||||||
#define MAX_CIFS_SMALL_BUFFER_SIZE 448 /* big enough for most */
|
#define MAX_CIFS_SMALL_BUFFER_SIZE 448 /* big enough for most */
|
||||||
|
|
||||||
|
#define MAX_STREAM_PROT_LEN 0x00FFFFFF
|
||||||
|
|
||||||
/* Responses when opening a file. */
|
/* Responses when opening a file. */
|
||||||
#define F_SUPERSEDED 0
|
#define F_SUPERSEDED 0
|
||||||
#define F_OPENED 1
|
#define F_OPENED 1
|
||||||
@@ -493,8 +495,6 @@ int ksmbd_lookup_dialect_by_id(__le16 *cli_dialects, __le16 dialects_count);
|
|||||||
|
|
||||||
int ksmbd_init_smb_server(struct ksmbd_work *work);
|
int ksmbd_init_smb_server(struct ksmbd_work *work);
|
||||||
|
|
||||||
bool ksmbd_pdu_size_has_room(unsigned int pdu);
|
|
||||||
|
|
||||||
struct ksmbd_kstat;
|
struct ksmbd_kstat;
|
||||||
int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work,
|
int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work,
|
||||||
int info_level,
|
int info_level,
|
||||||
|
|||||||
Reference in New Issue
Block a user