Commit e4dc31fe authored by Ronnie Sahlberg's avatar Ronnie Sahlberg Committed by Steve French

cifs: change smb2_get_data_area_len to take a smb2_sync_hdr as argument

Signed-off-by: default avatarRonnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 84f0cbfb
...@@ -295,15 +295,14 @@ static const bool has_smb2_data_area[NUMBER_OF_SMB2_COMMANDS] = { ...@@ -295,15 +295,14 @@ static const bool has_smb2_data_area[NUMBER_OF_SMB2_COMMANDS] = {
* area and the offset to it (from the beginning of the smb are also returned. * area and the offset to it (from the beginning of the smb are also returned.
*/ */
char * char *
smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr) smb2_get_data_area_len(int *off, int *len, struct smb2_sync_hdr *shdr)
{ {
struct smb2_sync_hdr *shdr = get_sync_hdr(hdr);
*off = 0; *off = 0;
*len = 0; *len = 0;
/* error responses do not have data area */ /* error responses do not have data area */
if (shdr->Status && shdr->Status != STATUS_MORE_PROCESSING_REQUIRED && if (shdr->Status && shdr->Status != STATUS_MORE_PROCESSING_REQUIRED &&
(((struct smb2_err_rsp *)hdr)->StructureSize) == (((struct smb2_err_rsp *)shdr)->StructureSize) ==
SMB2_ERROR_STRUCTURE_SIZE2) SMB2_ERROR_STRUCTURE_SIZE2)
return NULL; return NULL;
...@@ -315,42 +314,44 @@ smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr) ...@@ -315,42 +314,44 @@ smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr)
switch (shdr->Command) { switch (shdr->Command) {
case SMB2_NEGOTIATE: case SMB2_NEGOTIATE:
*off = le16_to_cpu( *off = le16_to_cpu(
((struct smb2_negotiate_rsp *)hdr)->SecurityBufferOffset); ((struct smb2_negotiate_rsp *)shdr)->SecurityBufferOffset);
*len = le16_to_cpu( *len = le16_to_cpu(
((struct smb2_negotiate_rsp *)hdr)->SecurityBufferLength); ((struct smb2_negotiate_rsp *)shdr)->SecurityBufferLength);
break; break;
case SMB2_SESSION_SETUP: case SMB2_SESSION_SETUP:
*off = le16_to_cpu( *off = le16_to_cpu(
((struct smb2_sess_setup_rsp *)hdr)->SecurityBufferOffset); ((struct smb2_sess_setup_rsp *)shdr)->SecurityBufferOffset);
*len = le16_to_cpu( *len = le16_to_cpu(
((struct smb2_sess_setup_rsp *)hdr)->SecurityBufferLength); ((struct smb2_sess_setup_rsp *)shdr)->SecurityBufferLength);
break; break;
case SMB2_CREATE: case SMB2_CREATE:
*off = le32_to_cpu( *off = le32_to_cpu(
((struct smb2_create_rsp *)hdr)->CreateContextsOffset); ((struct smb2_create_rsp *)shdr)->CreateContextsOffset);
*len = le32_to_cpu( *len = le32_to_cpu(
((struct smb2_create_rsp *)hdr)->CreateContextsLength); ((struct smb2_create_rsp *)shdr)->CreateContextsLength);
break; break;
case SMB2_QUERY_INFO: case SMB2_QUERY_INFO:
*off = le16_to_cpu( *off = le16_to_cpu(
((struct smb2_query_info_rsp *)hdr)->OutputBufferOffset); ((struct smb2_query_info_rsp *)shdr)->OutputBufferOffset);
*len = le32_to_cpu( *len = le32_to_cpu(
((struct smb2_query_info_rsp *)hdr)->OutputBufferLength); ((struct smb2_query_info_rsp *)shdr)->OutputBufferLength);
break; break;
case SMB2_READ: case SMB2_READ:
*off = ((struct smb2_read_rsp *)hdr)->DataOffset; /* TODO: is this a bug ? */
*len = le32_to_cpu(((struct smb2_read_rsp *)hdr)->DataLength); *off = ((struct smb2_read_rsp *)shdr)->DataOffset;
*len = le32_to_cpu(((struct smb2_read_rsp *)shdr)->DataLength);
break; break;
case SMB2_QUERY_DIRECTORY: case SMB2_QUERY_DIRECTORY:
*off = le16_to_cpu( *off = le16_to_cpu(
((struct smb2_query_directory_rsp *)hdr)->OutputBufferOffset); ((struct smb2_query_directory_rsp *)shdr)->OutputBufferOffset);
*len = le32_to_cpu( *len = le32_to_cpu(
((struct smb2_query_directory_rsp *)hdr)->OutputBufferLength); ((struct smb2_query_directory_rsp *)shdr)->OutputBufferLength);
break; break;
case SMB2_IOCTL: case SMB2_IOCTL:
*off = le32_to_cpu( *off = le32_to_cpu(
((struct smb2_ioctl_rsp *)hdr)->OutputOffset); ((struct smb2_ioctl_rsp *)shdr)->OutputOffset);
*len = le32_to_cpu(((struct smb2_ioctl_rsp *)hdr)->OutputCount); *len = le32_to_cpu(
((struct smb2_ioctl_rsp *)shdr)->OutputCount);
break; break;
case SMB2_CHANGE_NOTIFY: case SMB2_CHANGE_NOTIFY:
default: default:
...@@ -411,7 +412,7 @@ smb2_calc_size(void *buf, struct TCP_Server_Info *srvr) ...@@ -411,7 +412,7 @@ smb2_calc_size(void *buf, struct TCP_Server_Info *srvr)
if (has_smb2_data_area[le16_to_cpu(shdr->Command)] == false) if (has_smb2_data_area[le16_to_cpu(shdr->Command)] == false)
goto calc_size_exit; goto calc_size_exit;
smb2_get_data_area_len(&offset, &data_length, (struct smb2_hdr *)buf); smb2_get_data_area_len(&offset, &data_length, shdr);
cifs_dbg(FYI, "SMB2 data length %d offset %d\n", data_length, offset); cifs_dbg(FYI, "SMB2 data length %d offset %d\n", data_length, offset);
if (data_length > 0) { if (data_length > 0) {
......
...@@ -767,7 +767,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) ...@@ -767,7 +767,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES; server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES;
security_blob = smb2_get_data_area_len(&blob_offset, &blob_length, security_blob = smb2_get_data_area_len(&blob_offset, &blob_length,
&rsp->hdr); &rsp->hdr.sync_hdr);
/* /*
* See MS-SMB2 section 2.2.4: if no blob, client picks default which * See MS-SMB2 section 2.2.4: if no blob, client picks default which
* for us will be * for us will be
......
...@@ -37,7 +37,8 @@ extern int map_smb2_to_linux_error(char *buf, bool log_err); ...@@ -37,7 +37,8 @@ extern int map_smb2_to_linux_error(char *buf, bool log_err);
extern int smb2_check_message(char *buf, unsigned int length, extern int smb2_check_message(char *buf, unsigned int length,
struct TCP_Server_Info *server); struct TCP_Server_Info *server);
extern unsigned int smb2_calc_size(void *buf, struct TCP_Server_Info *server); extern unsigned int smb2_calc_size(void *buf, struct TCP_Server_Info *server);
extern char *smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *hdr); extern char *smb2_get_data_area_len(int *off, int *len,
struct smb2_sync_hdr *shdr);
extern __le16 *cifs_convert_path_to_utf16(const char *from, extern __le16 *cifs_convert_path_to_utf16(const char *from,
struct cifs_sb_info *cifs_sb); struct cifs_sb_info *cifs_sb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment