diff options
Diffstat (limited to 'fs/cifs/smb2misc.c')
| -rw-r--r-- | fs/cifs/smb2misc.c | 37 |
1 files changed, 19 insertions, 18 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) { |
