aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/smb2misc.c37
-rw-r--r--fs/cifs/smb2pdu.c2
-rw-r--r--fs/cifs/smb2proto.h3
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 */
297char * 297char *
298smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr) 298smb2_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);
37extern int smb2_check_message(char *buf, unsigned int length, 37extern int smb2_check_message(char *buf, unsigned int length,
38 struct TCP_Server_Info *server); 38 struct TCP_Server_Info *server);
39extern unsigned int smb2_calc_size(void *buf, struct TCP_Server_Info *server); 39extern unsigned int smb2_calc_size(void *buf, struct TCP_Server_Info *server);
40extern char *smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr); 40extern char *smb2_get_data_area_len(int *off, int *len,
41 struct smb2_sync_hdr *shdr);
41extern __le16 *cifs_convert_path_to_utf16(const char *from, 42extern __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