Re: [PATCH] cifs: fix pcchunk length type in smb2_copychunk_range

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

 



I was also able to reproduce it by using xfs_io to execute copy_range
on a file of exactly 4GB and verified that the patches (both versions)
fix it.

On Fri, May 5, 2023 at 11:49 PM Steve French <smfrench@xxxxxxxxx> wrote:
>
> Wouldn't it be safer (since pcchunk->Length is a u32 to do the
> following minor change to your patch
>
>                 pcchunk->Length =
> -                       cpu_to_le32(min_t(u32, len, tcon->max_bytes_chunk));
> +                       cpu_to_le32(min_t(u64, len, tcon->max_bytes_chunk));
>
> Also added Cc: stable and Fixes: tags.  See attached.
>
> On Fri, May 5, 2023 at 2:48 PM Steve French <smfrench@xxxxxxxxx> wrote:
> >
> > Good catch
> >
> > On Fri, May 5, 2023, 14:31 Pawel Witek <pawel.ireneusz.witek@xxxxxxxxx> wrote:
> >>
> >> I've tried to copy a 5 GB file which resulted in -EINVAL (same for larger
> >> files). After wiresharking the protocol I've observed that one packet
> >> requests ioctl with 'Transfer Length: 0', to which the server responded
> >> with an error. Some investigation showed, that this happens when
> >> len=4294967296.
> >>
> >> On 5/5/23 18:47, Steve French wrote:
> >> > since pcchunk->Length is a 32 bit field doing cpu_to_le64 seems wrong.
> >> >
> >> > Perhaps one option is to split this into two lines do the minimum(u64, len, tcon->max_bytes_chunk) on one line and the cpu_to_le32 of the result on the next
> >> >
> >> > What is "len" in the example you see failing?
> >> >
> >> > On Fri, May 5, 2023 at 10:15 AM Pawel Witek <pawel.ireneusz.witek@xxxxxxxxx <mailto:pawel.ireneusz.witek@xxxxxxxxx>> wrote:
> >> >
> >> >     Change type of pcchunk->Length from u32 to u64 to match
> >> >     smb2_copychunk_range arguments type. Fixes the problem where performing
> >> >     server-side copy with CIFS_IOC_COPYCHUNK_FILE ioctl resulted in incomplete
> >> >     copy of large files while returning -EINVAL.
> >> >
> >> >     Signed-off-by: Pawel Witek <pawel.ireneusz.witek@xxxxxxxxx <mailto:pawel.ireneusz.witek@xxxxxxxxx>>
> >> >     ---
> >> >      fs/cifs/smb2ops.c | 2 +-
> >> >      1 file changed, 1 insertion(+), 1 deletion(-)
> >> >
> >> >     diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> >> >     index a81758225fcd..35c7c35882c9 100644
> >> >     --- a/fs/cifs/smb2ops.c
> >> >     +++ b/fs/cifs/smb2ops.c
> >> >     @@ -1682,7 +1682,7 @@ smb2_copychunk_range(const unsigned int xid,
> >> >                     pcchunk->SourceOffset = cpu_to_le64(src_off);
> >> >                     pcchunk->TargetOffset = cpu_to_le64(dest_off);
> >> >                     pcchunk->Length =
> >> >     -                       cpu_to_le32(min_t(u32, len, tcon->max_bytes_chunk));
> >> >     +                       cpu_to_le64(min_t(u64, len, tcon->max_bytes_chunk));
> >> >
> >> >                     /* Request server copy to target from src identified by key */
> >> >                     kfree(retbuf);
> >> >     --
> >> >     2.40.1
> >> >
> >> >
> >> >
> >> >
> >> > --
> >> > Thanks,
> >> >
> >> > Steve
>
>
>
> --
> Thanks,
>
> Steve



-- 
Thanks,

Steve




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

  Powered by Linux