Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cifs: change smb2_get_data_area_len to take a smb2_sync_hdr as argument

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>

authored by

Ronnie Sahlberg and committed by
Steve French
e4dc31fe 84f0cbfb

+22 -20
+19 -18
fs/cifs/smb2misc.c
··· 295 295 * area and the offset to it (from the beginning of the smb are also returned. 296 296 */ 297 297 char * 298 - smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr) 298 + smb2_get_data_area_len(int *off, int *len, struct smb2_sync_hdr *shdr) 299 299 { 300 - struct smb2_sync_hdr *shdr = get_sync_hdr(hdr); 301 300 *off = 0; 302 301 *len = 0; 303 302 304 303 /* error responses do not have data area */ 305 304 if (shdr->Status && shdr->Status != STATUS_MORE_PROCESSING_REQUIRED && 306 - (((struct smb2_err_rsp *)hdr)->StructureSize) == 305 + (((struct smb2_err_rsp *)shdr)->StructureSize) == 307 306 SMB2_ERROR_STRUCTURE_SIZE2) 308 307 return NULL; 309 308 ··· 314 315 switch (shdr->Command) { 315 316 case SMB2_NEGOTIATE: 316 317 *off = le16_to_cpu( 317 - ((struct smb2_negotiate_rsp *)hdr)->SecurityBufferOffset); 318 + ((struct smb2_negotiate_rsp *)shdr)->SecurityBufferOffset); 318 319 *len = le16_to_cpu( 319 - ((struct smb2_negotiate_rsp *)hdr)->SecurityBufferLength); 320 + ((struct smb2_negotiate_rsp *)shdr)->SecurityBufferLength); 320 321 break; 321 322 case SMB2_SESSION_SETUP: 322 323 *off = le16_to_cpu( 323 - ((struct smb2_sess_setup_rsp *)hdr)->SecurityBufferOffset); 324 + ((struct smb2_sess_setup_rsp *)shdr)->SecurityBufferOffset); 324 325 *len = le16_to_cpu( 325 - ((struct smb2_sess_setup_rsp *)hdr)->SecurityBufferLength); 326 + ((struct smb2_sess_setup_rsp *)shdr)->SecurityBufferLength); 326 327 break; 327 328 case SMB2_CREATE: 328 329 *off = le32_to_cpu( 329 - ((struct smb2_create_rsp *)hdr)->CreateContextsOffset); 330 + ((struct smb2_create_rsp *)shdr)->CreateContextsOffset); 330 331 *len = le32_to_cpu( 331 - ((struct smb2_create_rsp *)hdr)->CreateContextsLength); 332 + ((struct smb2_create_rsp *)shdr)->CreateContextsLength); 332 333 break; 333 334 case SMB2_QUERY_INFO: 334 335 *off = le16_to_cpu( 335 - ((struct smb2_query_info_rsp *)hdr)->OutputBufferOffset); 336 + ((struct smb2_query_info_rsp *)shdr)->OutputBufferOffset); 336 337 *len = le32_to_cpu( 337 - ((struct smb2_query_info_rsp *)hdr)->OutputBufferLength); 338 + ((struct smb2_query_info_rsp *)shdr)->OutputBufferLength); 338 339 break; 339 340 case SMB2_READ: 340 - *off = ((struct smb2_read_rsp *)hdr)->DataOffset; 341 - *len = le32_to_cpu(((struct smb2_read_rsp *)hdr)->DataLength); 341 + /* TODO: is this a bug ? */ 342 + *off = ((struct smb2_read_rsp *)shdr)->DataOffset; 343 + *len = le32_to_cpu(((struct smb2_read_rsp *)shdr)->DataLength); 342 344 break; 343 345 case SMB2_QUERY_DIRECTORY: 344 346 *off = le16_to_cpu( 345 - ((struct smb2_query_directory_rsp *)hdr)->OutputBufferOffset); 347 + ((struct smb2_query_directory_rsp *)shdr)->OutputBufferOffset); 346 348 *len = le32_to_cpu( 347 - ((struct smb2_query_directory_rsp *)hdr)->OutputBufferLength); 349 + ((struct smb2_query_directory_rsp *)shdr)->OutputBufferLength); 348 350 break; 349 351 case SMB2_IOCTL: 350 352 *off = le32_to_cpu( 351 - ((struct smb2_ioctl_rsp *)hdr)->OutputOffset); 352 - *len = le32_to_cpu(((struct smb2_ioctl_rsp *)hdr)->OutputCount); 353 + ((struct smb2_ioctl_rsp *)shdr)->OutputOffset); 354 + *len = le32_to_cpu( 355 + ((struct smb2_ioctl_rsp *)shdr)->OutputCount); 353 356 break; 354 357 case SMB2_CHANGE_NOTIFY: 355 358 default: ··· 412 411 if (has_smb2_data_area[le16_to_cpu(shdr->Command)] == false) 413 412 goto calc_size_exit; 414 413 415 - smb2_get_data_area_len(&offset, &data_length, (struct smb2_hdr *)buf); 414 + smb2_get_data_area_len(&offset, &data_length, shdr); 416 415 cifs_dbg(FYI, "SMB2 data length %d offset %d\n", data_length, offset); 417 416 418 417 if (data_length > 0) {
+1 -1
fs/cifs/smb2pdu.c
··· 767 767 server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES; 768 768 769 769 security_blob = smb2_get_data_area_len(&blob_offset, &blob_length, 770 - &rsp->hdr); 770 + &rsp->hdr.sync_hdr); 771 771 /* 772 772 * See MS-SMB2 section 2.2.4: if no blob, client picks default which 773 773 * for us will be
+2 -1
fs/cifs/smb2proto.h
··· 37 37 extern int smb2_check_message(char *buf, unsigned int length, 38 38 struct TCP_Server_Info *server); 39 39 extern unsigned int smb2_calc_size(void *buf, struct TCP_Server_Info *server); 40 - extern char *smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr); 40 + extern char *smb2_get_data_area_len(int *off, int *len, 41 + struct smb2_sync_hdr *shdr); 41 42 extern __le16 *cifs_convert_path_to_utf16(const char *from, 42 43 struct cifs_sb_info *cifs_sb); 43 44