···295295 * area and the offset to it (from the beginning of the smb are also returned.296296 */297297char *298298-smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr)298298+smb2_get_data_area_len(int *off, int *len, struct smb2_sync_hdr *shdr)299299{300300- struct smb2_sync_hdr *shdr = get_sync_hdr(hdr);301300 *off = 0;302301 *len = 0;303302304303 /* error responses do not have data area */305304 if (shdr->Status && shdr->Status != STATUS_MORE_PROCESSING_REQUIRED &&306306- (((struct smb2_err_rsp *)hdr)->StructureSize) ==305305+ (((struct smb2_err_rsp *)shdr)->StructureSize) ==307306 SMB2_ERROR_STRUCTURE_SIZE2)308307 return NULL;309308···314315 switch (shdr->Command) {315316 case SMB2_NEGOTIATE:316317 *off = le16_to_cpu(317317- ((struct smb2_negotiate_rsp *)hdr)->SecurityBufferOffset);318318+ ((struct smb2_negotiate_rsp *)shdr)->SecurityBufferOffset);318319 *len = le16_to_cpu(319319- ((struct smb2_negotiate_rsp *)hdr)->SecurityBufferLength);320320+ ((struct smb2_negotiate_rsp *)shdr)->SecurityBufferLength);320321 break;321322 case SMB2_SESSION_SETUP:322323 *off = le16_to_cpu(323323- ((struct smb2_sess_setup_rsp *)hdr)->SecurityBufferOffset);324324+ ((struct smb2_sess_setup_rsp *)shdr)->SecurityBufferOffset);324325 *len = le16_to_cpu(325325- ((struct smb2_sess_setup_rsp *)hdr)->SecurityBufferLength);326326+ ((struct smb2_sess_setup_rsp *)shdr)->SecurityBufferLength);326327 break;327328 case SMB2_CREATE:328329 *off = le32_to_cpu(329329- ((struct smb2_create_rsp *)hdr)->CreateContextsOffset);330330+ ((struct smb2_create_rsp *)shdr)->CreateContextsOffset);330331 *len = le32_to_cpu(331331- ((struct smb2_create_rsp *)hdr)->CreateContextsLength);332332+ ((struct smb2_create_rsp *)shdr)->CreateContextsLength);332333 break;333334 case SMB2_QUERY_INFO:334335 *off = le16_to_cpu(335335- ((struct smb2_query_info_rsp *)hdr)->OutputBufferOffset);336336+ ((struct smb2_query_info_rsp *)shdr)->OutputBufferOffset);336337 *len = le32_to_cpu(337337- ((struct smb2_query_info_rsp *)hdr)->OutputBufferLength);338338+ ((struct smb2_query_info_rsp *)shdr)->OutputBufferLength);338339 break;339340 case SMB2_READ:340340- *off = ((struct smb2_read_rsp *)hdr)->DataOffset;341341- *len = le32_to_cpu(((struct smb2_read_rsp *)hdr)->DataLength);341341+ /* TODO: is this a bug ? */342342+ *off = ((struct smb2_read_rsp *)shdr)->DataOffset;343343+ *len = le32_to_cpu(((struct smb2_read_rsp *)shdr)->DataLength);342344 break;343345 case SMB2_QUERY_DIRECTORY:344346 *off = le16_to_cpu(345345- ((struct smb2_query_directory_rsp *)hdr)->OutputBufferOffset);347347+ ((struct smb2_query_directory_rsp *)shdr)->OutputBufferOffset);346348 *len = le32_to_cpu(347347- ((struct smb2_query_directory_rsp *)hdr)->OutputBufferLength);349349+ ((struct smb2_query_directory_rsp *)shdr)->OutputBufferLength);348350 break;349351 case SMB2_IOCTL:350352 *off = le32_to_cpu(351351- ((struct smb2_ioctl_rsp *)hdr)->OutputOffset);352352- *len = le32_to_cpu(((struct smb2_ioctl_rsp *)hdr)->OutputCount);353353+ ((struct smb2_ioctl_rsp *)shdr)->OutputOffset);354354+ *len = le32_to_cpu(355355+ ((struct smb2_ioctl_rsp *)shdr)->OutputCount);353356 break;354357 case SMB2_CHANGE_NOTIFY:355358 default:···412411 if (has_smb2_data_area[le16_to_cpu(shdr->Command)] == false)413412 goto calc_size_exit;414413415415- smb2_get_data_area_len(&offset, &data_length, (struct smb2_hdr *)buf);414414+ smb2_get_data_area_len(&offset, &data_length, shdr);416415 cifs_dbg(FYI, "SMB2 data length %d offset %d\n", data_length, offset);417416418417 if (data_length > 0) {
+1-1
fs/cifs/smb2pdu.c
···767767 server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES;768768769769 security_blob = smb2_get_data_area_len(&blob_offset, &blob_length,770770- &rsp->hdr);770770+ &rsp->hdr.sync_hdr);771771 /*772772 * See MS-SMB2 section 2.2.4: if no blob, client picks default which773773 * for us will be
+2-1
fs/cifs/smb2proto.h
···3737extern int smb2_check_message(char *buf, unsigned int length,3838 struct TCP_Server_Info *server);3939extern unsigned int smb2_calc_size(void *buf, struct TCP_Server_Info *server);4040-extern char *smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr);4040+extern char *smb2_get_data_area_len(int *off, int *len,4141+ struct smb2_sync_hdr *shdr);4142extern __le16 *cifs_convert_path_to_utf16(const char *from,4243 struct cifs_sb_info *cifs_sb);4344