Re: [PATCH] cifs: fix return value for cifs_listxattr

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

 



Merged into cifs-2.6.git for-next.  This is very exciting ... each
xfstest that we fix gets us closer to the goal of getting all
reasonable xfstests for network fs to pass ... and getting rid of
noisy xfstest failures and skips makes it much more likely that we can
catch regressions earlier.
On Thu, Oct 25, 2018 at 12:43 AM Ronnie Sahlberg <lsahlber@xxxxxxxxxx> wrote:
>
> If the application buffer was too small to fit all the names
> we would still count the number of bytes and return this for
> listxattr. This would then trigger a BUG in usercopy.c
>
> Fix the computation of the size so that we return -ERANGE
> correctly when the buffer is too small.
>
> This fixes the kernel BUG for xfstest generic/377
>
> Signed-off-by: Ronnie Sahlberg <lsahlber@xxxxxxxxxx>
> ---
>  fs/cifs/smb2ops.c | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index f85fc5aa2710..59dc9ae0ecfd 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -747,6 +747,7 @@ move_smb2_ea_to_cifs(char *dst, size_t dst_size,
>         int rc = 0;
>         unsigned int ea_name_len = ea_name ? strlen(ea_name) : 0;
>         char *name, *value;
> +       size_t buf_size = dst_size;
>         size_t name_len, value_len, user_name_len;
>
>         while (src_size > 0) {
> @@ -782,9 +783,10 @@ move_smb2_ea_to_cifs(char *dst, size_t dst_size,
>                         /* 'user.' plus a terminating null */
>                         user_name_len = 5 + 1 + name_len;
>
> -                       rc += user_name_len;
> -
> -                       if (dst_size >= user_name_len) {
> +                       if (buf_size == 0) {
> +                               /* skip copy - calc size only */
> +                               rc += user_name_len;
> +                       } else if (dst_size >= user_name_len) {
>                                 dst_size -= user_name_len;
>                                 memcpy(dst, "user.", 5);
>                                 dst += 5;
> @@ -792,8 +794,7 @@ move_smb2_ea_to_cifs(char *dst, size_t dst_size,
>                                 dst += name_len;
>                                 *dst = 0;
>                                 ++dst;
> -                       } else if (dst_size == 0) {
> -                               /* skip copy - calc size only */
> +                               rc += user_name_len;
>                         } else {
>                                 /* stop before overrun buffer */
>                                 rc = -ERANGE;
> --
> 2.13.6
>


-- 
Thanks,

Steve



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

  Powered by Linux