Skip to content

Commit d10c778

Browse files
namjaejeonSteve French
authored andcommitted
ksmbd: fix slab-out-of-bounds in smb_strndup_from_utf16()
If ->NameOffset/Length is bigger than ->CreateContextsOffset/Length, ksmbd_check_message doesn't validate request buffer it correctly. So slab-out-of-bounds warning from calling smb_strndup_from_utf16() in smb2_open() could happen. If ->NameLength is non-zero, Set the larger of the two sums (Name and CreateContext size) as the offset and length of the data area. Reported-by: Yang Chaoming <[email protected]> Cc: [email protected] Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent ceb6a6f commit d10c778

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

fs/smb/server/smb2misc.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,25 @@ static int smb2_get_data_area_len(unsigned int *off, unsigned int *len,
106106
break;
107107
case SMB2_CREATE:
108108
{
109+
unsigned short int name_off =
110+
le16_to_cpu(((struct smb2_create_req *)hdr)->NameOffset);
111+
unsigned short int name_len =
112+
le16_to_cpu(((struct smb2_create_req *)hdr)->NameLength);
113+
109114
if (((struct smb2_create_req *)hdr)->CreateContextsLength) {
110115
*off = le32_to_cpu(((struct smb2_create_req *)
111116
hdr)->CreateContextsOffset);
112117
*len = le32_to_cpu(((struct smb2_create_req *)
113118
hdr)->CreateContextsLength);
114-
break;
119+
if (!name_len)
120+
break;
121+
122+
if (name_off + name_len < (u64)*off + *len)
123+
break;
115124
}
116125

117-
*off = le16_to_cpu(((struct smb2_create_req *)hdr)->NameOffset);
118-
*len = le16_to_cpu(((struct smb2_create_req *)hdr)->NameLength);
126+
*off = name_off;
127+
*len = name_len;
119128
break;
120129
}
121130
case SMB2_QUERY_INFO:

0 commit comments

Comments
 (0)