Re: [PATCH] ksmbd: smbd: handle multiple Buffer Decriptors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hyunchul,

I love your patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.18-rc1 next-20220401]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Hyunchul-Lee/ksmbd-smbd-handle-multiple-Buffer-Decriptors/20220404-073255
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git be2d3ecedd9911fbfd7e55cc9ceac5f8b79ae4cf
config: mips-randconfig-s032-20220404 (https://download.01.org/0day-ci/archive/20220404/202204041107.rehlU2wE-lkp@xxxxxxxxx/config)
compiler: mips-linux-gcc (GCC) 11.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-dirty
        # https://github.com/intel-lab-lkp/linux/commit/3b3063c454ee836c82afc4a47004165038971cc4
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Hyunchul-Lee/ksmbd-smbd-handle-multiple-Buffer-Decriptors/20220404-073255
        git checkout 3b3063c454ee836c82afc4a47004165038971cc4
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=mips SHELL=/bin/bash fs/ksmbd/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>


sparse warnings: (new ones prefixed by >>)
   command-line: note: in included file:
   builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_ACQUIRE redefined
   builtin:0:0: sparse: this was the original definition
   builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_SEQ_CST redefined
   builtin:0:0: sparse: this was the original definition
   builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_ACQ_REL redefined
   builtin:0:0: sparse: this was the original definition
   builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_RELEASE redefined
   builtin:0:0: sparse: this was the original definition
>> fs/ksmbd/smb2pdu.c:6193:40: sparse: sparse: cast to restricted __le32
>> fs/ksmbd/smb2pdu.c:6193:40: sparse: sparse: cast from restricted __le16
   fs/ksmbd/smb2pdu.c:6195:21: sparse: sparse: cast to restricted __le32
   fs/ksmbd/smb2pdu.c:6195:21: sparse: sparse: cast from restricted __le16

vim +6193 fs/ksmbd/smb2pdu.c

  6164	
  6165	/**
  6166	 * smb2_read() - handler for smb2 read from file
  6167	 * @work:	smb work containing read command buffer
  6168	 *
  6169	 * Return:	0 on success, otherwise error
  6170	 */
  6171	int smb2_read(struct ksmbd_work *work)
  6172	{
  6173		struct ksmbd_conn *conn = work->conn;
  6174		struct smb2_read_req *req;
  6175		struct smb2_read_rsp *rsp;
  6176		struct ksmbd_file *fp = NULL;
  6177		loff_t offset;
  6178		size_t length, mincount;
  6179		ssize_t nbytes = 0, remain_bytes = 0;
  6180		int err = 0;
  6181	
  6182		WORK_BUFFERS(work, req, rsp);
  6183	
  6184		if (test_share_config_flag(work->tcon->share_conf,
  6185					   KSMBD_SHARE_FLAG_PIPE)) {
  6186			ksmbd_debug(SMB, "IPC pipe read request\n");
  6187			return smb2_read_pipe(work);
  6188		}
  6189	
  6190		if (req->Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE ||
  6191		    req->Channel == SMB2_CHANNEL_RDMA_V1) {
  6192			struct smb2_buffer_desc_v1 *descs = (struct smb2_buffer_desc_v1 *)
> 6193				((char *)req + le32_to_cpu(req->ReadChannelInfoOffset));
  6194	
  6195			if (le32_to_cpu(req->ReadChannelInfoOffset) <
  6196			    offsetof(struct smb2_read_req, Buffer)) {
  6197				err = -EINVAL;
  6198				goto out;
  6199			}
  6200	
  6201			err = smb2_validate_rdma_buffer_descs(work,
  6202							      descs,
  6203							      req->Channel,
  6204							      req->ReadChannelInfoOffset,
  6205							      req->ReadChannelInfoLength);
  6206			if (err)
  6207				goto out;
  6208		}
  6209	
  6210		fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId);
  6211		if (!fp) {
  6212			err = -ENOENT;
  6213			goto out;
  6214		}
  6215	
  6216		if (!(fp->daccess & (FILE_READ_DATA_LE | FILE_READ_ATTRIBUTES_LE))) {
  6217			pr_err("Not permitted to read : 0x%x\n", fp->daccess);
  6218			err = -EACCES;
  6219			goto out;
  6220		}
  6221	
  6222		offset = le64_to_cpu(req->Offset);
  6223		length = le32_to_cpu(req->Length);
  6224		mincount = le32_to_cpu(req->MinimumCount);
  6225	
  6226		if (length > conn->vals->max_read_size) {
  6227			ksmbd_debug(SMB, "limiting read size to max size(%u)\n",
  6228				    conn->vals->max_read_size);
  6229			err = -EINVAL;
  6230			goto out;
  6231		}
  6232	
  6233		ksmbd_debug(SMB, "filename %pd, offset %lld, len %zu\n",
  6234			    fp->filp->f_path.dentry, offset, length);
  6235	
  6236		work->aux_payload_buf = kvmalloc(length, GFP_KERNEL | __GFP_ZERO);
  6237		if (!work->aux_payload_buf) {
  6238			err = -ENOMEM;
  6239			goto out;
  6240		}
  6241	
  6242		nbytes = ksmbd_vfs_read(work, fp, length, &offset);
  6243		if (nbytes < 0) {
  6244			err = nbytes;
  6245			goto out;
  6246		}
  6247	
  6248		if ((nbytes == 0 && length != 0) || nbytes < mincount) {
  6249			kvfree(work->aux_payload_buf);
  6250			work->aux_payload_buf = NULL;
  6251			rsp->hdr.Status = STATUS_END_OF_FILE;
  6252			smb2_set_err_rsp(work);
  6253			goto out;
  6254		}
  6255	
  6256		ksmbd_debug(SMB, "nbytes %zu, offset %lld mincount %zu\n",
  6257			    nbytes, offset, mincount);
  6258	
  6259		if (req->Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE ||
  6260		    req->Channel == SMB2_CHANNEL_RDMA_V1) {
  6261			/* write data to the client using rdma channel */
  6262			remain_bytes = smb2_read_rdma_channel(work, req,
  6263							      work->aux_payload_buf,
  6264							      nbytes);
  6265			kvfree(work->aux_payload_buf);
  6266			work->aux_payload_buf = NULL;
  6267	
  6268			nbytes = 0;
  6269			if (remain_bytes < 0) {
  6270				err = (int)remain_bytes;
  6271				goto out;
  6272			}
  6273		}
  6274	
  6275		rsp->StructureSize = cpu_to_le16(17);
  6276		rsp->DataOffset = 80;
  6277		rsp->Reserved = 0;
  6278		rsp->DataLength = cpu_to_le32(nbytes);
  6279		rsp->DataRemaining = cpu_to_le32(remain_bytes);
  6280		rsp->Flags = 0;
  6281		inc_rfc1001_len(work->response_buf, 16);
  6282		work->resp_hdr_sz = get_rfc1002_len(work->response_buf) + 4;
  6283		work->aux_payload_sz = nbytes;
  6284		inc_rfc1001_len(work->response_buf, nbytes);
  6285		ksmbd_fd_put(work, fp);
  6286		return 0;
  6287	
  6288	out:
  6289		if (err) {
  6290			if (err == -EISDIR)
  6291				rsp->hdr.Status = STATUS_INVALID_DEVICE_REQUEST;
  6292			else if (err == -EAGAIN)
  6293				rsp->hdr.Status = STATUS_FILE_LOCK_CONFLICT;
  6294			else if (err == -ENOENT)
  6295				rsp->hdr.Status = STATUS_FILE_CLOSED;
  6296			else if (err == -EACCES)
  6297				rsp->hdr.Status = STATUS_ACCESS_DENIED;
  6298			else if (err == -ESHARE)
  6299				rsp->hdr.Status = STATUS_SHARING_VIOLATION;
  6300			else if (err == -EINVAL)
  6301				rsp->hdr.Status = STATUS_INVALID_PARAMETER;
  6302			else
  6303				rsp->hdr.Status = STATUS_INVALID_HANDLE;
  6304	
  6305			smb2_set_err_rsp(work);
  6306		}
  6307		ksmbd_fd_put(work, fp);
  6308		return err;
  6309	}
  6310	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp



[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux