Re: [bug report] ksmbd: add support for read compound

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

 



2023-09-11 23:31 GMT+09:00, Dan Carpenter <dan.carpenter@xxxxxxxxxx>:
> Hello Namjae Jeon,
Hi Dan,
>
> The patch e2b76ab8b5c9: "ksmbd: add support for read compound" from
> Aug 29, 2023 (linux-next), leads to the following Smatch static
> checker warning:
>
> 	fs/smb/server/smb2pdu.c:6329 smb2_read()
> 	warn: passing freed memory 'aux_payload_buf'
>
> fs/smb/server/smb2pdu.c
>     6283         ksmbd_debug(SMB, "filename %pD, offset %lld, len %zu\n",
>     6284                     fp->filp, offset, length);
>     6285
>     6286         aux_payload_buf = kvzalloc(length, GFP_KERNEL);
>     6287         if (!aux_payload_buf) {
>     6288                 err = -ENOMEM;
>     6289                 goto out;
>     6290         }
>     6291
>     6292         nbytes = ksmbd_vfs_read(work, fp, length, &offset,
> aux_payload_buf);
>     6293         if (nbytes < 0) {
>     6294                 err = nbytes;
>     6295                 goto out;
>     6296         }
>     6297
>     6298         if ((nbytes == 0 && length != 0) || nbytes < mincount) {
>     6299                 kvfree(aux_payload_buf);
>     6300                 rsp->hdr.Status = STATUS_END_OF_FILE;
>     6301                 smb2_set_err_rsp(work);
>     6302                 ksmbd_fd_put(work, fp);
>     6303                 return 0;
>     6304         }
>     6305
>     6306         ksmbd_debug(SMB, "nbytes %zu, offset %lld mincount %zu\n",
>     6307                     nbytes, offset, mincount);
>     6308
>     6309         if (is_rdma_channel == true) {
>     6310                 /* write data to the client using rdma channel */
>     6311                 remain_bytes = smb2_read_rdma_channel(work, req,
>     6312
> aux_payload_buf,
>     6313                                                       nbytes);
>     6314                 kvfree(aux_payload_buf);
>                          ^^^^^^^^^^^^^^^^^^^^^^^
> freed
>
>     6315
>     6316                 nbytes = 0;
>
> I guess probably it doesn't matter that we're passing a freed variable
> if nbytes is zero.
>  But could we also just set "aux_payload_buf = NULL"?
> I am not going to try silence this type of warning in Smatch.
Yes, It isn't a problem... but will fix it to make smatch happy.

Thanks.
>
>     6317                 if (remain_bytes < 0) {
>     6318                         err = (int)remain_bytes;
>     6319                         goto out;
>     6320                 }
>     6321         }
>     6322
>     6323         rsp->StructureSize = cpu_to_le16(17);
>     6324         rsp->DataOffset = 80;
>     6325         rsp->Reserved = 0;
>     6326         rsp->DataLength = cpu_to_le32(nbytes);
>     6327         rsp->DataRemaining = cpu_to_le32(remain_bytes);
>     6328         rsp->Flags = 0;
> --> 6329         err = ksmbd_iov_pin_rsp_read(work, (void *)rsp,
>     6330                                      offsetof(struct smb2_read_rsp,
> Buffer),
>     6331                                      aux_payload_buf, nbytes);
>                                               ^^^^^^^^^^^^^^^
> Passing free variable.
>
>
>     6332         if (err)
>     6333                 goto out;
>     6334         ksmbd_fd_put(work, fp);
>     6335         return 0;
>     6336
>     6337 out:
>     6338         if (err) {
>     6339                 if (err == -EISDIR)
>     6340                         rsp->hdr.Status =
> STATUS_INVALID_DEVICE_REQUEST;
>     6341                 else if (err == -EAGAIN)
>     6342                         rsp->hdr.Status =
> STATUS_FILE_LOCK_CONFLICT;
>     6343                 else if (err == -ENOENT)
>     6344                         rsp->hdr.Status = STATUS_FILE_CLOSED;
>     6345                 else if (err == -EACCES)
>     6346                         rsp->hdr.Status = STATUS_ACCESS_DENIED;
>     6347                 else if (err == -ESHARE)
>     6348                         rsp->hdr.Status =
> STATUS_SHARING_VIOLATION;
>     6349                 else if (err == -EINVAL)
>     6350                         rsp->hdr.Status =
> STATUS_INVALID_PARAMETER;
>     6351                 else
>     6352                         rsp->hdr.Status = STATUS_INVALID_HANDLE;
>     6353
>     6354                 smb2_set_err_rsp(work);
>     6355         }
>     6356         ksmbd_fd_put(work, fp);
>     6357         return err;
>     6358 }
>
> regards,
> dan carpenter
>



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

  Powered by Linux