Skip to content

Commit 754789a

Browse files
committed
[CIFS] Workaround MacOS server problem with SMB2.1 write
response 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@gmail.com>
1 parent 0244080 commit 754789a

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

fs/cifs/smb2misc.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,24 @@ smb2_check_message(char *buf, unsigned int length)
178178
/* Windows 7 server returns 24 bytes more */
179179
if (clc_len + 20 == len && command == SMB2_OPLOCK_BREAK_HE)
180180
return 0;
181-
/* server can return one byte more */
181+
/* server can return one byte more due to implied bcc[0] */
182182
if (clc_len == 4 + len + 1)
183183
return 0;
184+
185+
/*
186+
* MacOS server pads after SMB2.1 write response with 3 bytes
187+
* of junk. Other servers match RFC1001 len to actual
188+
* SMB2/SMB3 frame length (header + smb2 response specific data)
189+
* Log the server error (once), but allow it and continue
190+
* since the frame is parseable.
191+
*/
192+
if (clc_len < 4 /* RFC1001 header size */ + len) {
193+
printk_once(KERN_WARNING
194+
"SMB2 server sent bad RFC1001 len %d not %d\n",
195+
len, clc_len - 4);
196+
return 0;
197+
}
198+
184199
return 1;
185200
}
186201
return 0;

0 commit comments

Comments
 (0)