Commit 5242fcb7 authored by Ronnie Sahlberg's avatar Ronnie Sahlberg Committed by Steve French
Browse files

cifs: fix bi-directional fsctl passthrough calls



SMB2 Ioctl responses from servers may respond with both the request blob from
the client followed by the actual reply blob for ioctls that are bi-directional.

In that case we can not assume that the reply blob comes immediately after the
ioctl response structure.

This fixes FSCTLs such as SMB2:FSCTL_QUERY_ALLOCATED_RANGES

Signed-off-by: default avatarRonnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 4739f232
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -1462,12 +1462,19 @@ smb2_ioctl_query_info(const unsigned int xid,
		io_rsp = (struct smb2_ioctl_rsp *)rsp_iov[1].iov_base;
		if (le32_to_cpu(io_rsp->OutputCount) < qi.input_buffer_length)
			qi.input_buffer_length = le32_to_cpu(io_rsp->OutputCount);
		if (qi.input_buffer_length > 0 &&
		    le32_to_cpu(io_rsp->OutputOffset) + qi.input_buffer_length > rsp_iov[1].iov_len) {
			rc = -EFAULT;
			goto iqinf_exit;
		}
		if (copy_to_user(&pqi->input_buffer_length, &qi.input_buffer_length,
				 sizeof(qi.input_buffer_length))) {
			rc = -EFAULT;
			goto iqinf_exit;
		}
		if (copy_to_user(pqi + 1, &io_rsp[1], qi.input_buffer_length)) {
		if (copy_to_user((void __user *)pqi + sizeof(struct smb_query_info),
				 (const void *)io_rsp + le32_to_cpu(io_rsp->OutputOffset),
				 qi.input_buffer_length)) {
			rc = -EFAULT;
			goto iqinf_exit;
		}