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