diff options
| author | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
|---|---|---|
| committer | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
| commit | c74a7469f97c0f40b46e82ee979f9fb1bb6e847c (patch) | |
| tree | f2690a1a916b73ef94657fbf0e0141ae57701825 /fs/cifs/cifsencrypt.c | |
| parent | 6f15a7de86c8cf2dc09fc9e6d07047efa40ef809 (diff) | |
| parent | 500775074f88d9cf5416bed2ca19592812d62c41 (diff) | |
Merge drm/drm-next into drm-intel-next-queued
We need a backmerge to get DP_DPCD_REV_14 before we push other
i915 changes to dinq that could break compilation.
Signed-off-by: Rodrigo Vivi <[email protected]>
Diffstat (limited to 'fs/cifs/cifsencrypt.c')
| -rw-r--r-- | fs/cifs/cifsencrypt.c | 27 | 
1 files changed, 18 insertions, 9 deletions
| diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index a6ef088e057b..ee2a8ec70056 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c @@ -44,19 +44,27 @@ int __cifs_calc_signature(struct smb_rqst *rqst,  	int rc;  	struct kvec *iov = rqst->rq_iov;  	int n_vec = rqst->rq_nvec; +	int is_smb2 = server->vals->header_preamble_size == 0; -	if (n_vec < 2 || iov[0].iov_len != 4) -		return -EIO; +	/* iov[0] is actual data and not the rfc1002 length for SMB2+ */ +	if (is_smb2) { +		if (iov[0].iov_len <= 4) +			return -EIO; +		i = 0; +	} else { +		if (n_vec < 2 || iov[0].iov_len != 4) +			return -EIO; +		i = 1; /* skip rfc1002 length */ +	} -	for (i = 1; i < n_vec; i++) { +	for (; i < n_vec; i++) {  		if (iov[i].iov_len == 0)  			continue;  		if (iov[i].iov_base == NULL) {  			cifs_dbg(VFS, "null iovec entry\n");  			return -EIO;  		} -		if (i == 1 && iov[1].iov_len <= 4) -			break; /* nothing to sign or corrupt header */ +  		rc = crypto_shash_update(shash,  					 iov[i].iov_base, iov[i].iov_len);  		if (rc) { @@ -68,11 +76,12 @@ int __cifs_calc_signature(struct smb_rqst *rqst,  	/* now hash over the rq_pages array */  	for (i = 0; i < rqst->rq_npages; i++) { -		void *kaddr = kmap(rqst->rq_pages[i]); -		size_t len = rqst->rq_pagesz; +		void *kaddr; +		unsigned int len, offset; + +		rqst_page_get_length(rqst, i, &len, &offset); -		if (i == rqst->rq_npages - 1) -			len = rqst->rq_tailsz; +		kaddr = (char *) kmap(rqst->rq_pages[i]) + offset;  		crypto_shash_update(shash, kaddr, len); |