[PATCHv2][CIFS] Workaround MacOS server problem with SMB2.1 write response

Shirish Pargaonkar shirishpargaonkar at gmail.com
Wed Oct 15 20:10:43 MDT 2014


Acked-by: Shirish Pargaonkar <shirishpargaonkar at gmail.com>

On Fri, Aug 15, 2014 at 11:54 PM, Steve French <smfrench at gmail.com> wrote:
> Writes fail to Mac servers with SMB2.1 mounts (works with cifs though) due
> to them sending an incorrect RFC1001 length for the SMB2.1 Write response.
> Workaround this problem. MacOS server sends a write response with 3 bytes
> of pad beyond the end of the SMB itself.  The RFC1001 length is 3 bytes
> more than the sum of the SMB2.1 header length + the write reponse.
>
> Incorporate feedback from Jeff and JRA to allow servers to send
> a tcp frame that is even more than three bytes too long
> (ie much longer than the SMB2/SMB3 request that it contains) but
> we do log it once now. In the earlier version of the patch I had
> limited how far off the length field could be before we fail the request.
>
> Signed-off-by: Steve French <smfrench at gmail.com>
> ---
>  fs/cifs/smb2misc.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c
> index f2e6ac2..4aa7a0f 100644
> --- a/fs/cifs/smb2misc.c
> +++ b/fs/cifs/smb2misc.c
> @@ -178,9 +178,24 @@ smb2_check_message(char *buf, unsigned int length)
>          /* Windows 7 server returns 24 bytes more */
>          if (clc_len + 20 == len && command == SMB2_OPLOCK_BREAK_HE)
>              return 0;
> -        /* server can return one byte more */
> +        /* server can return one byte more due to implied bcc[0] */
>          if (clc_len == 4 + len + 1)
>              return 0;
> +
> +        /*
> +         * MacOS server pads after SMB2.1 write response with 3 bytes
> +         * of junk. Other servers match RFC1001 len to actual
> +         * SMB2/SMB3 frame length (header + smb2 response specific data)
> +         * Log the server error (once), but allow it and continue
> +         * since the frame is parseable.
> +         */
> +        if (clc_len < 4 /* RFC1001 header size */ + len) {
> +            printk_once(KERN_WARNING
> +                "SMB2 server sent bad RFC1001 len %d not %d\n",
> +                len, clc_len - 4);
> +            return 0;
> +        }
> +
>          return 1;
>      }
>      return 0;
>
> --
> Thanks,
>
> Steve
> --
> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


More information about the samba-technical mailing list